PWM: timer0 ausschalten, aber OCR0A Ausgang auf 100 % halten?

Gast #1538428
Lesenswert?

Halli,
ich habe mir eine PWM-Steuerung geschrieben die auch suppi funktioniert. 
Nun habe ich aber die Idee, wenn ich langsam mein PWM hochfahre, das ich 
es gerne bei OCR0A = 255 auch dort halten wuerde, so für 30 Min.

Wenn ich nun aber die CS Register auf 0 setzen, um den Timer 
abzuschalten, wird der OCR0A-Ausgang dabei aber auch auf LOW gesetzt.

Meine Frage ist nun, wie ich das 'programm-technisch' am schlauesten 
Lösen könnte.

Bei OCR0A = 255, einfach nicht weiter erhöhen um so den 'reset' zu 
verhindern, um dann somit meine 30 Min abzuwarten um dann wieder 
herunter zu dimmen ?

Ich habe in der main() eine while(1)-schleife, in der das Startsignal 
für den timer0 kommt (CS-Register auf 1).

Ich kann ja schlecht nachdem Startsignal, ca. 100 weitere _delay_ms() 
oder sowas einbauen um 30 Min zu überbrücken, oder? Wie löst man sowas 
ein wenig 'professioneller' ?

Benutze einen attiny2313

Gruss,
Georg
Gast #1538580
Lesenswert?

Hab ich probiert, aber dann hat man kurz ein "aus-an" effekt, sobald ich 
ihn trenne, setzt er ihn halt auf LOW, um dann einen takt spaeter ihn 
wieder auf HIGH zu setzen. Dies sieht man leider wenn man wie hier leds 
dahinter hat.
#1538658
Lesenswert?

Und wenn du die Reihenfolge umdrehst? Also erst den Pin auf high, dann 
den Timer deaktivieren?

Und wieso musst du eigentlich den Timer unbedingt abschalten? Du kannst 
die PWM doch weiterlaufen lassen. Und die 30 Minuten könntest du dann zb 
über einen Timer-Interrupt abzählen. Du musst ja sowieso irgendwo nen 
Zeitgeber haben, der dir die PWM hoch und runter fährt....
Gast #1538670
Lesenswert?

Hi,
zählst Du direkt mit dem Register durch? Ich habe das mit einem externen 
Wert gezählt und dann dem Register zugewiesen.

Den externen Wert kannst Du dann beliebig lange so halten.
OCR1BL = mLED_Ist[0];

Neben dem delay_ms gibt's glaube ich auch noch einen delay_s. Ich habe 
mir den Delay einer ISR(TIMER0_OVF_vect) und einem int32_t selber 
geschrieben. Damit kann ich extern entsprechend Taktfrequenz und 
Prescaler ziemlich lange Wartezeiten generieren. Das ganze braucht auch 
weniger Platz als die delay.h.


1
ISR(TIMER0_OVF_vect) 
2
  //Wartezeit Delay
3
  _LongDelay +=  2;                     //jeden Zyklus 2ms Hochzählen;
4
                                        //bei mir wird der ISR alle 2ms   
5
                                        //aufgerufen
6
  if (_LongDelay >= _tTempTime)         //Zeit abgelaufen?
7
     {
8
     Delay_Done = 1;                    //Fertig-Flag setzen
9
     }
_tTempTime mit Wert laden, den _LongDelay auf 0 setzen und in einer 
Schleife Delay_Done aufrufen. Die Variablen müssen natürlich volatile 
sein.

Gruss hufnala

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren