Forum: Mikrocontroller und Digitale Elektronik AVR: OCR0A = TCNT0; => Interrupt?


von Bernd (Gast)


Lesenswert?

Hallo zusammen,

wollte mal fragen, ob ein Compare-Match "erkannt" wird, wenn man manuell 
das Compare-Register mit dem zugehörigen Zählerstand beschreibt.
Also wird unmittelbar nach
OCR0A = TCNT0;
ein Interrupt ausgeführt (vorausgesetzt natürlich OCR0A ist NICHT 
double-buffered, und der Interrupt ist "freigeschaltet")?

Vielen Dank
Bernd

von Hc Z. (mizch)


Lesenswert?

Würdest Du bitte angeben, von welchem µC Du redest?  Dass es ein AVR 
ist, ist anzunehmen.  Beim 88/168/328P findet sich im Datenblatt unter 
TCNT0:
1
Writing to the TCNT0 Register blocks (removes) the Compare
2
Match on the following timer clock. Modifying the counter (TCNT0) while the counter is running,
3
introduces a risk of missing a Compare Match between TCNT0 and the OCR0x Registers.
Es klappt bei diesem Typ also nicht - jedenfalls nicht bei Timer 0.  Für 
die anderen darfst Du selbst nachsehen.  Ist ja nicht groß, der Absatz 
zu TCNT in der Registerbeschreibung.

EDIT:  Es findet sich sogar genau die Antwort auf Deine Frage im 
besagten Datenblatt, nämlich
1
12.5.3 Using the Output Compare Unit
2
 [...] If the value written to TCNT0
3
   equals the OCR0x value, the compare match will be missed, resulting in incorrect waveform
4
  generation.
und aus dem Kontext geht hervor, dass das für alle Modes gilt.

von Peter R. (gelb)


Lesenswert?

Hc Zimmerer schrieb:
> Es findet sich sogar genau die Antwort auf Deine Frage
> [...] If the value written to TCNT0

Das war eben nicht die Frage, sondern es soll umgekehrt OCR0A mit dem 
Zählerstand beschrieben werden.

Im Datenblatt kann ich dazu nichts finden, aber ohne Double Buffering 
(also im CTC-Modus) sollte das funktionieren.

Grüße, Peter

von Hc Z. (mizch)


Lesenswert?

Stimmt, Du hattest die andere Richtung gefragt.  Ja, da sollte es gehen. 
Der Interrupt kommt allerdings nicht unmittelbar beim Compare Match, 
sondern beim nächsten Timer-Takt (also wenn der Timer 1 weiter ist).

von Stefan E. (sternst)


Lesenswert?

Funktioniert aber höchstens dann, wenn der Prescaler groß genug ist.

Was ist denn der Sinn dahinter? Wenn du einfach nur den Interrupt-Code 
"von Hand" ausgeführt haben möchtest, geht das auch einfacher.

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.