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
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 ?
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 ...
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.
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.
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?
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.
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 ...
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.
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 ...
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"
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.