PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Timer0



blackpirate
18.10.2007, 19:56
Hallo,
bin jetzt echt schon langsam verzweifelt. Möchte bei einem mega164p einen Pwm über den Timer 0 erzeugen. Es kommt aber einfach gar nichts auf den zwei PWM Pins (B3 u. 4).
Hab auch schon probiert einfach nur Leds über diese Ports anzusteuern (funktioniert) um sicher zu gehen das nicht die Ports kaputt sind.
Weiß irgendwer woran das liegen könnte? Habe ich einen Fehler in meinem Programm?


#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

#define F_CPU 20000000L // clock

int main (void)
{

DDRB |= (1<<PB3) | (1<<PB4); // PWM Port set ouput


TCCR0A |= (1<<COM0A1) | (1<<COM0A0) | // set OCC0A on compare match, clear at bottom
(1<<COM0B1) | (1<<COM0B0) | // set OCC0B on compare match, clear at bottom
(1<<WGM00) | (1<<WGM01); // Fast PWM Mode
TCCR0B |= (1<<WGM02) | (1<<CS02) | (1<<CS00); //CLK / 1024 (Prescaler)


OCR0A=216; // value to generate 2ms high and 11ms low
OCR0B=216;
while(1)
{
}


return 0;
}

Hoffe das irgendwer was dazu weis....
Wär sehr dankbar für ne Antwort.

Hubert.G
20.10.2007, 09:33
Ich weiss nicht ob es noch aktuell für dich ist aber ich schreibe den Wert in die OCR-Register immer vor dem Timerstart.

blackpirate
20.10.2007, 11:30
Hallo.

Also ich schreibe hier mal selbst ne Antwort weil ich meinen Fehler schon gefunden habe.(für den fall das jemand einen genauso dummen Denkfehler macht)
Ich habe das OCR0A Register als Top für meinen Timer genommen. Sprich jedes mal wenn ich den OCR0A Wert erreiche und somit einen PWM erzeugen wollte ist er gleich wieder auf Bottom (0) gesprungen und hat den OC0A Ausgang wieder auf null gesetzt -> keine signal. Tja und daher das ich den OCR0B Wert auf den selben Wert gesetzt hab konnte da auch nichts rauskommen. Das Problem hab ich gelöst in dem ich ff als Top neheme und somit funktionieren beide PWMs.