Moin moin, Ich habe mit einem Mega16 ein kleines Gerät zum Betrieb am KFZ-Netz gebastelt. Funktioniert soweit - nur mit dem Stromverbrauch im sleep-Mode habe ich noch meine Probleme... Mit dem folgenden Code komme ich auf ca. 4mA Power-Down-Stromverbrauch (delay_ms ist eine selbstgeschriebene delay-Funktion, um über die Grenzen aus avr-libc zu kommen) wdt_enable(WDTO_2S); while(1) { delay_ms(1000); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); // reset the watchdog timer wdt_reset(); } Diese 4mA braucht hauptsächlich der 7805*, das LCD hat auch noch ein paar uA Ruhestrom, also OK. Wenn ich das jetzt in mein mehr oder weniger "fertiges" Programm einbaue, Wakeup über INT2, ADC, alle drei Timer... braucht die gleiche Schaltung ca. 12mA (ohne Sleep-Mode 30mA - also wird der definitiv aktiviert) Nun suche ich die MCU-Teile, die diese 8mA verbrauchen - folgendes habe ich schon getan: - BOD deaktiviert (muss ich aber wieder aktivieren, sonst geht mein EEPROM-Inhalt flöten) - Watchdog ist deaktiviert (will/muss ja über INT2 aufwachen) - Alle Ports auf Tri-State (DDRx = 0, PORTx = 0) - ADC aus (mittels ADEN = 0 in ADCSRA) - LCD abgesteckt (falls es sich nicht wieder 100% ausschalten lässt) Hilft alles nicht nennenswert. Im Datenblatt habe ich keine genaueren Infos dazu gefunden, was im Power-Down-Mode alles noch Strom verbraucht - alles was Takt braucht sollte ja aus sein... Würde einer von euch seine Erfahrung diesbezüglich mit mir teilen und mich davon befreien, jeden einzelnen Funktionsblock noch zu deaktivieren? Mein Dank und ein virtuelles Bier wären ihm sicher :) MfG, Heiko *den ich nebenbei bemerkt genau deswegen gerne ersetzen würde - hab nur noch nichts gefunden, was tatsächlich weniger Strom zieht UND ca. 150mA für LCD-Hintergrundbeleuchtung liefern kann, OHNE aufwändige Kühlung
Moin moin, ich kapier es mittlerweile nicht mehr - selbst wenn ich alle Hardware deaktiviere, inklusive Timer und allem, das "große" Programm zieht 12mA, obwohl keine Hardware im AVR genutzt wird. Nächster Versuch: Vor Eintritt in die while(1)-Schleife in der main()-Routine schlafen gehen. Kann ich leider erst Montag testen, bin derzeit nicht an der Hardware. Oder ich lebe damit - 12mA auf 50Ah sind ja durchaus noch tragbar. MfG, Heiko
Moin moin, so, weiterprobiert. Wenn ich den Code von oben an verschiedenen Stellen ins Hauptprogramm eingefügt habe, ging der Stromverbrauch auf die normalen 4mA runter. Also weiterprobiert. Mit folgendem Code im Hauptprogramm funktioniert es jetzt. else // still no power - really go to sleep while(PINB & (1<<PB2)) { delay_ms(10); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } Entscheidend dabei: Das Delay. Warum auch immer - aber unter 5ms Delay zieht der Prozessor im Sleep 12mA, bei mehr Delay 4mA. Grund? Keine Ahnung. Vor dem oberen Code deaktiviere ich den Watchdog, schalte das LCD ab, deaktiviere die PullUps und schreibe Daten ins EEPROM. MfG, Heiko
Hallo, hab jetzt nicht nachgelesen, aber wüste Vermutung: könnte es sein, das der ADC noch im Wandlerzyklus ist und dann nicht abgeschaltet wird? Gruß aus Berlin Michael
Möglich ist es - ich hatte den ADC allerdings probehalber auch mal deaktiviert. Kann natürlich sein, dass auch bei ADEN = 0 noch der Zyklus zu Ende läuft, bevor der ADC abgeschaltet wird... MfG, Heiko
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.