Forum: Mikrocontroller und Digitale Elektronik ATMega168: Schreiben von OCR1A in Fast-PWM


von Joerg (Gast)


Lesenswert?

Hallo und guten Morgen,

irgendwie stehe ich voll auf dem Schlauch. Es geht um einen ATMega168. 
Timer 1 möchte ich im Fast PWM Mode verwenden und OCR1A als Top (Wave 
Generation Mode 15). Schreibe ich nun den Wert 0x4704 ins OCR1A, so wird 
allerdings nur 0x0304 reingeschrieben. Bei 0xFFFF ist es 0x03FF. Die 
ersten 6-bit lassen sich nicht setzen. Im Disassembler sieht alles okay 
aus.
Ein Test im CTC Modus hat gezeigt, das die Bits sich beschreiben lassen. 
Es liegt also kein Defekt vor.
Im Handbuch finde ich keinen Hinweis, das im Fast-PWM-Modus mit OCR1A 
als Top
nur 10 bit verwendet werden können.
Habt ihr ne Idee oder habe ich was übersehen?

Danke schon mal
Gruß
Jörg

P.S.: Habe probiert zuerst OCR1B zu beschreiben und dann zu kopieren. 
OCR1B zeigt das gleich Problem wie OCR1A.

P.P.S.: Ich möchte gerne eine Spule über ne PWM mit variabler Frequenz 
und variablem Duty-Cycle ansteuern. Die variable Frequenz ist eigentlich 
nur zum Erzeugen unterschiedlicher "Töne" da.
1
TCCR1A  = (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
2
3
//OCR1A = 0x4704; // Top Value
4
//OCR1B = OCR1A;
5
6
OCR1A = OCR1B = 0xFFFF;
7
8
TCCR1B  = (1<<WGM13) | (1<<WGM12);
9
TCCR1B   |=  0x01;

von Joerg (Gast)


Lesenswert?

Der Original C-Code sieht so aus:
1
TCCR1A  = (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10); //0xC3
2
3
OCR1A = 0x4704;
4
OCR1B = OCR1A;
5
6
TCCR1B  = (1<<WGM13) | (1<<WGM12); //0x0A
7
TCCR1B   |=  0x01;

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Kompilierbaren und simulierbaren Quellcode hast du keinen, nur diesen 
Codefetzen?

von Stefan E. (sternst)


Lesenswert?

Die Reihenfolge, in der du die Register beschreibst, ist Unsinn und 
sorgt für dieses verwirrende Verhalten. Du verlierst diese 6 Bits, weil 
in dem Augenblick, in dem du OCR1A beschreibst, der Timer auf "PWM, 
Phase Correct, 10-bit" eingestellt ist.

von Joerg (Gast)


Lesenswert?

Hallo zusammen,

Stefan Ernst hat recht. Nachdem ich die Reihenfolge geändert habe funzt 
es.

Die Reihenfolge ist "historisch" gewachsen, da ich zunächst eine 
10-bit-Phase Correct-PWM verwendet habe. Habe dann nur noch die Zeile 
hinzugefügt, die mir die Bits WGM13 und WGM12 setzt und wollte OCR1A und 
OCR1B entsprechend anpassen.

Danke nochmals

Gruß und schönen Tag
Jörg

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.