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.
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: Maxzeitgrenze optimiert.
edit 2: Eingänge entprellt (05.06.08/11:54)
Lesezeichen