mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA88 + Sleepmode + Timer + Taster --> wie geht das


Autor: Sebastian Albrecht (xxlxx)
Datum:

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

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sebastian,

mir hat der Artikel weiter geholfen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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!

Autor: Guter Rat (Gast)
Datum:

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

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Ja meine Schaltung atmega88 + ds1820 + sd Karten funktioniert schon.

Wie ist denn deine Schaltung getaktet? Intern oder mit Quarz?
Welche Batteriespannung?

mfg.

Autor: Sebastian Albrecht (xxlxx)
Datum:

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

Autor: Sebastian Albrecht (xxlxx)
Datum:

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

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Autor: Guter Rat (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Sebastian Albrecht (xxlxx)
Datum:

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

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Sleep Mode

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.