PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Problem AtMega64



pandadriver
09.12.2006, 21:10
Hallo

Ich möchte den Timer1 beim AtMega 64 als PWM-Generator nutzen. Dazu habe ich folgendes Programm geschrieben:


include <avr/io.h>
#include <avr/iom64.h>

int main(void)
{
TCCR1A = 0xFD; //Timer1 mit PWM Initialisieren
TCCR1B = 0x43; // invertierte PWM, Teiler/64

OCR1AL = 0xff;
OCR1BL = 0x80;

while (1);
}


Aber die Pins PB5 und PB6 sind immer low. mit dem Oszilloskop kann ich nichts messen. Ist das Programm fehlerhaft?

Danke und gruss
panda...

linux_80
10.12.2006, 02:16
Hi,

auf Ausgang müssen die Ports aber nomalerweise auch gestellt werden, sonst geht nix raus aus dem Ausgang. ;-)

Und dann grober Fehler, bei einem 16-Bit Register müssen immer beide Teile beschrieben werden, sonst gibts Chaos,
wichtig ist auch die Reihenfolge, oder man Spricht gleich den 16Bit-Namen an (zB. OCR1A), dann macht der Compiler das für einen das aufteilen in 2 Bytes (High- LowRegister) und die richtige Reihenfolge !

pandadriver
10.12.2006, 04:03
Wie konnte ich das mit dem Ausgang nur vergessen.... logisch, jetzt funktionierts. Danke!

Aber es reicht doch, wenn ich nur die tieferen 8 Bits des Registers beschreibe, denn zu Beginn wird das Register laut Datenblatt mit 0 initialisiert.

linux_80
10.12.2006, 12:57
Reicht eben nicht, egal mit was es initialisiert wird, denn der Controller will beide Bytes haben !
Deswegen ist es auch wichtig wierum man das High- und Low-Register anspricht beim lesen und beim beschreiben !

Nachzulesen hier:
http://www.atmel.com/dyn/resources/prod_documents/DOC1493.PDF

pandadriver
10.12.2006, 15:28
Ach so, beim Schreiben des Low-Register beschreibt er gleichzeitig auch das High-Register aus einem Zwischenspeicher. Alles klar, Danke!