Attiny Timer Fast PWM, Compare Match-Wert direkt übernehmen

Gast #3982968
Lesenswert?

Gute Abend,
ich möchte ein Software-UART auf einem Attiny programmieren.
Der (einzige) Timer 0 läuft im 10 Bit Fast PWM Modus, Compare Match A 
erzeugt ein PWM Signal. Compare Match B soll einen Interrupt auslösen.

In der ISR setze ich das Compare-Register auf einen neuen Wert um die 
Bitzeiten zu erzeugen.
1
//Timer-Init in der Main:
2
TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
3
TCCR0B = (1<<WGM02) | (1<<CS01) | (1<<CS00);
4

5

6
ISR(TIM0_OVF_vect){
7
   OCR0B += 100; //Nächsten Interrupt in 100 Timer-Ticks
8
}

Das funktioniert so nicht, der neue Wert in OCR0B wird erst nach dem 
nächsten Timer-Überlauf übernommen. Von diesem Puffer habe ich 
Datenblatt gelesen, hatte aber angenommen er ist nur für OCR0A aktiv 
(COM0A1 Bit gesetzt).

Wie kann man diesen Puffer umgehen?
Gast #3983067
Lesenswert?

Tiny schrieb:
> Das funktioniert so nicht, der neue Wert in OCR0B wird erst nach dem
> nächsten Timer-Überlauf übernommen. Von diesem Puffer habe ich
> Datenblatt gelesen, hatte aber angenommen er ist nur für OCR0A aktiv
> (COM0A1 Bit gesetzt).
>
> Wie kann man diesen Puffer umgehen?

Die Puffer sind in den PWM-Modi aktiv. Im Normal- oder CTC-Modus werden 
die OCR0A/OCR0B Werte unabhängig vom TCNT0 Stand sofort nach Schreiben 
aktiv.
Gast #3983126
Lesenswert?

Thomas Eckmann schrieb:
> warum lässt du den Timer nicht im CTC laufen

Das muss ich mal ausprobieren. Leider belegt das OCR0A oder ICP0, beide 
wollte ich verwenden.
Wenn ich ICP0 für den Timer verwende, hätte ich immerhin 1/2 
Hardware-PWM über OCR0A (Pin setzen im Overflow-Interrupt, löschen per 
Hardware OCR0A Match).

Die Input Capture Funktion müsste ich per Pin Change Interrupt 
nachbauen.

Oder hast du noch einen Trick auf Lager?
Ich überlege ob man vielleicht ICP0 bzw. Timer-Top und OCR0B verwenden 
könnte um das Software UART einfacher zu realisieren. Dann bekomme ich 
nur keine gleichmäßig PWM mehr, wäre aber auch egal solange der Tastgrad 
stimmt.

lionel schrieb:
> Die Puffer sind in den PWM-Modi aktiv.

Das war mein Fehler, ich dachte sie werden erst (pro Kanal) aktiv wenn 
man den Pin auch als PWM-Ausgang konfiguriert (COM0.. Bits). Mist!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren