Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Sleep Mode(ATMega328P)


von Jan H. (jan_h865)


Lesenswert?

Guten Abend,
Ich hätte da ein kleines Problem. Und zwar möchte ich ganz gerne ein 
ATMega328P 5 Taster und 8 LED's möglichstes lange an einer 9V Batterie 
betreiben. Dazu habe ich mir gedacht. Ich setzte denn Controller direkt 
am Anfang in denn Power Down Modus. Und erst wenn man dann denn ON 
Button drückt, was zu gleich auch der OFF Button ist, ihn aus dem Power 
Down Modus hole. Ich habe mir diesen Artikel mehrmals durchgelesen:
https://www.mikrocontroller.net/articles/Sleep_Mode

Jedoch habe ich Problem das Beispiel: "Aufwachen per Tastendruck". Nach 
zu machen. Denn beim ATMega328P gibt es das GICR Register nicht. Ich 
kenne nur das EIMSK Register. Jedoch wenn ich das umsetzte(Mit EIMSK) 
wird der Controller auch in denn Power Down Modus gesetzt. Wenn ich denn 
"+" Button drückt leuchtet die "+" LED nicht. Nur wie hole ich ihn nun 
wieder aus dem Power Down Modus raus? Er soll halt geweckt werden so 
bald ich denn "ON" Button wieder drücke. Mein Controller läuft auf 
16Mhz.

Könnt ihr mir da weiter helfen?

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>ATMega328P 5 Taster und 8 LED's möglichstes lange an einer 9V Batterie
>betreiben.

Dann brauchst du erstmal einen sehr sparsamen Linearregler.

https://www.mikrocontroller.net/articles/Versorgung_aus_einer_Zelle#Vier_Mignonzellen_mit_LowDrop-Linearregler

>wieder aus dem Power Down Modus raus?

Mit dem passenden Interrupt, der natürlich eine ISR braucht und vor dem 
schlafen legen aktiviert werden muss. Siehe Artikel Sleep Mode.

> Er soll halt geweckt werden so
>bald ich denn "ON" Button wieder drücke. Mein Controller läuft auf
>16Mhz.

Ob man das für ein paar LEDs braucht?

>Könnt ihr mir da weiter helfen?

Zeig uns deinen Code.

von Karl M. (Gast)


Lesenswert?

Hi Jan,

die richtigen Register und deren Beschreibung steht im original 
Datenblatt des m328p.

Warum schaust du dort nicht nach.

Falk hat den Rest schon kommentiert, der Spannungsregler ist dein 1tes 
Problem.

von Jan H. (jan_h865)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> Dann brauchst du erstmal einen sehr sparsamen Linearregler.
>
> 
https://www.mikrocontroller.net/articles/Versorgung_aus_einer_Zelle#Vier_Mignonzellen_mit_LowDrop-Linearregler

Okay, zurzeit nutze ich denn LM7805. Werde mir aber mal ein anderen 
besorgen.

Falk B. schrieb:
> Mit dem passenden Interrupt, der natürlich eine ISR braucht und vor dem
> schlafen legen aktiviert werden muss. Siehe Artikel Sleep Mode.

Du meinst die ISR(INT0/INT1_vect) oder?

Falk B. schrieb:
> Ob man das für ein paar LEDs braucht?

Kommt daher weil ich diese mit dem Arduino Bootloader betreibe.

Falk B. schrieb:
> Zeig uns deinen Code.

Klar.

von Karl M. (Gast)


Lesenswert?

Jan H. schrieb:
>> Ob man das für ein paar LEDs braucht?
>
> Kommt daher weil ich diese mit dem Arduino Bootloader betreibe.

Wie das ?

Der Bootloader schaltet nicht deine LED, sondern ein Programm des 
Programmierers.

So einen m328p mit Bootloader kannst Du auch mit avrdude direkt nutzen.

von Karl M. (Gast)


Lesenswert?

Noch etwas, Du musst auch immer einen INT0 Request vor der Nutzung des 
INT0 Interrupts löschen!
Auch würde ich nach dem Aufwachen die globale Interrupt Freigabe 
löschen.
Dann den INT0 Interrupt deaktivieren und die Tasterauswertung vom 
zugehörigen Eingang aktivieren.

Zumindest dies fehlt bei Dir komplett !

von Jan H. (jan_h865)


Lesenswert?

Karl M. schrieb:
> Wie das ?
>
> Der Bootloader schaltet nicht deine LED, sondern ein Programm des
> Programmierers.
>
> So einen m328p mit Bootloader kannst Du auch mit avrdude direkt nutzen.

Falk B. schrieb:
>> Er soll halt geweckt werden so
>>bald ich denn "ON" Button wieder drücke. Mein Controller läuft auf
>>16Mhz.
>
> Ob man das für ein paar LEDs braucht?

Wies ja nicht worauf sie die Frage genau bezieht. Ich denke mal auf die 
16 Mhz. Und meine Atmega328p sind alle mit dem Arduino Bootloader mit 16 
Mhz ausgerüstet. Falls ich die Frage falsch verstanden habe. Bitte 
verbessern.

Karl M. schrieb:
> Noch etwas, Du musst auch immer einen INT0 Request vor der Nutzung des
> INT0 Interrupts löschen!
> Auch würde ich nach dem Aufwachen die globale Interrupt Freigabe
> löschen.
> Dann den INT0 Interrupt deaktivieren und die Tasterauswertung vom
> zugehörigen Eingang aktivieren.
>
> Zumindest dies fehlt bei Dir komplett !

Sorry verstehe ich nicht so ganz.

von Karl M. (Gast)


Lesenswert?

Jan H. schrieb:
> Karl M. schrieb:
>> Noch etwas, Du musst auch immer einen INT0 Request vor der Nutzung des
>> INT0 Interrupts löschen!
>> Auch würde ich nach dem Aufwachen die globale Interrupt Freigabe
>> löschen.
>> Dann den INT0 Interrupt deaktivieren und die Tasterauswertung vom
>> zugehörigen Eingang aktivieren.
>>
>> Zumindest dies fehlt bei Dir komplett !
>
> Sorry verstehe ich nicht so ganz.

Dann wäre es doch sinnvoll sich das Datenblatt zu nehmen und sich über 
die Interruptverarbeitung im Detail zu informieren.

Wenn Du den Taster ohne Power Down drückst, dann liegt immer ein INT0 
Interruptrequest vor.
Wird dann der INT0 Interrupt aktivieren, so wird sofort ! die zugehörige 
INT0 Interrupt Routine angesprungen. Pech gehabt..

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.