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 }
Also wenn dein ATmega128 wirklich 100mA verbraucht, dann ist er defekt.
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.
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.
@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
Sobald er wach ist, ist er wach. Irgendwo anderst muss der Interrupt aktiviert werden, und er dann schlafen geschickt werden.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.