www.mikrocontroller.net

Forum: Compiler & IDEs einfache compare match frage


Autor: Andre Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andre Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Andre Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andre Fischer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie groß sind denn die Abweichungen?

Autor: Andre Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

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

Autor: Andre Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja jetzt klappt es!

Wunderbar, Danke!

Andre

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.