Timer1: Timer_OVF Interrupt + PWM

OP #4374513
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
Gast #4374560
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
Gast #4374606
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.