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
Hallo.
> Timer0 ausschalten, aber OCR0A Ausgang auf 100 % halten?
Timer vom Port trennen und Ausgang und auf "1" setzen ?
MfG
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.
Mit welche Taktfrequenz läuft der µC, dass du das siehst?
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...
if (OCR0A >= 254) { TCCR0B |= (1<<CS02)|(0<<CS01)|(0<<CS00); // timer off PORTB |= (1<<PB2); } Dies ist leider sichtbar...
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....
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.