www.mikrocontroller.net

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


Autor: Jan Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Port B, Pin 1 als Ausgang
DDRB |= (1 << PB1);
// PWM Mode 15 = Fast PWM, nicht invertierter Ausgang auf Pin PB1=OC1A, Prescaler 64
TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM10);
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
// Testsignal
OCR1A = 0xAAAA; // Periodendauer
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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Jan Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.