Hallo & guten tag ich habe im Forum gelesen wie man einen Sleep mode mit taster oder einen Sleepmode mit einem Timer umsetzt. Aber ich habe nichts gefunden oder verstehe es nicht wie man beides nutzen kann. Problem : Ich möchte einen programmpause machen 1-600 sekunden. Innerhalb dieser langen zeit muss aber das programm bedienbar bleiben ( 1 taster) Ablauf : - messung starten - wert schreiben - sleep (1-600 sekunden) - messung starten - wert schreiben - sleep (1-600 sekunden) jetzt aber in der pause eine Taste - ende Warum : Stromsparen da Akkubetrieb und lange messpausen Kann mir jemand den Ablauf mal aufzeigen wie ich das umsetze? danke.
Wie sieht denn deine Hardware aus? Mit einem Atmega 88 alleine kommst du ja nicht weiter. Hast du ein fertiges Board oder soll das erst entstehen? Was willst du messen? Zeiten, analoge Werte oder was? Sebastian Albrecht schrieb: > ich habe im Forum gelesen wie man einen Sleep mode mit taster oder einen > > Sleepmode mit einem Timer umsetzt. Grundsätzlich hast da aber schon alles gefunden. Du musst nur das "oder" durch ein "und" ersetzen. mfg.
Hallo Ja meine Schaltung atmega88 + ds1820 + sd Karten funktioniert schon. Nur leider verwende ich noch eine Delay als Pause. Auch der stromverbrauch ist zu hoch. Jetzt möchte ich das ganze mit Power down ( Sleep) machen in gcc. Dazu möchte ich den Prozessor down fahren und ihn wecken nach x Sekunde oder durch Tastendruck. Leider weis ich nicht wie das geht?
Hi Sebastian, mir hat der Artikel weiter geholfen. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Sleep-Modes Ich nehme an das man es mit einem Blick in das Datenblatt zu Deiner CPU angleichen kann. Ich habe damals ein mA Meter dazwischen gefummelt um zu sehen ob das auch funktioniert. Der AVR wurde bei mir durch einen Uhrenquarz aufgeweckt. Viel Erfolg!
Also per Timer "Wecken" scheint ja zu gehen. Und mit Taster? Den Tasten-Input als Pegel-Wechsel-Interrupt- ähnlich dem Timer -Interrupt aufbauen, fertig. Jeder der Interrupts (Timer, Pegel-Wechsel weckt auf! Dann ggf. noch abfragen wer geweckt hat (Timer oder Taster). Fertig. Wie welches Bit für den Pegelwechsel-Interrupt zu setzen ist verrät das Datenblatt. Das Aufwecken per Tastendruck funktioniert mit dem ATMEGA88, setze es selber ein.
Sebastian schrieb: > Ja meine Schaltung atmega88 + ds1820 + sd Karten funktioniert schon. Wie ist denn deine Schaltung getaktet? Intern oder mit Quarz? Welche Batteriespannung? mfg.
Thomas Eckmann schrieb: > Wie ist denn deine Schaltung getaktet? Intern oder mit Quarz? > Welche Batteriespannung? hallo zu 1 - intern mit 8mhz zu 2 - 3,7V Lipo mit regler auf 3,3V wegen SD Karte vor dem power down schalte ich auch die SD karte ab. ich würde gerne auf ca 30 tage LipoLiveTime kommen. aber mit der delay variante + SD_on komme ich auf 50mA (max 49h livetime) mit der power down variante bei nur ca 20messungen/h wird das sehr lange laufen. ich habe leider nich nicht mit power down und interrupt gearbeitet. deshalb fehlt mir hier einiges an wissen. Wenn mir jemand das schema in etwa sagen könnte zb: - timer init - taster init - ports off - power down ---> taster on --> weiter im code in programmende ---> timer abgelaufen --- weiter im code wenn es so geht ???
Guter Rat schrieb: > Also per Timer "Wecken" scheint ja zu gehen. > > Und mit Taster? > > Den Tasten-Input als Pegel-Wechsel-Interrupt- > ähnlich dem Timer -Interrupt aufbauen, fertig. > > Jeder der Interrupts (Timer, Pegel-Wechsel weckt auf! > Dann ggf. noch abfragen wer geweckt hat (Timer oder Taster). > Fertig. > Wie welches Bit für den Pegelwechsel-Interrupt zu setzen > ist verrät das Datenblatt. > > Das Aufwecken per Tastendruck funktioniert mit dem ATMEGA88, > setze es selber ein. Hallo das klinkt einfach bei dir. ABER für einen anfänger ist dein Text recht schwer zu verstehen. "Den Tasten-Input als Pegel-Wechsel-Interrupt- ähnlich dem Timer -Interrupt aufbauen, fertig." hast du da ein paar befehle oder beispiel code für mich?
Sebastian Albrecht schrieb: > zu 1 - intern mit 8mhz > > zu 2 - 3,7V Lipo mit regler auf 3,3V wegen SD Karte Na das ist doch schon mal was. Bekommst du noch einen Uhrenquarz auf deine Platine? Das ergäbe die einfachste Lösung. mfg.
Nochmal deutlicher: Das mit dem Timer-Interrupt scheint ja zu funktionieren. Diesen Interrupt hast Du hoffentlich auch verstanden. Mit dem Pegelwechsel-Interrupt ist es Ähnlich. Im Datenblatt steht welche Register dafür verantwortlich sind. Dein Taster hängt an einem Port-Pin, wenn du den Taster betätigst gibt es einen Pegelwechsel, der den Interrupt auslösen soll. Du muß den zum Portpin des Tasters gehörigen Pin-Change-Int über eine Maske (entsprechendes Bit setzen) aktivieren, den Zusammenhang verrät das Datenblatt, dann muß du noch den Pin change-Interrupt als solchen freigeben, auch wieder in dem das passende Bit (Datenblatt) gesetzt wird. Die Interrupt-Routine kann in einfachsten Fall aus einem "RETI" bestehen, besser ist es jedoch ein Flag zu setzen, dann kann man nach dem "Aufwachen" feststellen ob es der Taster oder der Timer war. Das Flag muß vor dem Sleep gelöscht werden. Der Sleep Zustand wird durch Interrupt verlassen, egal ob der Timer- oder der Pegel-Wechsel-Interrupt. Deshalb ist es nötig ein entsprechendes Flag zu setzen, das nach dem "Aufwachen" abgefragt werden kann. Auch wenn ich mich auf dem Gebiet gut auskenne, ich schaue jedesmal im Datenblatt ob ich das richtige Register und Bit darin setze, lösche, abfrage. Ins Datenblatt schauen ist kein Zeichen von Dummheit oder Nicht- Wissen, warum soll ich mir was merken wenn ich weiß wo ich nachschauen kann, und wenn es nur zur Bestätigung ist.
Danke guter rat! Ich werde mich da mal einlesen müssen. Der Ablauf ist mir jetzt klar nur die Umsetzung wird eine Weile benötigen. Bisher protrahiere ich einfach drauf los. Habe mit dem Datenblatt noch nicht viel zu tun gehabt. Wenn man Ports on / off setzt und etwas ablaufen lässt braucht Man das Datenblatt ja nicht wirklich. Aber jetzt komme ich an die Grenzen. Ich finde diese befehle um Timer zu bauen auch kryptisch. Ich werd's die Woche mal testen. Und mich langsam rantasten. Für Code Schnipsel bin ich dankbar.
Hallo Also ich habe das mit dem Sleep jetzt gut hinbekommen. und ich danke auch allen die mir geholfen haben. Jetzt steht nur noch eine frage im raum. was spart mehr und ist besser : Version 1: - 8mhz - Timer 8 bit - 1024 Teiler - wacht ca 7812 mal pro sekunde auf und schläft wieder ein Version 2: (noch nicht gebaut) - 8mhz - Timer 16 bit - 1024 Teiler - wacht ca 1-5 mal pro sekunde auf und schläft wieder ein welche version ist besser ? kostet schlafen legen und power on in rascher abfolge viel strom ? Ab wann ist ein sleep sinvoll ??? bei version 1 ist denke ich die teilung so : (1024 schlafen) zu (1 aufwachen) ? für input bin ich dankbar ... grüße Sebastian
Sebastian Albrecht schrieb: > wacht ca 7812 mal pro sekunde auf und schläft wieder ein Falsch! alle 1/7812 s wird der Timer um 1 erhöht. Wenn er dann von 255 auf 0 geht, gibt es den Overflow Interrupt, der den µC wieder aufweckt. Also 7812 / 256 = 30,5. Ist aber immer noch zu oft. Sebastian Albrecht schrieb: > welche version ist besser ? Die Frage stellt sich eigentlich gar nicht. Der beste Sleepmode ist der Power-down gefolgt vom Power-save. Im Power-down hast du nur den Watchdog als Timer, im Power-save zusätzlich noch den Timer 2. Darauf bezog sich auch meine Frage weiter oben, ob noch Platz für einen Uhrenquarz ist. Damit kann man den Timer2 extern takten. Der CPU-Takt wird dann im Power-save abgeschaltet. Da der Quarz nur 32,768 KHz hat, wird der Controller bei einem Prescaler von 1024 alle 8 Sek. aufgeweckt. Man kann ihn auch jede Sekunde aufwecken, damit hat man eine sekundengetaktete Echtzeituhr. Dafür ist das wohl auch hauptsächlich gedacht. Zweite Möglichkeit: Power-down-Mode. In diesem Modus gibt es gar keinen Takt mehr, ausser dem Watchdog. Diesen kann man auch als Timer betreiben und den Sleepmode ebenfalls alle 8 Sek. oder kürzer unterbrechen. Welcher dieser beiden Modi nun weniger Strom verbraucht, müsste man ausmessen, da der Watchdog-Timer auch ein wenig Strom verbraucht. Das sind die beiden Varianten, mit dem geringsten Stromverbrauch. Für die Power-down mit Watchdog hast du alles drin. Die Power-safe braucht noch einen Quarz. Initialisierung: //Power Down set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); //--- //Watchdog Interval Timer WDTCSR |= (1<<WDCE) | (1<<WDE); //Enable Watchdog(Reset) MCUSR &= ~(1<<WDRF); //Clear WDRF in MCUSR WDTCSR |= (1<<WDCE); //Watchdog Change Enable WDTCSR = 0x46; //Enable Interrupt, Disable Reset, Prescaler 1s //--- sei(); In der main: while (true) { sleep_cpu(); //Tu was // // } ISR: ISR(WDT_vect) { //Tu was oder tu nichts } mfg.
Na das ist ja mal ne tolle Antwort! Das werde ich morgen gleich mal umsetzen. Ich bin schon sehr froh auf einem mega88 die sdkarten tools und die ds1820 untergebracht zu haben. Jetzt habe ich noch 30% Flash frei. Jetzt kommt noch der Power Save dazu. Was später auch noch kommt ist ein rtc. Rtc deshalb um in den logfiles Datum und Zeit zu haben. Über diesen rtc kann man glaube ich auch den Power Save machen. Aber bis dahin mache ich das mit dem watchdog. Danke nochmal Mir fallen jeden Tag neue Projekte mit den Atmegas ein. Das sind tolle Produkte und endlich eine Verbindung zwischen meiner Elektronik und EDV. Grusse sebastian Vom iPhone mit Tippfehlern :))
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.