Forum: Mikrocontroller und Digitale Elektronik Timer1: Timer_OVF Interrupt + PWM


von Kevin B. (tewger)


Lesenswert?

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
1
TCNT1 = timer_zeit;
 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

von spess53 (Gast)


Lesenswert?

Hi

>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?

ICR1 ist der Top-Wert der PWM. Nach Erreichen dieses Wertes geht es bei 
Null wieder weiter.

MfG Spess

von Kevin B. (tewger)


Lesenswert?

ist es auch möglich das irgendwie voneinander zu trennen? ich würde 
gerne eine led im halben Sekunden Takt leuchten lassen. Über die PWM 
Kanäle soll eine rgb-LED angesteuert werden und dazu brauche ich ja 
andere Werte...

von spess53 (Gast)


Lesenswert?

Hi

>ist es auch möglich das irgendwie voneinander zu trennen?

Nein.

>ich würde gerne eine led im halben Sekunden Takt leuchten lassen.

Mach das doch per Software im IC-Interrupt

> abgesehen davon das nur noch ein PWM
>Channel toggelt, der andere ist dauerhaft auf 1.

Deine PWMs sind verschieden konfiguriert:

TCCR1A |= (1<<COM1A1) | (1<<COM1B0) | (1<<COM1B1)| (1<<WGM11) ;
           ^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^
Lass einfach das Vorladen des Timers mit

>TCNT1 = timer_zeit;

Wenn du auf einen Wert > ICR lädst ist die PWM ausgeschaltet.

MfG Spess

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
Noch kein Account? Hier anmelden.