Forum: Mikrocontroller und Digitale Elektronik Compare von Timer verschieben


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Folgende Idee:

Timer1 läuft von 0-TOP=5000

Bei COMPA=300 wird ein Interrupt ausgelöst.

Wenn ich nun im Interrupt den COMPA auf 900 stelle, wird der interrupt 
dann nach weiteren 600 counts erneut ausgelöst?

Danke schonmal!

von Thomas E. (thomase)


Lesenswert?

Holger K. schrieb:
> Wenn ich nun im Interrupt den COMPA auf 900 stelle, wird der interrupt
> dann nach weiteren 600 counts erneut ausgelöst?

Ja.

mfg.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Thomas E. schrieb:
> Ja.

Nicht unbedingt. Vorausgesetzt, wir spielen hier mit AVR (weiss ja 
keiner), kann es je nach Timermode zu einem OCR Update auch erst bei TOP 
oder BOTTOM kommen.

von Holger K. (holgerkraehe)


Lesenswert?

Matthias S. schrieb:
> Thomas E. schrieb:
>> Ja.
>
> Nicht unbedingt. Vorausgesetzt, wir spielen hier mit AVR (weiss ja
> keiner), kann es je nach Timermode zu einem OCR Update auch erst bei TOP
> oder BOTTOM kommen.

Ja es handelt sich um einen Atmega48

Der Mode ist noch offen.
Welcher soll man hier wählen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Holger K. schrieb:
> Welcher soll man hier wählen?

Kommt drauf an, wass du willst. Bei PWM Modes passiert ein OCR Update 
bei TOP oder BOTTOM:
Zitat:
"The OCR1x Register is double buffered when using any of the twelve 
Pulse Width Modulation (PWM) modes. For the Normal and Clear Timer on 
Compare (CTC) modes of operation, the double buffering is disabled. The 
double buffering synchronizes the update of the OCR1x Compare Register 
to either TOP or BOTTOM of the counting sequence. The synchronization
prevents the occurrence of odd-length, non-symmetrical PWM pulses, 
thereby making the output glitch-free."

von Holger K. (holgerkraehe)


Lesenswert?

Matthias S. schrieb:
> Kommt drauf an, wass du willst.

Folgender Gedanke:

Ich brauche 3 Kanal PWM für RGB.
Der Mega48 hat nur zwei 16bit Compares.

Deshalb folgender Ansatz:

Ich Lasse den 16bit Counter mit prescaler 8 laufen = 200'000KHz (da 
F_CPU = 16MHz)

Nun wähle ich als TOP Value 14bit bzw. 16384
Dies ergibt mir einen overflow bzw PWM Frequenz von ca. 122Hz

Ich habe nun ein Array uint16_t arr[3] mit meinen drei Compare Werten 
für R G und B.

Im Overflow ISR schalte ich alle LEDs aus und setze den Compare auf 
arr[0] sowie eine count Variable auf 0 (damit ich weiss wo ich stehe).

Beim ersten Compare schalte ich die rote LED ein und setze den COMPARE 
auf arr[count+1] sowue count++

dadurch werden die LEDs zu unterschiedlichen Zeiten eingeschaltet und 
haben ihre individuellen PWM DutyCycles.

Der Interrupt wird jedoch nur mit maximal 4x F_PWM = 4x122Hz = 488Hz 
aufgerufen. 4x deshalb weil overflow plus 3 unterschiedliche RGB werte.

Sollten zwei Comparewerte zu nahe oder identisch sein, so wird ein Flag 
gesetzt welches dies azeigt. Dann soll im COMP ISR beide Farben 
eingeschaltet werden und count+=2 gemacht werden.

arr[] wird in einer separaten Funktion befüllt. Idealerweise in der main 
loop, da dies nicht prioritär ist.

Zwischen zwei Counts des Counters liegen 8 CPU Takte, da F_CPU / 8 
eingestellt ist. Da der ISR wohl kaum nach 8 Takten zu ende ist, werden 
zu nahe beienanderliegende compare werte zusammengefasst.

Denkt ihr, das könnte so klappen?

von Karl H. (kbuchegg)


Lesenswert?

Holger K. schrieb:

> Denkt ihr, das könnte so klappen?

Das klappt auch so.
Du bist nicht der Erste mit einer Idee in diese Richtung.
https://www.mikrocontroller.net/articles/Soft-PWM

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.