Hallo,
ich versuche gerade 2 PWM Kanäle vom Timer1 und dessen Interrupt zu
nutzen.
Dazu folgende Initialisierung:
1 | TCCR1B |= (1<<CS12); // Prescaler 256
|
2 | TIMSK1 |= (1<<TOIE1);//
|
3 | TCNT1 = timer_zeit ; //für 0.5 sekunden interrupts = 49911
|
4 |
|
5 | //Counter 1 Modus 14, TOP ICR1,Prescaler 256
|
6 | TCCR1A |= (1<<COM1A1) | (1<<COM1B0) | (1<<COM1B1)| (1<<WGM11) ;
|
7 | TCCR1B |= (1<<WGM12) | (1<<WGM13) | (1<<CS12);
|
8 |
|
9 | ICR1= 0x6FFF; //Endtwert für Zähler
|
10 | OCR1A=0x3FFF; //Compare Wert
|
11 | OCR1B=0x3FFF; //Compare Wert
|
in der Interrupt Routine wird das Register wieder mit
gefüllt. Das funktioniert auch soweit.
Leider stimmen die Zeiten jetzt nicht mehr überein, ich habe ca die
doppelte Periodendauer. Ich bin mir nicht sicher, was passiert, wenn der
Timer den Wert von ICR1 erreicht. --> Wird dann der Timer auf 0 gesetzt
oder läuft er weiter? Aus dem Datenblatt konnte ich das nicht
herauslesen. Ich habe dann zum Versuch folgende Werte für OCR1A und B
genommen:
1 | OCR1A=0xE17B; //Compare Wert
|
2 | OCR1B=0xE17B; //Compare Wert
|
Dies entspricht der Hälfte der Zeit von FFFF und "timer_zeit". So
funktioniert es einigermaßen, abgesehen davon das nur noch ein PWM
Channel toggelt, der andere ist dauerhaft auf 1.
Also abschließend die Frage:
Ist es möglich den Timer1 als Interrupt und PWM-Geber zu nutzen und wenn
ja wie?
EDIT:
es handelt sich um einen ATmega644p bei 8MHz