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