Fast...
Bis auf 2 Stellen:
1.: Nach der Sequenz
Code:
Impulsdauer(n) = Timer0
N = N + 1
musst Du unbedingt beide Timer auf Null setzen - sonst zählen sie einfach von ihrem Zwischenstand weiter, und Du bekommst nicht nur falsche Impulslängen-Ergebnisse, sondern auch vermeintliche Synchronisationsimpulse, wo eigentlich gar keine waren.
2.: Wenn Du Timer 1 mit 65496 vorlädst, läuft er schon nach 40 Takten über. Bei 16 MHz und einem Prescaler von 1 wäre das nach 2,5 Mikrosekunden. Da er aber erst nach 2,5 Millisekunden überlaufen soll, muss er bis 40.000 zählen, also von einem Ausgangswert von etwa 25000 starten.
Ganz allgemein könntest Du (bei positivem Synchronisationssignal) mit einem Timer auskommen: Wenn er vor dem Überlauf angehalten wird (d.h. Impuls kleiner als 2,5ms) wertest Du den Zählerstand als Impulslänge aus, und wenn er überläuft (Impuls länger als 2,5ms) wird das als Synchronisationsimpuls gewertet (und N=1 gesetzt). Aber das ist halt eine Frage des Umgangs mit Ressourcen
Und es ist etwas uneffektiv, den wesentlich höher auflösenden 16-Bit-Timer 1 für so etwas "grobes" zu verwenden wie die Entscheidung, ob der Impuls länger als 2,5ms ist, während die Impulslänge selbst von dem wesentlich ungenauer auflösenden 8-Bit-Timer gemessen wird. Aber auch das ist eine Frage der "B-Note" - funktionieren sollte Dein Code mit den genannten Änderungen trotzdem!
Lesezeichen