tschensen
03.07.2006, 10:03
Hallo zusammen,
ich betreibe den Timer 1 im Fast PWM Mode und habe Probleme dass die neuen Werte für OCR1A/B erst im übernächsten Timerdurchlauf übernommen werden. Das liegt daran, dass die neuen Werte für OCR1A/B übernommen werden, wenn der Top Wert des Zählers erreicht wird, aber bei diesem Zeitpunkt noch nicht berechnet wurden.
Also der grobe Programmablauf: Nach Starten des Timers wird zunächst am ICP1 Pin ein Capture Interupt ausgelöst. Hier wird auch der neue Wert für OCR1A und OCR1B berechnet. Da die Berechnung zu lange dauert wird zu beginn das I- Bit im SREG Register gesetzt, dass dieser Interupt durch den Compare Match OC1A unterbrochen werden kann. (OCR1A wird übrigens als Top-Wert des Zählers verwendet)
Das Problem ist jetzt, dass die neuen Werte für OCR1A und OCR1B erst bei Erreichen des Top Wertes übernommen werden, zu diesem Zeitpunkt die neuen Werte für OCR1A und OCR1B noch nicht berechnet worden sind. Somit werden die neuen Werte erst beim 2. Erreichen des Top Wertes übernommen. Der PWM-Ausgang hinkt somit immer eine Zählschleife hinterher.
Mal hoffen, dass ich das Problem einigermaßen verständlich erklärt habe.
Hat jemand eine Lösung wie die Werte für OCR1A/OCR1B schon für den nächsten Timerdurchlauf übernommen werden können?
Eine schnellere bzw. frühere Berechnung von für OCR1A/OCR1B ist nicht möglich. Die Zeit zwischen dem Capture Interupt und dem Interupt Compare Match A kann übrigens wenige µs betragen. Beim OCR1A
Compare Match wird der Timer angehalten. Nach diesem Interupt wäre genug Zeit OCR1A /B irgendwie zu updaten….
Einen „fake“ Timer Overflow Interupt kann man ja leider nicht einfach auslösen in dem man die Passende Flag im TIFR Register setzt. Das wäre wohl die einfachste Lösung für mich gewesen.
ich betreibe den Timer 1 im Fast PWM Mode und habe Probleme dass die neuen Werte für OCR1A/B erst im übernächsten Timerdurchlauf übernommen werden. Das liegt daran, dass die neuen Werte für OCR1A/B übernommen werden, wenn der Top Wert des Zählers erreicht wird, aber bei diesem Zeitpunkt noch nicht berechnet wurden.
Also der grobe Programmablauf: Nach Starten des Timers wird zunächst am ICP1 Pin ein Capture Interupt ausgelöst. Hier wird auch der neue Wert für OCR1A und OCR1B berechnet. Da die Berechnung zu lange dauert wird zu beginn das I- Bit im SREG Register gesetzt, dass dieser Interupt durch den Compare Match OC1A unterbrochen werden kann. (OCR1A wird übrigens als Top-Wert des Zählers verwendet)
Das Problem ist jetzt, dass die neuen Werte für OCR1A und OCR1B erst bei Erreichen des Top Wertes übernommen werden, zu diesem Zeitpunkt die neuen Werte für OCR1A und OCR1B noch nicht berechnet worden sind. Somit werden die neuen Werte erst beim 2. Erreichen des Top Wertes übernommen. Der PWM-Ausgang hinkt somit immer eine Zählschleife hinterher.
Mal hoffen, dass ich das Problem einigermaßen verständlich erklärt habe.
Hat jemand eine Lösung wie die Werte für OCR1A/OCR1B schon für den nächsten Timerdurchlauf übernommen werden können?
Eine schnellere bzw. frühere Berechnung von für OCR1A/OCR1B ist nicht möglich. Die Zeit zwischen dem Capture Interupt und dem Interupt Compare Match A kann übrigens wenige µs betragen. Beim OCR1A
Compare Match wird der Timer angehalten. Nach diesem Interupt wäre genug Zeit OCR1A /B irgendwie zu updaten….
Einen „fake“ Timer Overflow Interupt kann man ja leider nicht einfach auslösen in dem man die Passende Flag im TIFR Register setzt. Das wäre wohl die einfachste Lösung für mich gewesen.