PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 32 - PWM an OC0 will nicht



Amazz
31.10.2009, 20:15
Hi leute, hab en kleines Problem mit den PWMs :-)
Ich brauch 4 PWM Ausgänge, hab alle zum laufen bekommen, nur der an OC0 nicht. vielleicht kann mir ja jemand helfen.

Hier der Code:



#include <avr/io.h>

void timer_init(void)
{
DDRD = 0xff; //Ports A,B,D werden als Ausgänge gesetzt
DDRA = 0xff;
DDRB = 0xff;



TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10)|(1<<WGM12);;
TCCR1B = (1<<CS10);
TCCR2 = (1<<CS20)|(1<<WGM20)|(1<<COM21);
TCCR0 = (0<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00);


}


int main (void)
{

timer_init();

OCR1AL = 50;
OCR1BL = 100;
OCR2 = 150;
OCR0 = 200;


while (1);
}


so sieht das ganze dann aufm oszi aus (Kanal 4 wäre OC0):
http://www.m-s-online.com/screenshot-0000.jpg

Gruß Manuel

askazo
01.11.2009, 09:01
Hi,

Du hast ganz einfach den Timer0 noch nicht eingeschaltet.
Nach Deiner Initialisierung sind CS00,CS01 und CS03 immer noch alle auf 0,
damit bekommt der Timer0 keinen Takt und ist somit gestoppt.

Übrigens: Die Operation
...|(0<<CS00)|...
bringt genau gar nichts.
Zum einen stehen diese Bits nach dem Reset des Cotrollers bereits auf null.
Und zum anderen - selbst wenn sie auf 1 stehen würden, kannst Du sie mit dieser Operation nicht auf 0 setzen - 1 oder 0 gibt nämlich immer noch 1...

Gruß,
askazo

Amazz
01.11.2009, 17:42
OK, vielen dank!
Jetzt funktioniert es! Ich hoff jetzt ist auch alles richtig geschrieben!
Hier noch schnell der Code, wie er jetzt aussieht:


#include <avr/io.h>

void timer_init(void)
{
DDRD = 0xff; //Ports A,B,D werden als Ausgänge gesetzt
DDRA = 0xff;
DDRB = 0xff;



TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10)|(1<<WGM12);
TCCR1B = (1<<CS10);
TCCR2 = (1<<CS20)|(1<<WGM20)|(1<<COM21);
TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<CS00);
TCCR0 &=~((1<<WGM01)|(1<<COM00)|(1<<CS01)|(1<<CS01));
}


int main (void) {

timer_init();

OCR1AL = 50;
OCR1BL = 100;
OCR2 = 150;
OCR0 = 200;


while (1);
}


Und das Beweisbild ;-)
http://www.m-s-online.com/screenshot-0001.jpg

Gruß Manuel

askazo
01.11.2009, 19:50
Hi,
sieht doch soweit ganz gut aus.
Ich Frage mich nur, warum Du das TCCR0-Register so komisch einstellst. Statt
TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<CS00);
TCCR0 &=~((1<<WGM01)|(1<<COM00)|(1<<CS01)|(1<<CS01)); kannst Du besser einfach nur
TCCR0 = (1<<WGM00)|(1<<COM01)|(1<<CS00); schreiben. Wie schon geschrieben - das Register wird sowieso mit 0 initialisiert, die Nullen brauchst Du also nicht zu setzen. Und bei den anderen Registern machst Du's doch auch so...

Gruß,
askazo

Amazz
02.11.2009, 17:03
stimmt, geb dir recht!
danke.

gruß