Es gäbe noch weitere Verbesserungen, die man implementieren könnte.
Wenn in der Hauptschleife die Lichtschranken abgefragt werden, könnte es passieren, daß ein Auto mal nicht erfaßt wird. Das ist abhängig von der Laufzeit der Hauptschleife. Je länger die läuft, desto wahrscheinlicher ist es, daß ein Auto durchrutscht, ohne daß die Lichtschrankenabfrage gerade dran ist.
Könnte man zB mit Interrupts verhindern. Ich würde PCINT0 und PCINT1 dafür hernehmen. Da diese aber einmal von allen Pins des ganzen PortA und zum anderen von allen Pins des PortB ausgelöst werden können, könnte man eine Lichtschranke an den PortB umverkabeln. Das macht den Code kleiner, da man sonst extra Code zur Feststellung des auslösenden Pins eines Ports benötigt. Damit bekommt man auch wieder eine weiter ganz kleine Unsicherheit, da zwischen Interrupt und Pinbestimmung Zeit vergeht.
Wenn also ein PCINT ausgelöst wurde setzt man in der ISR ein Flag und disabled den PCINT. Das Flag wird in der in der Haupschleife abgefragt, bei abgelaufenem Monoflop die Runde gezählt und das Flag zurücksetzt. Nach Ablauf des Monoflops muß das PCINT-Flag gelöscht werden, da durch die Mehfachauslösung der Lichtschranke noch ein Interruptflag stehen könnte, daß dann ungewollt die PCINT ISR nochmal auslöst. Und dann der PCINT wieder freigeben.
So sollte das Risiko einer Fehlzählung ziemlichh minimiert sein.
Gruß
Searcher
Lesezeichen