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
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.
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.