Vielleicht hilft Dir das weiter: Allerdings frage ich den Blinkerhebel nicht per Interrupt ab. Ich habe es nicht getestet, sollte aber wenn nur kleine Fehler enthalten.
edit: Maxzeitgrenze optimiert.Code:'Komfortblinker ' PB1 Ausgang Relais (High-Active) ' PB2 Ausgang Relais (High-Active) ' ' PD2 Eingang Blinkerhebel (Low-Activ)(INT0) ' PD3 Eingang Blinkerhebel (Low-Activ)(INT1) ' PD7 TimeSet (Low-Activ) '---------- uC-Konfig ---------- $regfile = "m8def.dat" 'ATMega8 $crystal = 1000000 'Quarz: 1 MHz $hwstack = 40 $swstack = 40 $framesize = 60 '---------- Port-Konfig ---------- Ddrb = &B11111111 'Port B als Ausgang Portb = &B00000000 'Port C komplett auf 0 setzen Ddrd = &B00000000 'Port D als Eingang Portd = &B11111111 'PullUp´s aktivieren Ql Alias Portb.1 Qr Alias Portb.2 Il Alias Pind.2 Ir Alias Pind.3 Timeset Alias Pind.7 Dim Richtung As Byte Dim Eingangalt As Byte Ila Alias Eingangalt.1 Ira Alias Eingangalt.2 Const Links = 1 Const Rechts = 2 Dim Tickcount As Long Dim Blinkzeit As Long Dim Maxzeit As Long Dim Dum1 As Eram String * 10 'dummy Dim Emaxzeit As Eram Long Config Timer0 = Timer , Prescale = 64 '10ms Takt On Timer0 Timer_irq Const Timervorgabe = 100 Enable Timer0 Enable Interrupts Maxzeit = Emaxzeit If Maxzeit < 1 Then Maxzeit = 300 '3 sekunden End If if Maxzeit > 1200 Then Maxzeit = 300 End If Do If Timeset = 0 Then Gosub Zeitsetzen Goto Sprung End If Gosub Eingang Gosub Zeiten Sprung: Loop End Eingang: If Il <> Ila Then Ila = Il Waitms 50'entprellung If Ila = 0 Then If Richtung = Links Then Richtung = 0 Else Richtung = Links Tickcount = 0 Reset Qr Set Ql End If End If End If If Ir <> Ira Then Ira = Ir Waitms 50'entprellung If Ira = 0 Then If Richtung = Rechts Then Richtung = 0 Else Richtung = Rechts Tickcount = 0 Reset Ql Set Qr End If End If End If If Richtung = 0 Then If Il = 1 Then Reset Ql End If If Ir = 1 Then Reset Qr End If End If Return Zeiten: If Richtung > 0 Then If Tickcount > Maxzeit Then Richtung = 0 End If End If Return Zeitsetzen: If Il <> Ila Then Ila = Il Waitms 25'entprellung If Ila = 0 Then Richtung = Links Tickcount = 0 Reset Qr Set Ql Else Reset Ql Maxzeit = Tickcount Emaxzeit = Maxzeit Richtung = 0 End If End If If Ir <> Ira Then Ira = Ir Waitms 25'entprellung If Ira = 0 Then Richtung = Rechts Tickcount = 0 Reset Ql Set Qr Else Reset Qr Maxzeit = Tickcount Emaxzeit = Maxzeit Richtung = 0 End If End If Return Timer_irq: Timer0 = Timervorgabe Tickcount = Tickcount + 1 If Tickcount = 2147483647 Then Tickcount = 0 'sollte es eigentlich nie zu kommen Return
edit 2: Eingänge entprellt (05.06.08/11:54)







Zitieren

Lesezeichen