Hilfe! Ich drehe langsam durch! Will einen Pwm-Signal mit Atmega16 am Pin OC0 erzeugen. Hab den Kapitel zu Timer0 im Datenblatt durchgelesen. Das Timer soll als "Phase Correct PWM Mode" , nicht invertierend laufen. So hab ich das Timer initialisiert TCCR0=0b00101010; TIMSK=0b00000000; OCR0 =0b00010000; Aber es läuft garnicht. Kann mir jemand einen Beispiel dazu geben, mit der kurzen Beschreibung. Ich gebe zu, bei solchen Aufgaben brauc man Geduld. Den habe ich auch, aber dies mal ... Danke.
nicht überprüft, aber du musst auf jeden Fall auch den entsprechenden OCx-Pin als Ausgang schalten. (DDRB3?)
Wie soll die Interrupt-Routine aussehen? Braucht man sie überhaupt? So sieht mein Testquellcode int main(void) { DDRA=0xff; DDRB=0b00001111; DDRC=0xff; PORTA=0xff; PORTB=0x06; TCCR0=0b00101010; TIMSK=0b00000000; OCR0 =0b00010000; sei(); while(1) { PORTA |=(1<<PA0); PORTA |=(1<<PA1); PORTA &= ~(1<<PA0); PORTA &= ~(1<<PA1); } return 0; } Wo liegt der Fehler!!!
PWM funktioniert besser, wenn man den Timer auch in den PWM-Modus versetzt. Der CTC-Modus bringt dich da nicht weiter. Schau dir die Positionen der WGM-Bits noch mal an. NB: Das ist ein Grund, warum man auf solche 0b11110000 Binärwürste verzichten und die Bitnamen verwenden sollte, also (0<<WGM01 | 1<<WGM00).
Andreas, Vielen vielen vielen Dank! Eigene Dummheit hat mir ein Paar schlafflose Nächte gegönnt. Werde mein Programmierstil einfach umstellen, so dass solche dumme Fehler nie mehr vorkommen. MfG College
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.