Forum: Mikrocontroller und Digitale Elektronik AVR internal RTC


von Karl F. (kafido)


Lesenswert?

Hallo Leute,

es gibt hier ja reichlich Beiträge und Threads rund um das Thema RTC.
Aber zu meiner Frage hab ich leider nichts wirklich passendes gefunden:

Ich möchte bei einem ATmega328p die interne RTC Funktion nutzen, wofür 
man ihn ja schlafen legen muss, wenn er wenig Strom verbrauchen soll.

Die Frage ist nun: was muss man alles beachten, damit beim Schlafenlegen 
bzw. Wiederaufwecken keine Ticks verlorengehen o.ä.?

Wie verträgt sich sowas u.U. mit einer Umgebung wie Arduino, die ihre 
eigenen Timer-Routinen und Zeitfunktionen wie millis() und micros() hat?

Sollte man evtl. vor dem Schlafenlegen alle (anderen) Interrupts 
abstellen, so dass beim aufwecken durch den RTC wirklich nur der 
Sekundenzähler weitergezählt wird ... ?

Wie würdet Ihr das Aufwecken realisieren?
In o.a. "Sekundeninterrupt" auch noch kurz die Tasten abfragen?

Wäre super, wenn mich jemand in die richtige Richtung schubsen würde ...

Ich sag schonmal danke ...

Gruß
- Karl

von Purzel H. (hacky)


Lesenswert?

Naja. Den Timer2 muss man natuerlich durchlaufen lassen. Uns so dummes 
Zeug wie delaymilli() laesst man besser weg. Dafuer nimmt man allenfalls 
einen timer.
Was spricht dagegen die Kapitel zum Stromsparen mal minutioes 
durchzulesen ?

von Karl F. (kafido)


Lesenswert?

Oktav Oschi schrieb:
> Was spricht dagegen die Kapitel zum Stromsparen mal minutioes
> durchzulesen ?

Wenn Du damit das Datasheet von ATmel meinst:
Die 562 Seiten kenn ich schon fast auswendig ...

Ich bin auch kein Neuling im Bereich uC, aber speziell mit diesem Thema 
hab ich mich bisher nicht befasst. Entweder hatten meine Applikationen 
keine Uhr (weil nicht benötigt) oder sie hatten einen externen RTC ...
Insofern ist dieser Bereich Neuland und ich möchte nicht in alle Löcher 
treten, die es gibt - ein paar reichen ;-)
Deswegen bin ich auf der Suche nach ein paar guten Tipps ...

von Purzel H. (hacky)


Lesenswert?

Also, die Softwarefehler sin korrigierbar, daher sollten wir hier erst 
man die Hardwarefehler vermeiden. Als Speisung sollte man einen 
effizienten Switcher verwenden, zB einem TPS62056, der macht 3.3V mit 
nur 12uA Eigenverbrauch. Oder einen TPS62202, der macht 1.8V mit 12uA 
Eigenverbrauch. Die Spannung ist definiert durch die uebrige Peripherie. 
Allfaellige Pullups oder Pulldown widerstaende muss man sich jeweils 
genau ueberlegen, denn ein dauernder gegen Null gezogener Pullup, laesst 
dauern Strom runter. Ein Megaohm macht schon mehrere uA.

von Dr G. Reed (Gast)


Lesenswert?

Ich hab das vor Kurzem mal mit einem Mega 8 ausprobiert:

Der Mega 8 läuft mit dem internen RC Oszillator.
Am TOSC/XTal Anschluss ist ein 32Khz Uhrenquarz, welcher dann den Timer 
2 antreibt.

Alle Sekunde wecke ich den Prozessor auf lasse eine LED aufblitzen.

Dadurch, dass der Timer2 auch während des Prozessor Tiefschlafs 
weiterläuft, gehen keine Zyklen oder sowas verloren, das funktioniert 
eigentlich recht gut.

Das nennt sich dann Power Safe Modus, also eine Stufe über dem 
kompletten Power Down.

von Karl F. (kafido)


Lesenswert?

Schon mal vielen Danke für die Antworten.

Ich muss das mit dem Power-Safe Kram wohl einfach mal ausprobieren.
Ich denke mal, bei einer Anwendung wie einer reinen Uhr/Wecker ist das 
sicher kein Problem. Ich plane hier ein kleines Gerät zu bauen, bei dem 
der AVR noch andere (u.a. Interruptgesteuerte) Aufgaben hat und die Uhr 
ist nur Nebensache. Statt ausschalten soll man den AVR dann halt auf 
Standby stellen können so dass wenigtsens die Uhr weiterläuft.
Jetzt frage ich mich halt, was man in diesem Fall so alles vor dem 
Schlafenlegen und nach dem Aufwachen beachten muß. Ich schätze, man 
schaltet am Besten vor dem Standby die ganzen anderen Interrupts ab und 
schaltet sie nach dem Aufwachen wieder an.
Was passiert mit den anderen Timern?
Laufen die einfach da weiter, wo sie aufgehört haben?
Oder sollte man die neu initialisieren?
Gibt's hier irgendwo eine Beispiel-App, in der sowas gemacht wurde?
Evtl. sogar mit Arduino?

von Weingut P. (weinbauer)


Lesenswert?

ich glaub Du hast da nen Denkfehler ...
Du musst den AVR nicht in den Sleep schicken um die
RTC zu verwenden. Einfach den Uhrenquarz anschließen, Timer 
konfigurieren
und laufen lassen. Der generiert dann einfach alle Sekunde nen Timer 
Interrupt und gut ist.

von Karl F. (kafido)


Lesenswert?

Fhutdhb Ufzjjuz schrieb:
> ich glaub Du hast da nen Denkfehler ...
> Du musst den AVR nicht in den Sleep schicken um die
> RTC zu verwenden. Einfach den Uhrenquarz anschließen,
> Timer konfigurieren und laufen lassen.

natürlich muss ich nicht - ich will aber. Statt ausschalten halt.
Sprich: wenn die Applikation nicht gebraucht wird, wird sie 
abgeschaltet, also vom Strom getrennt - die Uhr soll aber weiterlaufen.
Früher hab ich sowas mit nem Batteriegepufferten externen RTC gemacht.
Diesmal würd ich gerne den ATmega selbst dafür verwenden.
Das heißt aber, daß ich im Batterie-/Akku-/Pufferbetrieb den 
Stromverbrauch senken muss - also alles abschalten, was nicht gebraucht 
wird und nur den Oszillator mit dem Uhrenquartz weiterlaufen lassen und 
ab und zu den Sekundenzähler eins weiter zählen ...
Schade, dass der ATmega nicht einfach einen 32bit-Zähler in der HW mit 
drin hat, dann könnte man ihn komplett schlafen lassen ...

von Uwe (Gast)


Lesenswert?

Und wie willst du ihn aufwecken wenn der 32 Bit hat  wenn alle anderen 
Interups abgeschaltet sind ? Also ein mal pro Sekunde nachgucken ob ne 
Taste gedrückt ist kann man einfach machen wenn die Taste länger als ne 
Sekunde gedrückt ist geht das System sicher an. Ansonsten müssen die 
Externen INTs anbleiben bzw. Pinchange.

von Karl F. (kafido)


Lesenswert?

Uwe schrieb:
> Und wie willst du ihn aufwecken wenn der 32 Bit hat
> wenn alle anderen Interups abgeschaltet sind

naja - sehr hypothetisch - wenn er einen solchen Hardwarezähler 
hätte, dann brauchte ich den TIMER2-Interrupt nicht, dafür aber halt 
einen anderen Hardware-Interrupt, der zum Aufwecken taugt - mit INT0/1 
müsste das doch auch gehen - und das hätte den Vorteil, dass er sofort 
auf den Tastendruck reagiert und nicht erst innerhalb einer Sekunde ...
Aber da wir einen solchen Hardwarezähler nunmal nicht haben ...

von Timmo H. (masterfx)


Lesenswert?

Lies doch einfach mal die entsprechende Application Note "AVR134" von 
Atmel zu dem Thema. "Real-Time Clock using the Asynchronous Timer on 
tinyAVR and megaAVR devices"

von Karl F. (kafido)


Lesenswert?

Hab ich auch schon ...
Allerdings war in der Version der AppNote, die ich kenne,
(http://www.atmel.com/atmel/acrobat/doc1259.pdf)
leider kein Beispielcode dabei sondern nur das Flussdiagramm.

Hab jetzt aber das hier gefunden:
http://www.mikrocontroller.net/attachment/115498/Avr134.c

Ich hatte eigentlich gedacht, dass irgendjemand aufschreit und sagt:
Pass auf, Stolperfalle hier, hier und hier ...
Aber wenn das alles schön nach Handbuch funktioniert, is ja gut.
Werd ich wohl mal ausprobieren ...

Danke.

von spess53 (Gast)


Lesenswert?

Hi

>Allerdings war in der Version der AppNote, die ich kenne,
>(http://www.atmel.com/atmel/acrobat/doc1259.pdf)
>leider kein Beispielcode dabei sondern nur das Flussdiagramm.

http://www.atmel.com/dyn/resources/prod_documents/Avr134.zip

MfG Spess

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Karl F. schrieb:
> Jetzt frage ich mich halt, was man in diesem Fall so alles vor dem
> Schlafenlegen und nach dem Aufwachen beachten muß. Ich schätze, man
> schaltet am Besten vor dem Standby die ganzen anderen Interrupts ab und
> schaltet sie nach dem Aufwachen wieder an.
> Was passiert mit den anderen Timern?
> Laufen die einfach da weiter, wo sie aufgehört haben?
> Oder sollte man die neu initialisieren?

Da alle Takte außer dem asynchronen Takt für Timer2 abgeschaltet werden 
und die Register durch den Power-Save nicht beeinflusst werden, laufen 
deine anderen Timer dann einfach weiter. Du musst auch nichts neu 
initialisieren. Abschalten solltest du nur die asynchronen Interrupts, 
die deinen AVR nicht aufwecken sollen. Alles andere (synchrone) wird ja 
sowieso angehalten.


Gruß
Jonathan

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
Noch kein Account? Hier anmelden.