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.