Datum:
Guten Abend! Ich hab ein Problem mit Timer 1 des Atmega 32. Ich möchte für eine spätere Anwendung eine PWM mit variabler Frequenz erzeugen. Ich benutze dazu die Fast PWM mit variabler Frequnz und Teiler 1 und möchte, dass der Ausgang OC1A den High-Zustand bekommt, wenn ein Match eintritt. Im ersten Ansatz möchte ich ein Tastverhältnis von 1:1 haben. Nach meinem Verständnis wird in diesem Modus bis zum Wert von ICR1 gezählt. Dann beginnt der Timer von vorne. Über ICR1 wird demnach die Frequenz der PWM eingestellt. Und so habe ich das konfiguriert:
int main (void) { DDRD |= (1 << PD5); TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12); ICR1 = 444; OCR1A = 222; TCCR1B |= (1 << CS10); while (1) { asm volatile ("nop"); } } |
Ergebnis ist: Der Portpin gibt dauerhaft High-Signal. In einer anderen Version habe ich das zu Testzwecken mit Interrupt gemacht, um zu prüfen ob der Timer überhaupt läuft. In der ISR sollte er nur PORTB hochzählen. Das hat er getan, woraus ich schließe, dass der Timer funktioniert. Was habe ich falsch gemacht? Grüße Dennis
Datum:
Dennis schrieb: > Was habe ich falsch gemacht? Hmm. Dein Programm sieht korrekt aus. Auch ein Test mit einem direkten Helligkeitsvergleich mit einer nebenan liegenden LED zeigt ganz klar, dass die PWM-LED sauber gedimmt wird. Dabei hab ich die Dimmung mal etwas extremer gemacht, damit man den Unterschied auch deutlich sieht.
#include <avr/io.h> int main (void) { DDRD |= (1 << PD5) | (1 << PD6); PORTB |= ( 1 << PD6); TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12); ICR1 = 444; OCR1A = 10; TCCR1B |= (1 << CS10); while (1) { asm volatile ("nop"); } } |
Also: An diesem Programm liegt es nicht.