mikrocontroller.net

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


Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

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

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

MfG

Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian M. (chrisreg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit welche Taktfrequenz läuft der µC, dass du das siehst?

Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Georg (Gast)
Datum:

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

Dies ist leider sichtbar...

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: hufnala (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


ISR(TIMER0_OVF_vect) 
  //Wartezeit Delay
  _LongDelay +=  2;                     //jeden Zyklus 2ms Hochzählen;
                                        //bei mir wird der ISR alle 2ms   
                                        //aufgerufen
  if (_LongDelay >= _tTempTime)         //Zeit abgelaufen?
     {
     Delay_Done = 1;                    //Fertig-Flag setzen
     }
_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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.