Hallo, ich versuche zurzeit als erstes eigenes Programm eine Ampel zu programmieren. Wenn man auf Taster1 drückt sollte die Ampel rot werden und bei Taster2 sollte die Gelbe LED blinken.
Leider passiert das auch schon wenn die Taster nicht gedrückt werden.
Ich hab es jetzt mit Interrupt-Flags und dem Debounce-Befehl probiert, aber es funktioniert beides nicht. Die Subroutinen werden scheinbar zufällig aufgerufen.
Hier habe ich es mit den Interrupt-Flags probiert:
Und hier mit dem Debounce-Befehl:Code:'Ampel mit Fussgängerinterrupt #03.BAS: Immer grün, wenn T1 gedrückt -> 2s gelb, 6s rot/5sec Speaker, 2s gelb, wieder grün ' wenn T2 gedrückt -> gelbe LED blinkt, T2 erneut drücken -> Ampel wird wieder grün 'Hardware: Grüne LED an PD5, gelbe LED an PD6, rote LED an PD7, ' Taster1 an PD2/INT0, Taster2 an PD3/INT1, Speaker an PB0 '--------------------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 3686400 Declare Sub Fussgaenger Declare Sub Ampelaus Dim Var As Byte Ddrd = &B11100000 'PD5..PD7=Ausgang Portd = &B00001100 'PullUps von PD2+3 aktivieren Ddrb = &B00000001 'PB0=Ausgang Mcucr = &B00001010 'INT0 und INT1 auslösebedingung bei H/L Flanke '--------------------------------------------------------------------------- Main: Portd = &B00100000 'Grüne LED Do If Gifr.6 = 1 Then 'Ist das INTF0-Flag gesetzt? Gifr.6 = 1 'INTF0-Flag wieder löschen Call Fussgaenger End If If Gifr.7 = 1 Then 'Ist das INTF1-Flag gesetzt? Gifr.7 = 1 'INTF1-Flag wieder löschen Call Ampelaus End If Loop '---------------------------------------------------------------------------- Sub Fussgaenger: Var = 0 Portd = &B01000000 'Gelbe LED Wait 2 Portd = &B10000000 'Rote LED Wait 1 Fussgruen: Toggle Portb.0 'Speaker invertieren Waitms 1000 '1sec warten Var = Var + 1 If Var < 5 Then 'Insgesamt 5sec warten Goto Fussgruen End If Portd = &B11000000 'Rote und gelbe LED Wait 2 Portd = &B00100000 'Grüne LED End Sub '---------------------------------------------------------------------------- Sub Ampelaus: Portd = &B01000000 'Gelbe LED Wait 2 Portd = &B10000000 'Rote LED Wait 1 Portd = &B00000000 'Erst alle LEDs auschalten Do Toggle Portd.6 'Gelbe LED im Abstand von 0,5sec an- und ausschalten Waitms 500 If Gifr.7 = 1 Then 'Ist das INTF1-Flag gesetzt? Gifr.7 = 1 'INTF1-Flag wieder löschen Goto Ampelan End If ' If Gifr.6 = 1 Then 'Ist das INTF0-Flag gesetzt? ' Gifr.6 = 1 'INTF0 wieder löschen ' Call Fussgaenger ' End If Loop Ampelan: Portd = &B01000000 'Gelbe LED Wait 1 Portd = &B00100000 'Grüne LED End Sub '---------------------------------------------------------------------------- End
Code:'Ampel mit Fußgängerinterrupt - Debounce.BAS: Immer grün, wenn T1 gedrückt -> 2s gelb, ' 6s rot/5sec Speaker, 2s gelb, wieder grün ' wenn T2 gedrückt -> gelbe LED blinkt, ' T2 erneut drücken -> Ampel wird wieder grün 'Hardware: Grüne LED an PD5, gelbe LED an PD6, rote LED an PD7, ' Taster1 an PB4, Taster2 an PB2, Speaker an PB0 '---------------------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 3686400 Dim Var As Byte Ddrd = &B11100000 'PD5..PD7=Ausgang Ddrb = &B00000001 'PB0=Ausgang Portb = &B00010100 'PullUps von PB2+4 aktivieren '---------------------------------------------------------------------------- Main: Portd = &B00100000 'Grüne LED Do Debounce Pinb.2 , 0 , Ampelaus Debounce Pinb.4 , 0 , Fussgaenger Loop '---------------------------------------------------------------------------- Fussgaenger: Var = 0 Portd = &B01000000 'Gelbe LED Wait 2 Portd = &B10000000 'Rote LED Wait 1 Fussgruen: Toggle Portb.0 'Speaker invertieren Waitms 1000 '1sec warten Var = Var + 1 If Var <= 5 Then 'Insgesamt 6sec warten Goto Fussgruen End If Portd = &B11000000 'Rote und gelbe LED Wait 2 Portd = &B00100000 'Grüne LED Return '---------------------------------------------------------------------------- Ampelaus: Portd = &B01000000 'Gelbe LED Wait 2 Gelbblinken: Var = 0 Toggle Portd.6 Langsamblinken: If Var < 10 Then Waitms 50 Debounce Pinb.2 , 0 , Ampelan Debounce Pinb.4 , 0 , Fussgaenger Var = Var + 1 Goto Langsamblinken End If If Var >= 10 Then Goto Gelbblinken End If Ampelan: Portd = &B01000000 'Gelbe LED Wait 1 Portd = &B00100000 'Grüne LED Return '---------------------------------------------------------------------------- End
Danke schonmal und viele Grüße
Fabs
[Edit 23.05.08 12:20]: Code aktualisiert
[Edit 26.05.08 08:15]: Code aktualisiert







Zitieren

Lesezeichen