Forum: Compiler & IDEs IC aus dem Sleep Mode zurückholen?


von Chris (Gast)


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

von Wolfgang Horn (Gast)


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

von Chris (Gast)


Lesenswert?

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

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.

Oder geht das dann?

Gruß
Chris

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Chris (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Chris (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Chris wrote:

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

Hmm, lass mich raten, du programmierst in Assembler?  Unter C hättest
du nichts ändern müssen...

OK, wenn du mit dem zusätzlichen Draht leben kannst.

von Tommy T. (tommy776)


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;
}

von Peter D. (peda)


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

von Tommy T. (tommy776)


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?

von Peter D. (peda)


Lesenswert?

Das Aufwachen geschieht natürlich bei jedem kleinsten Störimpuls.

Deshalb ist die übliche Methode, daß man die CPU aufwachen läßt, den PCI 
sperrt, die Taste(n) per Timerinterupt entprellt und auswertet und nach 
ner Weile den PCI wieder freigibt und schlafen geht.


Peter

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.