Bascom-Spezialisten

  • Hallo


    Ich hab ja inzwischen gesehen, dass es hier viele Leute im Board gibt, die sich gut mit Bascom auskennen.


    Ich mache gerade meine ersten vorsichtigen Gehversuche mit der Programmierung von µC's mit Bascom, vielleicht könntet Ihr mal einen kurzen Blick auf den Code werfen und statt dem "Bauernweg" Verbesserungen vorschlagen. Ich habe zwei Taster an den Ports B0 und C0 und möchte mit denen das Tastverhältnis von der PWM in Schritten verändern. Das funktioniert auch soweit, ich würde aber gerne wissen, ob man das auch eleganter schreiben kann oder Euch sogra Fehler auffallen. Vielen Dank im Voraus!


  • Wenn du die Taster noch an PD2 und PD3 hängen könntest, dann probiers mal hiermit, das ist etwas eleganter, kann sein, dass du noch was dran flicken musst, habs nicht kompiliert. Haben sich eventuell kleine Fehler eingeschlichen, hab das jetzt nur mal so on-the-fly im editor geschrieben. Wenn nicht, dann nimm deins.




    Achja bevor ichs vergesse, gewöhn dir bitte an sachen in If, schleifen und Funktionen einzurücken, das erleichtert auch das debuggen. Außerdem machen Abstände an logischen Stellen das ganze auch lesbarer.

  • Hallo


    Oha, das schaut natürlich schon viel besser aus 8o


    Ich probier das gleich mal aus, vielen Dank schon mal! Momentan hängt allerdings ein LC-Display an Int0 und Int1...


    Mit dem Einrücken tut mir leid, das war eigentlich alles bereits eingerückt. Ich hatte es einfach aus dem Bascom herauskopiert, jetzt hab ich es oben korrigiert - sorry.

  • Hallo


    Okay, das macht natürlich Sinn erstmal die normalen Pins zu belegen. Die Belegung hatte ich ohne nachzudenken aus einem Schaltplan für das LCD übernommen. Ich werd' die Schaltung morgen mal ändern und hoffen, dass am Montag endlich das STK 500 ankommt, dann brauch ich für sowas nicht mehr so viel hin- und herlöten.


    Vielen Dank und gute Nacht :thumbup:

  • Hallo


    Nach Beseitigung von zwei Tippfehlern hat es nun geklappt, vielen Dank! So schaut der Code jetzt aus:



    Gruß, Mark

  • Aja stimmt, Bascom hat da bei dem IF so seine eigenarten. Hatte gedacht das += würde funktionieren, aber du wusstest ja wie es geht :) Einziger Nachteil dadran ist halt, dass du 255mal drücken musst um das ganze zu ändern, eventuell kann man da noch was am Verhalten des Interrupts ändern, ich mach mich mal schlau.


    Edit:
    So schon was gefunden. Bei Bascom gibt es für Interrupts die Einstellung "Low Level", d.h. der Interrupt wird ausgelöst solange der Pin gegen Masse geschaltet ist, also muss beim Druck auf den Taster Masse am Pin anliegen. Dafür musst du nur die folgenden Codepassagen ändern:


    Code
    'Interrupts 
    Config Int0 = Low Level 
    Config Int1 = Low Level
    Enable Interrupts 'einschalten der Interrupts 
    Enable Int0 
    Enable Int1 
    On Int0 Increase 
    On Int1 Decrease




    Den waitms habe ich noch eingefügt, da er sonst direkt von 255 auf 0 und umgekehrt rasen würde. Je nachdem ob deine Taster aktuell gegen Plus geschaltet sind müsstest du sie dann noch gegen Masse schalten. Ich hatte gehofft es würde auch so etwas wie High Level geben, aber leider nein.

  • Hallo


    Die Taster sind eh gegen Masse geschaltet, die Schaltung funktioniert auch einwandfrei, so, wie ich den Code oben gepostet hatte. Ich hab jetzt mal in der Bascom-Hilfe nach "Low Level" gesucht, aber nix dazu gefunden, Bascom kennt den Befehl auch nicht.

  • Hallo


    Gibt es irgendeine Möglichkeit in Bascom, alle Tastereingänge pauschal abzufragen um z.B. das Programm zu beenden um sich so zahlreiche "if... ...then" bzw. einer "OR"-Kette zu sparen? Ich möchte einfach das Programm beenden können, wenn irgendeine Taste gedrückt wurde.


    Vielen Dank im Voraus!


    Gruß, Mark

  • Man könnte den komplette Bus an dem die Taster hängen abfragen, aber was willst du bezwecken?
    Wenn du mit jedem Taster das Programm beenden möchtest, reicht auch ein einziger Anschluss, an den du mehrere Taster parallel hängst.

  • agree.
    In der Theorie (ich weiß dass es bei C geht, bei Bascom bin ich mir nicht sicher inwieweit er da mitspielt) hat der AVR ein sogennantes PCICR (Pin Change Interrupt Control Register) in dem du alle Ports als Interrupts eintragen kannst. Das ganze funktioniert aber nicht wie ein normaler Interrupt, sondern der Interrupt wird standardmäßig bei jedem Pin am Port ausgelöst. Über das PCMSK3:0 (Pin Change Mask Register 3-0) kannst du dann die einzelnen Pins masken, also bei welchen genau du einen Interrupt auslösen willst. Allerdings unterscheidet er dann immernoch nicht zwischen den einzelnen Pins sondern sagt einfach nur: an den ungemaskten Eingängen an PortX wurde ein Interrupt ausgelöst, ich springe jetzt in die ISR. In dieser ISR fragt man dann gewöhnlich die ganzen Pins ab, bei welchem denn nun grade ein Interrupt anliegt. So würde ich das in C lösen, wie gesagt weiß ich nicht ob das in Bascom geht.
    Mein Vorschlag für Bascom wäre folgender:
    Du hast z.b. alle Pins mit einem Pullupwiderstand gegen Masse geschaltet, der Taste hängt gegen VCC. D.h. standardmäßig ist der ganze Port 0. Nun liest du den ganzen Port aus und fragst ob er größer ist als 0


    Code
    temp = PORTC
    If temp > 0 Then
    	' Führe aus, wenn einer der Taster an PORTC gedrückt wurde, egal welcher
    End If


    Wenn die Taster gegen Masse hängen läuft das natürlich genau andersrum ab, denn standardmäßig ist jeder Pin 1, also hat der ganze Port den Wert 255


    Code
    temp = PORTC
     If temp < 255 Then
     	' Führe aus, wenn einer der Taster an PORTC gedrückt wurde, egal welcher
     End If



    Hoffe ich konnte ein wenig helfen.


    MfG Fightclub

  • Hallo


    Vielen Dank für die Antworten!


    Man könnte den komplette Bus an dem die Taster hängen abfragen, aber was willst du bezwecken?
    Wenn du mit jedem Taster das Programm beenden möchtest, reicht auch ein einziger Anschluss, an den du mehrere Taster parallel hängst.


    Ich habe insgesamt 8 Taster und ein LCD an einem Mega8 hängen. Drei Taster dienen zur Umschaltung zwischen Modis (persönlich wäre mir auch ein Modetaster lieber gewesen :thumbdown: ) und fünf Taster dienen zur Zeiteinstellung. Ich wähle also vor dem Programmstart einen Modus aus (ansonsten Mode 0) und starte das Programm dann durch Auswahl eines Zeittasters. Ich habe also keinen speziellen Taster für Start/Stop.



    Du hilfst mir immer, so oder so :thumbup:


    In diesem Fall, ist das zwar leider nicht möglich, da, wie Du Dir sicherlich vorstellen kannst, bei der Anzahl an belegten Pins nicht alle auf einem Port liegen. Trotzdem habe ich mir den Schnipsel notiert und probier das bei Gelegenheit aus!


    Wie gesagt, ich weiß dass es mit Sicherheit geschicktere Wege gibt, mit wenigen, sinnvollen Tastern das gleiche Ergebnis zu erzielen, aber leider muss ich mich an die Vorgaben halten :pinch:



    Tut mir Leid, dass ich so viele Kleinigkeiten frage, aber zwischen "es läuft irgendwie" und "das ist sauber programmiert", liegen ja bekanntlich Welten und ich möchte es gleich von Anfang an so sauber programmieren, wie es mir als Anfänger halt möglich ist. Als ich mir den Code von synvox's MoodPILL angesehen habe, wusste ich, wo der Hammer hängt - sehr geil... [Blockierte Grafik: http://www.bastelrun.de/smilies/headshot.gif]


    Gruß, Mark

  • In diesem Fall, ist das zwar leider nicht möglich, da, wie Du Dir sicherlich vorstellen kannst, bei der Anzahl an belegten Pins nicht alle auf einem Port liegen. Trotzdem habe ich mir den Schnipsel notiert und probier das bei Gelegenheit aus!

    Auch kein Problem. Du filterst einfach die Pins raus, die du haben willst. Wenn du jetzt an Port C z.b. nur die Pins 0:3 belegt hast kannst du den Port mit 0b00001111 bitweise verunden (AND). damit werden die ersten 4 bit immer 0 und die zweiten 4 bit nehmen genau den Zustand an, der an den Pins 0-3 liegt. Jetzt kannst du einfach wie oben abfragen ob die Variable größer als 0 ist bzw kleiner als 15. In deinem Fall musst du die Zahl mit der du verundest natürlich noch anpassen.


    Viele Grüße
    Fightclub