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:
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
Und hier mit dem Debounce-Befehl:
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
Lesezeichen