Forum: Mikrocontroller und Digitale Elektronik Attiny Timer Fast PWM, Compare Match-Wert direkt übernehmen


von Tiny (Gast)


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?

von lionel (Gast)


Lesenswert?

Tiny schrieb:
> Wie kann man diesen Puffer umgehen?

Indem du den unbekannten Tiny in die Mitte des Raumes legst und drum rum 
gehst. Ja, auch unter den Tinys gibt es Unterschiede und man muß den 
genauen Typ wissen um den Platzbedarf abzuschätzen.

von Tiny (Gast)


Lesenswert?

Sorry! Es geht um einen Attiny 10.

von Thomas E. (thomase)


Lesenswert?

Tiny schrieb:
> Sorry! Es geht um einen Attiny 10.

Und warum lässt du den Timer nicht im CTC laufen und erzeugst alle 3 
Kanäle per Software?

mfg.

von lionel (Gast)


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.

von Tiny (Gast)


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!

von Thomas E. (thomase)


Lesenswert?

Tiny schrieb:
> Software UART

Dafür gibt es doch was von PeDa:

Beitrag "Software UART"

Da kannst du auch davon ausgehen, dass das funktioniert. Wenn nicht, 
machst du was falsch.

mfg.

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.