Da ist ein Problem mit der Berücksichtigung der Überläufe von Timer 0. Einfacher wäre es man würde Timer1 nehmen, da könnte man sich das Problem sparen. Im Idealfall würde man die ISP Funktion nutzen und hätte die Zeitmessung fast komplett durch die Hardware erledigt.
Wenn es unbedingt mit timer 0 sein soll, hat man eine Schwierigkeit, wenn der Timer overflow und der externe Interrupt fast gleichzeitig auftreten. Da ist schon etwas Code in der ISR der wohl versuchen soll, das Problem zu behandeln, allerdings ist der Teil an der Falschen stelle und nur halb richtig. Das Problem ist, dass ggf. die Overfow ISR noch aussteht, also eine Überlauf zu wenig gezählt wurde. Erkennen kann man das am Interrupt-flag in Kombination mit dem Timer Wert:
If Tifr0.tov0 = 1 reicht dabei noch nicht, es muss außerdem der Timer-wert klein (z.B. < 100 sein). Ohne Vorteiler wird es mit den Zeiten aber auch schon recht knapp. Die Overflow ISR wird schon fast 50% der gesamten Rechenzeit verbrauchen.
Nachtrag: Wärend die Überlauf ISR läuft, kann nicht auf den anderen Interrupt reagiert werden. Entsprechend die Werte kurz nach dem Überlauf nicht möglich. Leider braucht auch die einfache ISR in Bascom schon gut 100 Zyklen. Mit Inline ASM könnte man da noch etwas raushohlen, aber im Prinzip bleibt die kleine Lücke.
Lesezeichen