Am elegantesten geht das mit ´nem Interrupt, den Du auf "Change" konfigurierst.
Code:
Config INT0 = Change
Enable INT0
Enable Interrupts
In der ISR startest Du einen Timer bei steigender Flanke, und bei fallender Flanke stoppst Du ihn und setzt ein Flag-Bit. Da so´n RC-Impuls maximal 2,2ms lang ist, darf der Timer in dieser Zeit nicht überlaufen!
Code:
ISR:
If PIND2=1 then
Start TimerX
Else
Stop TimerX
Flag = 1
End if
Return
In der Hauptschleife fragst Du das Flag-Bit ab - und wenn´s 1 ist (dh. Impuls ist fertig) checkst Du den Stand des TimerX. Hat er einen gewissen Wert über- oder unterschritten (je nachdem, ob der Impuls beim bremsen länger oder kürzer wird), schaltest Du Dein Bremslicht ein oder aus.
Code:
If Flag = 1 then
Flag = 0
If TimerX > ... then PORTX.Y=1 else PORTX.Y=0
TimerX=0
End if
Lesezeichen