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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.