Forum: Mikrocontroller und Digitale Elektronik PWM: timer0 ausschalten, aber OCR0A Ausgang auf 100 % halten?


von Georg (Gast)


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

von Sauger (Gast)


Lesenswert?

Hallo.

> Timer0 ausschalten, aber OCR0A Ausgang auf 100 % halten?

Timer vom Port trennen und Ausgang und auf "1" setzen ?

MfG

von Georg (Gast)


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.

von Christian M. (chrisreg)


Lesenswert?

Mit welche Taktfrequenz läuft der µC, dass du das siehst?

von Georg (Gast)


Lesenswert?

4 Mhz, prescaler 256

Ich weiss man sollte es nicht sehen können, doch leider sieht man, wie 
die leds ausgehe um danach wieder anzugehen :/ Deswegen bin ich ja so 
verzweifelt...

von Georg (Gast)


Lesenswert?

if (OCR0A >= 254)
{
  TCCR0B |= (1<<CS02)|(0<<CS01)|(0<<CS00);  // timer off
  PORTB |= (1<<PB2);
}

Dies ist leider sichtbar...

von Uwe .. (uwegw)


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

von hufnala (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Georg schrieb:
> if (OCR0A >= 254)
> {
>   TCCR0B |= (1<<CS02)|(0<<CS01)|(0<<CS00);  // timer off
>   PORTB |= (1<<PB2);
> }
>
> Dies ist leider sichtbar...

Was soll das darstellen? Weder schaltest du den Timer ab, noch koppelst 
du den Port-Pin vom Timer ab.

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.