Also, für den Anfang schon mal ganz gut!
Was würde bei diesem Code passieren?
Wenn PIND.2 High ist, läuft die 3-Sekunden-Hauptschleife an. Übrigens: Statt eine Integer-Variable zu definieren, kannst Du auch schreiben waitms 1000 oder wait 1, beides führt zu 1 Sekunde Verzögerung.
Also - die Hauptschleife läuft - und jetzt kommt der Interrupt:
Alle LEDs werden ausgeschaltet - das Programm springt anschließend aber genau wieder an die Stelle, an der es unterbrochen wurde, d.h. Deine Hauptschleife läuft weiter! Und das soll ja nicht der Fall sein, wenn ich Dich richtig verstanden habe - das Lauflicht soll doch erst wieder anlaufen, wenn der andere Taster gedrückt wurde, oder?
Die Fragestelung klingt ja schon so, als wenn Ihr mit zwei (!) Interrupts arbeiten solltet. Was hältst Du also von folgender Lösung:
Du definierst zwei Interrupts:
In Deiner Hauptschleife lässt Du einfach das Lauflicht laufen:Code:Config INT0 = falling On INT0 Einschalten Enable INT0 Config INT1 = falling On INT1 Ausschalten Enable INT1 Enable Interrupts
Und in den Interrupts schaltest Du die Anschlüsse C0 - C2 einfach als Ausgänge (LEDs leuchten) oder Eingänge (LEDs leuchten nicht):Code:Do PORTC.0=1 wait 1 PORTC.0=0 PORTC.1=1 wait 1 PORTC.1=0 PORTC.2=1 wait 1 PORTC.2=0 Loop
Mit weniger Schreibarbeit ginge es auch, wenn Du direkt das Register manipulierst, in dem festgelegt wird, ob die Anschlüsse als Ein- oder Ausgänge konfiguriert sein sollen - das sogenannte "DDR"-Register (Data Direction Register):Code:Einschalten: Config PORTC.0 = Output Config PORTC.1 = Output Config PORTC.2 = Output Return Ausschalten: Config PORTC.0 = Input Config PORTC.1 = Input Config PORTC.2 = Input Return
("&B" heißt: Jetzt kommt ´ne Binärzahl. Für den Compiler nicht ganz unwnichtigCode:Einschalten: DDRC = &B00000111 (C0, C1, C2 sind Ausgänge) Return Ausschalten: DDRC = &B00000000 (Alle C-Anschlüsse sind Eingänge) Return)
Noch zwei allgemeine Dinge:
Bist Du sicher, dass der Taster den Eingang auf High zieht? Mikrocontroller haben nämlich eingebaute Pull-Up-Widerstände, die (wenn sie aktiv sind) den Pin auf ein sauberes High ziehen - deshalb ist es oft sinnvoll, Taster nach Masse zu legen und den Tastendruck mit der Abfrage eines "LOW" zu realisieren. Deshalb hast Du Deinen Interrupt ja auch auf "fallling" konfiguriert.
In diesem Zusammenhang empfiehlt es sich, die PullUp-Widerstände der Eingangspins auch wirklich zu aktivieren: Für die INT0 und INT1-Eingänge (D.2 und D.3) geht das, indem Du die entsprechenden PORT-Bits auf 1 setzt:
PORTD.2 = 1
PORTD.3 = 1
2. Auf vielen Boards sind die LEDs nicht zwischen den Controller und Masse geschaltet, sondern zwischen + und den Controller. D.h. sie gehen an, wenn der Pin LOW ist, und aus, wenn der Pin HIGH ist. Das müsstest Du natürlich berücksichtigen!
Ich hoffe, Dir ein wenig weitergeholfen zu haben...
Gutes Gelingen!







Zitieren

Lesezeichen