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

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.