IC aus dem Sleep Mode zurückholen?

Gast #682777
Lesenswert?

Hi Leute,

ich wollte in meine existierende Schaltung mit einem Atmega8 einen 
Sleep-Mode einbauen.
Ich habe dazu mal das Datenblatt gewälzt und einige Sleep-Modi gefunden.

Welcher von denen ist nun der stromsparenste?
Meiner Meinung nach der Power-Down Mode, oder?

Leider ist die Schaltung schon fertig aufgebaut, sodass ich mir die 
Taster nicht mehr frei auf die Pins legen kann. Daher die Frage:

Kann ich mit jedem Pin den IC aus dem Schlaf wecken?
Wenn ja, wie stell ich das an?

Laut Datenblatt funzen ja nur die INT0 und INT1 Pins.
Könnte ich vielleicht einfach noch eine kleine Freiverdrahtung von einem 
Taster zu INT0 machen, sodass mit einem Tastendruck aufgeweckt wird? 
Oder bekomm ich dann Probleme wenn der Taster wieder wie üblich arbeiten 
soll?

Wie stell ich das am besten an?

Gruß
Chris
Gast #682812
Lesenswert?

Hi, Chris,

Du: "Welcher von denen ist nun der stromsparenste?
Meiner Meinung nach der Power-Down Mode, oder?"

Korrekt beim AVR.

Du: "Kann ich mit jedem Pin den IC aus dem Schlaf wecken?"

Jeder Interrupt holt ihn aus dem Koma. Er läuft bis zum neuen Sleep.

Jeder Interrupt funktioniert - aber wenn alle Taktgeber still sind, dann 
nur mit statischen Interrupts wie INT0, INT.


Ciao
Wolfgang Horn
Moderator Persönliche Seite #682947
Lesenswert?

Chris wrote:

> Ok, würde es dann gehen wenn ich noch ein Drähtchen von INT0 zu einem
> anderen Eingang lege?

Vorausgesetzt, der Schalter schaltet nach low, sodass du einen
pegelgesteuerten Interrupt benutzen kannst.  Die flankengesteuerten
Interrupts brauchen beim ATmega8 für die Flankenerkennung einen
laufenden IO-Takt, den du im Sleep nicht hast.  Der pegelgesteuerte
Interrupt wiederum existiert nur mit low-Pegel.

> Dann könnte ein Button/Taster den IC aufwecken, wenn er betätigt wird.
> Aber ich hab halt bischen Bedenken dass es Probleme gibt, wenn quasi 2
> Eingänge parallel geschaltet werden.

Zwei Eingänge kannst du problemlos parallel schalten.

Wenn du den ATmega8 durch einen ATmega88 ersetzen kannst, dann kannst
du stattdessen auch gleich mit einem pin change interrupt arbeiten.
Gast #682978
Lesenswert?

Hey dieser "Pin-Change" Interrupt klingt gut...

Der Läuft laut Datenblatt mit PCINT0 - da hängt sowieso schon ein Button 
von mir drann.

Also ich habe für die Buttons die internen Pullups an und der Button 
zieht den Anschluss auf GND beim drücken.
Dann sollte das funktionieren, oder?

Tauschen dürfte kein Problem sein, habe einen Sockel eingelötet, die 
Pinconfig schaut identisch aus, sodass das klappen könnte.

Danke ersteinmal. Wenn ich noch mal Probleme mit dem aufwecken bekomm 
meld ich mich nochmal.

Werd das jetzt mal so probieren.

Gruß
Chris
Moderator Persönliche Seite #684224
Lesenswert?

Chris wrote:

> Also ich habe für die Buttons die internen Pullups an und der Button
> zieht den Anschluss auf GND beim drücken.
> Dann sollte das funktionieren, oder?

Dann funktioniert es auch mit dem pegelgesteuerten mit einem ATmega8
(natürlich musst du dann noch einen Draht ziehen).

Der pin change interrupt unterbricht bei jeglicher Flanke, wenn er
denn aktiviert ist.  Den würde ich sofort nach dem Aufwachen in
der ISR wieder deaktivieren.
Gast #692192
Lesenswert?

Hi, also ich hab jetzt den Atmega 8 gelassen, da es mit dem Zurückholen 
an Int0 gut funktioniert hat.

Beim Atmega88 sind die Timer in anderen Registern etc. da hätte ich viel 
Quelltext ändern müssen.

Auf jeden Fall habe ich jetzt noch eine Strippe gezogen von Int0 zu 
meinem Button und es klappt einwandfrei.

Danke Leute.

Gruß
Chris
#1234729
Lesenswert?

hallo.ich hab eine frage du den sleep mode:
ich möchte nach der initialisierung meinen controller in den sleep mode 
schicken.im schrittbetrieb des debuggers im AVR-Studio an betreffender 
stelle zeigt er mir dies auch an: "target hast entered sleep mode".
ein externer interrupt (IRQ6) soll nun den controller aufwecken und ihn 
dann im aktiven zustand lassen.
mein problem ist nun,dass mir der debugger manchmal anzeigt,dass mein 
target den sleepmode verlassen hat und dann geht er gleich wieder in den 
sleep mode!das soll er aber nicht!!!

was mache ich falsch?hab mir eigentlich entsprechenden beispielcode im 
tutorial angeschaut.

void appRouterTaskHandler(AppEvent_t event) // Eintritt Routerfunktion
{
 // IRQ6,steigende Flanke und ISR setzen:
 HAL_RegisterIrq(IRQ_6,IRQ_RISING_EDGE,meinInterrupt);
 HAL_EnableIrq(IRQ_6); // IRQ6 aktivieren
 sei();

 while(1) {
 set_sleep_mode(SLEEP_MODE_IDLE);
 sleep_mode();
 if(ISRvariable == 1)
 {  ...// führe mein Programm aus
 }
}

static void meinInterrupt() // ISR bei Highflanke Interrupt6
{
 ISRvariable = 1;
}
#1234739
Lesenswert?

Tommy Tacker wrote:
> mein problem ist nun,dass mir der debugger manchmal anzeigt,dass mein
> target den sleepmode verlassen hat und dann geht er gleich wieder in den
> sleep mode!das soll er aber nicht!!!

Das ist korrekt.
Nach dem Aufwachen läuft ja erstmal die interne Resetzeit ab. Ist dann 
der Low-Impuls schon vorbei, wird nicht der Interrupt ausgeführt.

Abhilfe wäre ein Pin-Change-Interrupt des ATmega48.


Peter
#1234769
Lesenswert?

mit Pin Change Interrupt meinst du z.B. für meinen Fall (ich hab einen 
ATmega1281) das Pin PCIE0 auf 1 zu setzen,da es für die Interrupts 7:0 
zuständig ist und ich Interrupt6 nutze,oder?

Ich verstehe das trotzdem nicht ganz:
Gerade als ich nochmal den Debuggmodus gestartet habe kamen auch wieder 
beide Meldungen ("Target entered sleep mode/left sleep mode") ohne das 
ich die Taste die an INT6 hängt gedrückt habe??

Aber vom Grundprinzip ist das Programm doch richtig von mir,oder?
da ich in der ISR "ISRvariable = 1" setze und nie wieder zurücksetze 
dürfte mein Controller auch nicht wieder in den sleep-mode gehen,oder?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren