mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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:
Writing to the TCNT0 Register blocks (removes) the Compare
Match on the following timer clock. Modifying the counter (TCNT0) while the counter is running,
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
12.5.3 Using the Output Compare Unit
 [...] If the value written to TCNT0
   equals the OCR0x value, the compare match will be missed, resulting in incorrect waveform
  generation.
und aus dem Kontext geht hervor, dass das für alle Modes gilt.

Autor: Peter Roth (gelb)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

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.