einfache compare match frage

Gast #367877
Lesenswert?

Hi,

wenn ein compare match eintrifft und ein compare match interrupt
ausgeloest wird wird dann der timer automatisch wieder auf 0 gesetzt?

Ich denke nicht bin mir aber nicht sicher. Ich denke man muss dann eben
(um immer bis zu einem bestimmten punkt zu zaehlen) den timer in der ISR
manuell wieder 0 setzen und dann wird eben wieder von vorn losgezaehlt
und beim erreichen des wertes wieder in die ISR gesprungen die den
Timer wieder 0 setzt u.s.w.

Stimmt das so?

Andre
Gast #367878
Lesenswert?

Ich vermute mal, Du sprichst von AVRs, auch wenn Du es nicht zugeben
willst;-) Der Timer wird nur dann bei einem Compare-Match
zurückgesetzt, wenn er im CTC-Modus (Clear Timer on Compare match)
läuft! In allen anderen Betriebsarten läuft er weiter. Überleg mal, was
passieren würde, wenn in einer PWM-Betriebsart der Timer beim Compare
zurückgesetzt würde...
Gast #367879
Lesenswert?

...Ach und noch was: Für das, was Du anscheinend machen willst, solltest
Du den Timer natürlich im CTC-Modus betreiben. Das mit dem
"in-der-ISR-Timer-manuell-auf-bestimmten-Wert-setzen" ist nur dann
erforderlich, wenn man seine Zeiten mit einem Overflow erzeugen will.
Und genau deshalb gibts den CTC-Modus, damit man das nicht machen
muss.
Gast #367881
Lesenswert?

Achso noch eine Frage zum Timing:

Wenn ich ausgerechnet habe das ich bis 9216 zaehlen muss damit das
ganze 20ms dauert, was schreibe ich da jetzt in das Compare match
register?

Ich wuerde es so machen 9216-1 also 9215 weil ja ein Takt benoetigt
wird um den Interrupt auszuloesen.

Ich weiss aber nicht wie es mit dem Ruecksetzen des Timers ist. Das
passiert zwar im CTC Mode automatisch aber benoetigt es einen weiteren
Takt? (wahrscheinlich ja weil irgendwann muss das ja gemacht werden)
Wenn ja muesste ich von meinem errechneten Wert also nicht 1 sondern 2
abziehen und wuerde somit auf 9214 kommen.

Bitte um Aufklaerung :)
Gast #367882
Lesenswert?

Das Rücksetzen des Timers erfolgt sofort beim Auftreten des Compare
Match, d.h. Du kannst, wenn Du 9216 Takte zählen willst, auch 9216
eingeben, weil der Timer ja im selben Takt, in dem er das Compare Match
erreicht, schon wieder 0 wird. Wenn also die 9216 erreicht sind, wird
rückgesetzt und die nächste Taktflanke erhöht schon wieder auf 1.

Ich weiß jetzt nicht, was Du unter 'Auslösen des Interrupt'
verstehst, aber vom Auftreten des Ereignisses bis zur Ausführung der
ISR vergehen mindestens 4 Taktzyklen (beim Mega8). In den meisten
Fällen eher mehr...
Gast #367883
Lesenswert?

Also irgendetwas klappt mit dem Timing bei mir nicht.

ich hab einen 3.686411 MHz Quarz
die Frequenz teile ich durch 8 (Prescaler)

wenn ich jetzt aller 20 ms ein match haben will muss ich ja 9216 mal
zaehlen lassen.

Das Programm ist so geschrieben das es beim druecken einer Taste ein
String ueber die UART sendet (bzw beim druecken einer anderen Taste
einen anderen String)
Damit aber nicht beim druecken mehrere von den Strings gesendet werden
moechte ich das es nur aller 500ms moeglich ist diesen String zu
senden.
Das heisst also 25 Interrupts a 20ms.

Wenn ich das ganze aber ausprobiere und meine Uhr daneben halte sieht
man deutlich das der Absatnd zwischen den gesendeten Strings nicht
500ms sind (das haut ungefaehr die ersten 3 mal hin dann sieht man
deutlich das es nicht mehr mit den Sekunden meiner Uhr
uebereinstimmt).

Ich hab mal den Code angehangen vielleicht kann mir ja jemand sagen was
da falsch ist, und warum der String nicht (wie ich es erwarten wuerde)
genau aller 500ms auf die UART gesendet wird.

Danke schonmal

Andre
Angehängte Dateien:
Gast #367885
Lesenswert?

Na fuer 80 Ausgaben (die ja 40 Sekunden brauchen sollten) braucht es ca
41 bis 42 Sekunden mal so grob mit auf die Uhr gucken gemessen.

Es wird aber glaube besser wenn ich nicht 25 sondern nur 24 mal zaehlen
lasse.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren