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
Lesezeichen