Forum: Mikrocontroller und Digitale Elektronik Timer und mehrere Aufgaben


von René S. (Gast)


Lesenswert?

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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.