Forum: Mikrocontroller und Digitale Elektronik ATmega128 geht nicht in sleep


von Philipp (Gast)


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
}

von Benedikt (Gast)


Lesenswert?

Also wenn dein ATmega128 wirklich 100mA verbraucht, dann ist er defekt.

von Philipp (Gast)


Lesenswert?

Naja hab ich vielleicht falsch ausgedrückt. Mein Atmega128 mit gesamter
Schaltung rundherum!

Aber der Wert müsste trotzdem sinken, wenn ich in sleep gehe.

von Benedikt (Gast)


Lesenswert?

Irgendwie verstehe ich deine Software nicht:
Wenn due Int2 auf low legst, geht der uC schlafen und wacht sofort
wieder auf, da Int2 ja auf low liegt. Das ist doch sinnlos.

von Philipp (Gast)


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

von Benedikt (Gast)


Lesenswert?

Sobald er wach ist, ist er wach.

Irgendwo anderst muss der Interrupt aktiviert werden, und er dann
schlafen geschickt werden.

von Philipp (Gast)


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.

von Benedikt (Gast)


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.

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.