AVR-GCC: schnelle(re)s PWM mit ISR_NAKED?

OP (Firma: Brainit GmbH) #3024214
Lesenswert?
• ▲
▼
Hallo zusammen,

ich hab mich wieder mal selbst überlistet und die falschen PWM-Pins 
gelayoutet (die von Timer1, ich brauch aber Timer2).

Dann halt zu Fuss, ist ja keine Krise: Es werden zwei PWM-Signale 
verwendet, in der ISR(TIMER2_OVF_vect) beide Bits einschalten, und in 
der jeweiligen ISR(TIMER2_COMPx_vect) das Bit wieder ausschalten. 
Funktioniert soweit gut.

Nun hab ich gesehen dass der Pro- und Epilog durchaus länglich sind, und 
der "eigentliche" Code nur zwei sbi bzw. je ein cbi.

Sowas sollte doch gefahrlos mit ISR_NAKED verbesserbar sein?

- da keine Register verwendet werden, müsste ich auch keine sichern?

- muss ich das SREG sichern? ich denke nicht...

- des Risikos, dass es bei einer Erweiterung der ISR in die Hose gehen 
kann, bin ich mir bewusst.


Danke schon mal, Michi
OP (Firma: Brainit GmbH) #3024307
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Michael Reinelt schrieb:
>> Nun hab ich gesehen dass der Pro- und Epilog durchaus länglich sind
>
> Das stört aber erst, wenn es keinerlei andere Interrupthandler gibt.

Ähhh... wie meinst du das?

Timer2 wäre exklusiv für PWM. Damit sind nach meinem Verständnis auch 
die beiden Interrupt-Handler (Overflow und Output-Compare) exklusiv. Und 
jede ISR kriegt ja ihren eigenen Pro-/Epilog, zumindest les ich das so 
aus dem erzeugten Assembler-Code.
OP (Firma: Brainit GmbH) #3024321
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Michael Reinelt schrieb:
>> Ähhh... wie meinst du das?
>
> Der maximale Jitter hängt von dem längsten Interrupthandler überhaupt
> ab. Denn der muß ja erst beendet werden.

Ahja, verstehe. Allerdings sind die anderen Interrupts eher seltener, 
dieses PWM sollte so schnell (im Sinne von hoher Frequenz) wie möglich 
laufen. Idealerweise mit Prescaler 1, was ja "hardware-mäßig" kein 
Problem gewesen wäre, mit "Halb-Soft-PWM" aber schon. Wenigstens 
Prescaler 8 hätt ich gern verwendet, und da möchte ich auch nur ungern 
~10 Takte verschenken, wenns nicht sein muss.
Gast #3024673
Lesenswert?
• ▲
▼
wenn wirklich nur SBI / CBI benutzt werden kann man auch gut und gerne 
ISR_naked nutzen. Zur Sicherheit wäre es dann besser den Code auch als 
Inline ASM zu schreiben, und nicht darauf zu vertrauen das der Compiler 
wirklich CBI / SBI nutzt.

Unabhängig davon muss man noch aufpassen bei PWM Werten an einem Ende. 
Wenn die beiden Interrupt Flags fast gleichzeitig gesetzt werden, so 
dass beide Interrupts gleichzeitig auf Ausführung warten, geht die 
Reihenfolge nach dem Interruptvektor, nicht nach der Reihenfolge in der 
die Falgs gesetzt wurden.  PWM Werte von 0,1 oder 254/255 sind deshalb 
ggf. Tabu oder müssten anders gelöst werden.
#3024689
Lesenswert?
• ▲
▼
@  Michael Reinelt (fisa)

>ich hab mich wieder mal selbst überlistet und die falschen PWM-Pins
>gelayoutet (die von Timer1, ich brauch aber Timer2).

Dann nimm das Teppichmesser/Skalpell/Dremel, trenn die Verbindung und 
zieh Klingeldraht. Dauert 5 min und erspart sinnlosen 
Software-Workaround.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.