Hallo,
ich habe ein kleines Timer Problem.
Ich verwende einen Attiny44 mit 8-bit und 16-bit Timer, beide PWM.
Der 16-bit Timer ist bereits voll belegt, sowohl OVF als auch Compare
Match.
Daher bleibt mir nur ein 8-bit für folgende Aufgaben:
- Entprellung alle 10ms, sowie pollen eines Eingangs (auch hier reichen
10ms und kann daher in einem erledigt werden)
- Beim Auftreten eines externen Interrupts, soll genau 1ms später der
Eingang von INT0 erneut geprüft werden
Wie löse ich das ganze am besten? Das Problem ist, dass eben genau ab
Zeitpunkt des externen Interrupts 1ms vergehen muss (+/- ein paar µs
wäre nicht schlimm), jedoch die Entprellung auch im 10ms Rythmus
unabhängig davon erfolgen soll. D.h. das Timer Zählregister TCNT0 darf
durch das Interrupt nicht verändert werden, da sonst die Zeit zum Pollen
nicht mehr stimmt.
Ich habe mir daher überlegt es wie folgt zu machen:
Prozessor 8Mhz, Prescaler 1024, Vorladewert 178. Da erhalte ich alle
10ms ein OVF Int (mit einem Fehler von -16µs, das ist ok).
Zusätzlich berechne ich mir im INT0 ein Compare Match auf 1ms und
aktiviere dort das Compare Match, wie folgt:
1 | if (TCNT0 > 247){ //würde der Timer überlaufen?
|
2 | OCR0A = 178+8; //CM=Vorladewert+8 (entspricht 1ms)
|
3 | }
|
4 | else{ //Timer läuft nicht über
|
5 | OCR0A = TCNT0+8 /CM=Zählerstand+8
|
6 | }
|
7 | TIMSK0 = (1 << OCIE0A);
|
In der ISR des COMPA_vect schalte ich das Compare Int wieder ab und
prüfe den Eingang an INT0.
Kann man das so machen? Gibt es geschicktere Möglichkeiten? Gut, statt
vorzuladen, könnte ich auch ein Compare Match B benutzen...