Hallo Hermann,
ich verfolge den thread auch schon einige Tage. Ich denke, eine richtige Entprellung wie für prellende Tasten ist bei Dir nicht nötig. Sobald eine Lichtschranke von einem Auto getriggert wurde, könnte schon eine Runde gezählt werden. Wegen der Lücken im Auto dann einfach die Zählung der entsprechenden Spur für eine notwendige Zeit unterbinden um die Mehrfachzählung bei einer Durchfahrt zu verhindern.
Das hast Du ja im Prinzip mit der Prellzeit etc. schon verwirklicht.
Ich schlage dazu, ich nenne es mal "Monoflop" vor:
Programm:
Der Timer 0 erzeugt alle etwa 10ms einen compare0a Interrupt
In der Interruptserviceroutine wird der Ablauf der Monoflops realisiert.
In der Hauptschleife werden die Lichtschranken abgefragt. (bei Autodurchfahrt werden sie "0")
Ist eine Lichtschranke "0" und das entsprechende Monoflop = "0" wird die Runde gezählt und die Monoflop Zeit "aufgezogen"
Der Timer0 hat nach der Ablaufzeit das Monoflop wieder scharf geschaltet. Das Auto ist durch, die Lichtschranke auf "1" und somit bereit für die nächste Durchfahrt.
Code:$regfile = "ATtiny44.DAT" $framesize = 24 $swstack = 20 $hwstack = 34 $crystal = 8000000 const deadtime = 100 '100 * 10ms of copmare0a interrupt opto_1 alias pina.1 'light barrier track 1 opto_2 alias pina.2 'light barrier track 2 porta.1 = 1 'pullup opto_1 porta.2 = 1 'pullup opto_2 ocr0a = 78 config timer0 = timer , prescale = 1024 , CLEAR_TIMER = 1 'about 10 milliseconds compare0A interrupt on compare0a isr_deadtime enable COMPARE0A enable interrupts dim monoflop_1 as byte dim monoflop_2 as byte dim round_1 as byte 'round counter dim round_2 as byte 'round counter do if opto_1 = 0 and monoflop_1 = 0 then incr round_1 monoflop_1 = deadtime endif if opto_2 = 0 and monoflop_2 = 0 then incr round_2 monoflop_2 = deadtime endif loop isr_deadtime: if monoflop_1 > 0 then decr monoflop_1 if monoflop_2 > 0 then decr monoflop_2 return end 'end program
Gruß
Searcher







Hoffentlich liegt das Ziel auch am Weg
Zitieren

Lesezeichen