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:
Code:
Config INT0 = falling
On INT0 Einschalten
Enable INT0
Config INT1 = falling
On INT1 Ausschalten
Enable INT1
Enable Interrupts
In Deiner Hauptschleife lässt Du einfach das Lauflicht laufen:
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
Und in den Interrupts schaltest Du die Anschlüsse C0 - C2 einfach als Ausgänge (LEDs leuchten) oder Eingänge (LEDs leuchten nicht):
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
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:
DDRC = &B00000111 (C0, C1, C2 sind Ausgänge)
Return
Ausschalten:
DDRC = &B00000000 (Alle C-Anschlüsse sind Eingänge)
Return
("&B" heißt: Jetzt kommt ´ne Binärzahl. Für den Compiler nicht ganz unwnichtig )
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!
Lesezeichen