www.mikrocontroller.net

Forum: Compiler & IDEs AVR: wie Timerzugriff sichern?


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:
Der Capture-Interrupt liest das ICR1 aus und das Main will nen PWM-Wert 
nach OCR1B schreiben. Beides geht über das selbe temporäre 
High-Register, also kanns krachen (PWM spinnt).


Was ist besser, im Timerinterrupt das High-Register zu sichern oder im 
Main alle 16-Bit Timerzugriffe atomar zu kapseln?

Im Interrupt hat man das nur an wenigen Stellen, im Main können viele 
verschiedene Zugriffe stehen. Also erscheint im Interrupt sicherer, aber 
es wird wohl mehr CPU-Zeit verbrauchen.


Peter

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne die AVR Architektur nicht, deshalb kann ich nicht sagen, 
inwieweit folgendes damit Sinn macht:

Wie wäre es die PWM über einen Interrupt nachzustellen der 
beispielsweise an einem fixen Punkt in der PWM Periode ausgelöst wird 
(z.B. Compare mit PWM-Zählregister). In der main() Funktion beschreibt 
man dann eine volatile Variable, welche im Interrupt in das Register 
übertragen wird. Dieser Interrupt muss dann eine höhere Priorität haben 
als der Capture-Interrupt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:

> Was ist besser, im Timerinterrupt das High-Register zu sichern oder im
> Main alle 16-Bit Timerzugriffe atomar zu kapseln?

Gute Frage. Denk jetzt schon eine Weile darüber nach.

> Im Interrupt hat man das nur an wenigen Stellen, im Main können viele
> verschiedene Zugriffe stehen. Also erscheint im Interrupt sicherer, aber
> es wird wohl mehr CPU-Zeit verbrauchen.

Die Frage ist aber auch, ob dieser höhere Verbrauch großartig zu Buche 
schlägt.

Aber im Grunde kann man doch die 16-Bit Register auch als eine Art 
16-Bit Variable ansehen. Es gelten daher dieselben Regeln, die auch für 
normale 16-Bit Variablen gelten: atomaren Zugriff sicherstellen

Von daher würde ich mich wohl eher für die Variante mit Absicherung im 
main() entscheiden

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Von daher würde ich mich wohl eher für die Variante mit Absicherung im
> main() entscheiden

Ich werds so machen. Das ist dann auch eindeutiger als im Interrupt und 
entspricht den Anmerkungen im Datenblatt.

Mit diesem "halb-atomaren" Timerzugriff hat sich Atmel wirklich nicht 
mit Ruhm bekleckert. Die paar gesparten Transistoren kosten doch nix.


Peter

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.