www.mikrocontroller.net

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


Autor: Joerg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
TCCR1A  = (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);

//OCR1A = 0x4704; // Top Value
//OCR1B = OCR1A;

OCR1A = OCR1B = 0xFFFF;

TCCR1B  = (1<<WGM13) | (1<<WGM12);
TCCR1B   |=  0x01;

Autor: Joerg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Original C-Code sieht so aus:
TCCR1A  = (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10); //0xC3

OCR1A = 0x4704;
OCR1B = OCR1A;

TCCR1B  = (1<<WGM13) | (1<<WGM12); //0x0A
TCCR1B   |=  0x01;

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kompilierbaren und simulierbaren Quellcode hast du keinen, nur diesen 
Codefetzen?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Joerg (Gast)
Datum:

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

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.