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