Forum: Compiler & IDEs einfache compare match frage


von Andre Fischer (Gast)


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

von johnny.m (Gast)


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

von johnny.m (Gast)


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.

von Andre Fischer (Gast)


Lesenswert?

OK ich geb es zu es ist ein ATMEGA8 ;) und ja ein Ruecksetzen in anderen
Modes waere ziemlicher Unsinn.

Hab den Mode auch gefunden. Das stell ich also ueber die WGM Bits des
TCCR ein.

Super Danke :)

von Andre Fischer (Gast)


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 :)

von johnny.m (Gast)


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

von Andre Fischer (Gast)


Angehängte Dateien:

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

von johnny.m (Gast)


Lesenswert?

Wie groß sind denn die Abweichungen?

von Andre Fischer (Gast)


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.

von johnny.m (Gast)


Lesenswert?

Kleiner Tip: Mach mal das Rücksetzen der Zählvariablen vor der Ausgabe
mit uart_puts()...

von Andre Fischer (Gast)


Lesenswert?

Ja jetzt klappt es!

Wunderbar, Danke!

Andre

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.