Hallo zusammen, ich benutze den Atmega169P und betreibe mit dem Timer2 (asynchroner Modus) eine RTC (Overflow-Interrupt). Nun brauche ich noch zeitweise einen Taktgeber, der alle halbe Sekunde eine Flag setzt, um auf einem LCD-Glas eine Zahl blinken zu lassen. Dieses blinken tritt nur auf, wenn der Benutzer eine Einstellung vornimmt. Jetzt hatte ich gedacht, dass ich hier einfach die Output-Compare Eigenschaft des Timer2 nehme. Wird dadurch irgendwie meine RTC beeinflusst, also muss ich den Timer besipielsweise anhalten (wäre ja schlecht), um in das OCR2A Register zu schreiben bzw. dort kann ich den Wert gleich bei Initialisierung reinschreiben und würde dann nur, wenn eine Benutzer-Einstellung vorgenommen wird das FOC2A-Bit im TCCR2A Register setzen und nach der Benutzer-Einstellung wieder löschen ohne den Timer anhalten zu müssen? Danke für eure Hilfe Grüße Marcel
Marcel schrieb: > Jetzt hatte ich gedacht, dass ich hier einfach die Output-Compare > Eigenschaft des Timer2 nehme. Warum hängst du den entsprechenden Code nicht einfach in den Overflow Interrupt mit dazu? Kein Mensch sagt, dass eine ISR nur 1 Aufgabe erfüllen darf (wobei. Ich hab gerade noch einmal nachgelesen. Du willst ein LCD ansteuern. Das solltest du nicht in der ISR machen. Mit dem Flag wie von dir angedacht, ist das schon in Ordnung) > vorgenommen wird das FOC2A-Bit im TCCR2A Register setzen und nach der > Benutzer-Einstellung wieder löschen ohne den Timer anhalten zu müssen? Eine globale Variable, mit der das Blinken ein/aus geschaltet wird tuts auch. In der ISR wird die Variable abgefragt und wenn sie richtig steht, wird geblinkt. Du könntest die Variable sogar als Zähler ausführen, der von einer Vorgabe weg auf 0 herunterzählt (bei jedem ISR Aufruf jeweils um 1). Dann brauchst du dich ums Abschalten des Blinkens auch nicht mehr kümmern. Du setzt den Zähler auf einen Zahlenwert, der die Blinkdauer festlegt und wenn die Zeit um ist, deaktiviert sich die Blinkfunktionalität selbsttätig.
Hi >ich benutze den Atmega169P und betreibe mit dem Timer2 (asynchroner >Modus) eine RTC (Overflow-Interrupt). Wie oft? >vorgenommen wird das FOC2A-Bit im TCCR2A Register setzen und nach der Damit löst du lediglich einen OC-Interrupt unabhängig vom Timer aus. MfG Spess
Karl heinz Buchegger schrieb: > Eine globale Variable, mit der das Blinken ein/aus geschaltet wird tuts > auch. > In der ISR wird die Variable abgefragt und wenn sie richtig steht, wird > geblinkt Das Problem ist dann aber, dass ich nur sekündlich blinken kann, was mir zu langsam ist. (Diese Lösung hatte ich zuerst) Möchte aber im 0.5 Sekunden-Takt blinken lassen. Gut dann sagst du, dann lass doch einfach alle 0.5 Sekunden ein Overflow-ISR vom Timer erzeugen. Problem hier: Da ich voll auf Batteriebetrieb setze, würde das mehr Strom kosten. :( Vielen Dank, dass du dich mit meinem Problem beschäftigst. :) Grüße Marcel
Marcel schrieb: > Karl heinz Buchegger schrieb: >> Eine globale Variable, mit der das Blinken ein/aus geschaltet wird tuts >> auch. >> In der ISR wird die Variable abgefragt und wenn sie richtig steht, wird >> geblinkt > > > Das Problem ist dann aber, dass ich nur sekündlich blinken kann, was mir > zu langsam ist. > (Diese Lösung hatte ich zuerst) Wie oft wird denn deine ISR aufgerufen? Meistens hat man ja eine Overflow ISR, die mindestens ein paar hundert mal in der Sekunde aufgerufen wird. > Problem hier: Da ich voll auf Batteriebetrieb setze, würde das mehr > Strom kosten. :( Doppelt so viel aber immer noch extrem wenig. Ausserdem versteh ich dein Argument nicht. Wenn du alle 0.5 Sekunden einen Status umschalten willst, dann musst du den µC alle 0.5 Sekunden aus dem Tiefschlaf holen. Ob das jetzt mit einem Overflow Interrupt passiert oder mit einem anderen, spielt da dann keine Rolle mehr. Der Stromverbrauch ist deswegen ja auch nicht höher.
spess53 schrieb: >>ich benutze den Atmega169P und betreibe mit dem Timer2 (asynchroner >>Modus) eine RTC (Overflow-Interrupt). > > Wie oft? Die RTC läuft 24 Stunden am Tag. Das Gerät soll 8 Jahre aus einer Batterie leben können, deswegen super Stromsparoptionen. spess53 schrieb: > Damit löst du lediglich einen OC-Interrupt unabhängig vom Timer aus. O.K ist denn das iwie zulässig, dass ich nur ein Bit in einem Register setzen muss, damit dann das Output-Compare Interrupt scharf ist, ohne den Timer anzuhalten, oder kann das kritisch werden. Vielen Dank für deine Antwort Grüße Marcel
Marcel schrieb: > spess53 schrieb: >>>ich benutze den Atmega169P und betreibe mit dem Timer2 (asynchroner >>>Modus) eine RTC (Overflow-Interrupt). >> >> Wie oft? > > Die RTC läuft 24 Stunden am Tag. Das Gerät soll 8 Jahre aus einer > Batterie leben können, deswegen super Stromsparoptionen. Nein. Wie oft tritt der Interrupt in der Sekunde auf? Ausserdem versteh ich dein Argument nicht. Wenn du alle 0.5 Sekunden einen Status umschalten willst, dann musst du den µC alle 0.5 Sekunden aus dem Tiefschlaf holen. Ob das jetzt mit einem Overflow Interrupt passiert oder mit einem anderen, spielt da dann keine Rolle mehr. Der Stromverbrauch ist deswegen ja auch nicht höher.
Karl heinz Buchegger schrieb: > Wie oft wird denn deine ISR aufgerufen? > > Meistens hat man ja eine Overflow ISR, die mindestens ein paar hundert > mal in der Sekunde aufgerufen wird. Ich nutze hier die App-Note von Atmel zur RTC Hier wird mit einem externen Uhrenquarz und einem Prescaler von 128 genau sekündlich ein Interrupt erzeugt. Klar könnte ich jetzt einfach einen Prescaler von 256 nehmen, und würde dann wiedrum ein statische Variable in der ISR einfach togglen lassen, so dass ich dann nach einer Sekunde wieder eine Inkrementierung von t.sekunde hätte doch s.u. Karl heinz Buchegger schrieb: > Doppelt so viel aber immer noch extrem wenig. Na ja, wenn man 8Jahre Laufzeit betrachtet, kostet das schon Strom...
Marcel schrieb: > > Na ja, wenn man 8Jahre Laufzeit betrachtet, kostet das schon Strom... Sofern die Batterie 8 Jahre lang durchhält ohne auszulaufen :-) Akkus haben sowieso eine höhere Selbstentladung.
Hi >Das Problem ist dann aber, dass ich nur sekündlich blinken kann, was mir >zu langsam ist. >(Diese Lösung hatte ich zuerst) >Möchte aber im 0.5 Sekunden-Takt blinken lassen. Dann hättest du die Möglichkeit OCR2A auf 128 zu setzen und im OC-Interrupt das Flag setzen und im OVF-Interrupt zu löschen oder umgekehrt. Zum Blinken wird dann nur der OC-Interrupt freigeben. >Wird dadurch irgendwie meine RTC beeinflusst, Wenn du den Timermode nicht änderst, nein. MfG Spess
Karl heinz Buchegger schrieb: > Ausserdem versteh ich dein Argument nicht. Wenn du alle 0.5 Sekunden > einen Status umschalten willst, dann musst du den µC alle 0.5 Sekunden > aus dem Tiefschlaf holen. Ob das jetzt mit einem Overflow Interrupt > passiert oder mit einem anderen, spielt da dann keine Rolle mehr. Der > Stromverbrauch ist deswegen ja auch nicht höher. Ich habe in Anfang meiner Frage gesagt, dass Marcel schrieb: > Dieses blinken tritt nur auf, wenn der Benutzer eine Einstellung > vornimmt. Sprich die Funktionalität des Blinkens tritt nur in sehr seltenen Fällen auf, eben dann wenn der Benutzer eine Einstellung vornimmt und die Zahl, die er einstellen möchte blinken soll. Grüße Marcel
Marcel schrieb: > Ich habe in Anfang meiner Frage gesagt, dass > > Marcel schrieb: >> Dieses blinken tritt nur auf, wenn der Benutzer eine Einstellung >> vornimmt. > > Sprich die Funktionalität des Blinkens tritt nur in sehr seltenen Fällen > auf, eben dann wenn der Benutzer eine Einstellung vornimmt und die Zahl, > die er einstellen möchte blinken soll. OK. Hatte ich im Lauf des Threads irgendwie verdrängt :-)
spess53 schrieb: > Dann hättest du die Möglichkeit OCR2A auf 128 zu setzen und im > OC-Interrupt das Flag setzen und im OVF-Interrupt zu löschen oder > umgekehrt. Zum Blinken wird dann nur der OC-Interrupt freigeben. Genau OCR2A wird einmal auf 128 gestellt(am Anfang), und wenn dann eine Einstellung vorgenommen wird, wird das OC-Bit gesetzt. Na ja das Ovfl-Interrupt wird auch noch an sein, um eben die Sekunde zu inkrementieren,also: Ich probiers nochmal mit einer Zeichung ;): ---|Ovfl|---|OC|---|Ovfl|---|OC|--- Dann wird wenn die Benutzereinstellung getan ist, einfach wieder das OC-Interrupt deaktiviert, worduch dann der Timer nur das macht. ------|Ovfl|------|Ovfl|------|Ovfl|------ Kann ich dann einfach das OC-Bit setzen/löschen, oder muss ich da iwas beachten? Grüße Marcel
Marcel schrieb: > Kann ich dann einfach das OC-Bit setzen/löschen, oder muss ich da iwas > beachten? Genauer gesagt, kann ich ohne den Timer anzuhalten: TIMSK2 &= ~(OCIE2A); bzw. TIMSK2 &= ~(OCIE2A); schreiben? (Das TOIE2-Bit ist dauerhaft gesetzt und wird nie verändert) Die Antworten in diesem Forum sind wirklich super schnell und super hilfreich! Danke! Grüße Marcel
Marcel schrieb: > TIMSK2 &= ~(OCIE2A); > > schreiben? Ja kannst du. Allerdings musst du ein wenig aufpassen. Je nachdem wie der Timerstand genau ist, kann es natürlich passieren, dass das 'Aus' beim Overflow kommt, ehe das 'Ein' vom Compare Match kam. Eine Alternative wäre vielleicht noch, beim Eintreffen eines Zeichens den aktuellen Zählerstand auslesen, 128 dazuzählen und das dann als Compare Wert zu verwenden. So wie das bis jetzt angedacht war, kann es bis zu 1 Sekunden dauern, ehe nach Zeichenempfang das Blinken beginnt.
Siehe Sleep Mode Und RECHNE mal nach, wieviel "kostbaren" Strom das kostet. Und dann hört auf Probleme zu lösen, die nicht da sind. MfG Falk
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.