ATmega128 geht nicht in sleep

Gast #325388
Lesenswert?
• ▲
▼
Hallo
ICh hab folgendes Problem:

Mein uC braucht im "normalen" Betrieb rund 100mA. Nun möchte ich
Strom sparen und verwende daher den Power-down-Modus.
Dabei sollte der uC per LowLevel schlafen gehen. Ich habe allerdings
dann mal mit einem Multimeter nachgemessen und der uC braucht immer
noch 100mA.
Interrupt 2 ist mit LowLevel eingestellt!
M103C Fuse deaktiviert!


In Init: MCUCR=0x10;  //power-down modus auswählen
#asm("sei");

interrupt [EXT_INT2] void ext_int2_isr(void)
{
MCUCR=0x30;      //power down modus UND SE-Bit (sleep enable) gesetzt
#asm("sei");     //globales INT Enable, damit AufweckInterrupt
möglich ist
#asm("sleep"); //Asm-Befehl damit sleep ausgeführt wird
}
Gast #325392
Lesenswert?
• ▲
▼
@benedikt:
da ist was wahres dran, muss ich gestehen.

Aber im Moment hab ich leider keinen Plan wie ich es sonst machen
sollte.
Denn sobald der INT2 ausgelöst wird, werden das
GlobalInterruptEnableFlag deaktiviert. D.h. er kann nicht mehr via
Interrupt aufwachen, da dieser ja deaktiviert ist. Deshalb auch das
#asm("sei"); in der ISR des INT2
Gast #325394
Lesenswert?
• ▲
▼
Ich glaube wir reden irgendwie aneinander vorbei ;)

>>sobald er wach ist, ist er wach
???

Jedenfalls will ich das der uC bei LowLevel schlafen geht und erst bei
einem High-Signal wieder aufwacht. Das High-Signal wird mit Hilfe eines
Inverters auf Low-Level umgewandelt und löst dann den entsprechenden INT
3 (LevelInterrupt) aus. Das Aufwachen ist im Moment gar nicht das
Problem, sondern er sollte überhaupt erst einmal schlafen gehen und das
eben über INT2 LowLevel.

Wenn jetzt Low-Level anliegt dann wird der INT2 ausgelöst => sleep wird
aktiviert. Okay und dann tritt eben das Problem auf auf das Benedikt
hingewiesen hat. INT2 wird dauernd ausgelöst.

Ich versteh immer noch nicht ganz, wie ich sonst den sleep starten
sollte, wenn nicht in der ISR des INT2.
Gast #325395
Lesenswert?
• ▲
▼
Kann man INT2 auf flankengetriggert schalten ?
Falls ja, dann tu das, und zwar auf die Steigende.
In er INT2 Routine fragst du ab, ob INT2 auf Flanke oder Level
Triggerung steht.
Steht der Int auf Flanke, setzt du ihn auf Low Level, dann sei und
sleep.
Steht der Int auf Low Level, setzt du den Interrupt auf steigende
Flanke.
Fertig.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.