www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RTC(Overflow-Int.) und Output-Compare Int. mit einem Timer


Autor: Marcel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

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

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel schrieb:
> TIMSK2 &= ~(OCIE2A);

TIMSK2 |= (OCIE2A);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

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.