Forum: Compiler & IDEs AVR: wie Timerzugriff sichern?


von Peter D. (peda)


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

von klaus (Gast)


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.

von Karl H. (kbuchegg)


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

von Peter D. (peda)


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

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.