Forum: Mikrocontroller und Digitale Elektronik AVRMega, GCC: PWM Modus 15: Ausgang bleibt "stumm"


von Jan Schulz (Gast)


Lesenswert?

Hallo,

habe einen AVR Mega und möchte dort ein PWM Signal mit dem 16-Bit Timer 
erzeugen. Wenn ich das Datenblatt richtig verstehe, kann ich mit Modus 
15 mit dem Register OCR1A den oberen Grenzwert (=Periodendauer) 
festlegen, mit ICR1 den Vergleichswert bei dem der Ausgangspin getoggeld 
wird. Damit am Pin OC1A ein Signal erscheint, muss der Pin auf Ausgang 
geschaltet sein.
Interrupts o.ä. benötige ich nicht, d.h. das PWM Signal soll immer 
widerholt werden, wo der Counter aktuell ist, ist meiner Anwendung egal.
Mein Code zur Initialisierung:
1
// Port B, Pin 1 als Ausgang
2
DDRB |= (1 << PB1);
3
// PWM Mode 15 = Fast PWM, nicht invertierter Ausgang auf Pin PB1=OC1A, Prescaler 64
4
TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM10);
5
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
6
// Testsignal
7
OCR1A = 0xAAAA; // Periodendauer
8
ICR1 = 0x2222;  // Toggelwert

Leider kann ich am Pin PB1 jedoch kein toggeln erkennen. Woran liegt 
das?
Habe außerdem Probleme die korrekten Werte des Prescalers und der 
Periodendauer auszurechnen. Mein Quarz hat 14MHz, gewünscht sind 15msec 
Periodendauer, wovon 3msec high sein sollen. Wie geht man da am besten 
vor? Im Datenblatt steht zwar die Formel, aber ich kenne ja nur meine 
gewünschte Frequenz/Periodendauer, aber weder den TOP Wert, noch den 
Prescaler.

Gruß,

Jan

von Michael Wilhelm (Gast)


Lesenswert?

Das ICR ist ein Input Capture Register und hat wohl nichts mit der PWM 
zu tun. Für das Pin-toggeln ist das TCCR1A zusrändig, und zwar die Bits 
COM1A1 und COM1A0. Da stellst du ein, wie der Pin reagieren soll.

MW

von Jan Schulz (Gast)


Lesenswert?

@Michael Wilhelm:
Hmm, wenn ich das Datenblatt richtig verstehe, hängt das von der 
Betriebsart ab. Habe ich das jetzt so falsch verstanden?

Jan

von Thorsten (Gast)


Lesenswert?

Welchen AVR haste denn da am Wickel?

Ansonsten meine ich, dass ICR die Frequenz bestimmt und OCR das 
Tastverhältnis. Das heisst, ICR muss immer großer als OCR sein, sonst 
passiert bei der PWM nicht mehr viel.

Michael hat aber soweit auch Recht, dass du mit den COM Bits den Portpin 
noch mit der PWM verknüpfen musst. Ansonsten passiert auf dem Pin 
garnichts, auch wenn dein Timer richtig läuft.

gruß

von Jan Schulz (Gast)


Lesenswert?

Hallo,

habe bei Roboternetz eine schöne Anleitunge gefunden. Code läuft jetzt 
im Modus 14 (statt 15) und geht einwandfrei:

// Port B, Pin 1 als Ausgang
DDRB |= (1 << PB1);
// Mode 14 = Fast PWM, nicht invertierter Ausgang (OC1A), Prescaler 8)
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11);
ICR1 = 10000;
OCR1A = 1000;

Wenn man "einfach" mittels der WGM Bits auf Modus 15 umstellt, kommt 
nichts mehr am Ausgang. Aber egal, 14 geht auch ;=)

Gruß,

Jan

von Jörg X. (Gast)


Lesenswert?

> Wenn man "einfach" mittels der WGM Bits auf Modus 15 umstellt,
> kommt nichts mehr am Ausgang.

logisch, dann musst du mindestens die Werte für ICR1 und OCR1x tauschen 
;) scnr

ABer auch wenn es einigen unlogisch vorkommt: im Mode 15 wird der TOP 
Wert mit dem OCR-Register und der Compare-Wert mit dem ICR-Register 
eingestellt. Das ICR Register ist ungepuffter: wenn da rein geschireben 
wird ändert sich direkt das Verhalten des Timers, der Inhalt des 
OCR-Registers wird erst beim nächsten 'Überlauf' vom Timer übernommen

hth. 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.