Hallo,
ich versuche aktuell den Stromverbrauch meines Attiny1616 soweit, wie
möglich zu senken.
Laut Datenblatt soll er im Power Down Mode 0,1µA bei 3V benötigen.
Ich messe aktuell jedoch immer mindestens 270µA.
Die Messung erfolgt i.d.R. mit angeschlossenem Atmel ICE, ziehe ich den
ab, bleiben immer noch 200µA.
Hat jemand eine Idee, was ich vergessen oder übersehen haben könnte?
Main Clock läuft auf 20 MHz (hab auch schon den internen (Ultra Low
Power) 32kHz Takt verwendet, das macht allerdings keinen Unterschied.
Fuses sind alle im Auslieferungszustand, d.h. BOD und WDT sind auch
deaktiviert.
Das Programm besteht einfach nur aus folgenden Zeilen, es sollte also
sämtliche Peripherie deaktiviert sein.
1
intmain()
2
{
3
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
4
sleep_enable();
5
sleep_cpu();
6
}
Weiterhin ist für den Test keinerlei externe Beschaltung vorhanden (z.B.
Pullup am Reset)
Messfehler spielen eventuell auch mit rein, aber doch nicht um den
Faktur 2000?!
Viele Grüße
Dirk
Dirk schrieb:> ich versuche aktuell den Stromverbrauch meines Attiny1616 soweit, wie> möglich zu senken.
Was hast Du denn da außer dem Attiny1616 selbst noch am laufen?
Ein Spannungsregler mit hohem Eigenverbrauch, Leckströme etc. können
einem in der µA-Größenordung schon ordentlich in die Suppe spucken.
Vielleicht am besten den Schaltplan posten.
> Messfehler spielen eventuell auch mit rein, aber doch nicht um den> Faktur 2000?!
Wie und womit hast Du gemessen?
Gerd E. schrieb:> Was hast Du denn da außer dem Attiny1616 selbst noch am laufen?>> Ein Spannungsregler mit hohem Eigenverbrauch, Leckströme etc. können> einem in der µA-Größenordung schon ordentlich in die Suppe spucken.
Das meinte ich mit keine Zusatzbeschaltung. Der Attiny am Netzteil, mehr
nicht.
>> Wie und womit hast Du gemessen?
Mit meinem VC870.
> Kannst Du die Schaltung mal ohne den Attiny messen?
Wie gesagt, die Schaltung besteht aus dem Tiny am Netzteil.
Andreas B. schrieb:> Mit "set sleep Mode" schaltest Du nicht die Peripherie ab. Das> mußt Du> manuelll machen.
Ich weiß, aber die Peripherie ist per default aus und ich habe sie nie
aktiviert (der Code ist so, wie er da steht, auf dem Tiny)
Und selbst wenn, im Power Down Modus würde die Peripherie mit aus gehen.
Im Standby bleibt sie abhängig von den jeweiligen RUNSTBY Flags
aktiviert.
Ich habe jetzt das DB für diesen Tiny nicht durchgelesen, aber für die
anderen Tinys muß man die Peripherie (ADC ect.) explizit ausschalten.
Andere Möglichkeit: Du hast offene Eingänge und der uC wird durch diese
floatende Eingänge via IRQ wieder aufgeweckt.
Also vorher alle I/Os auf Ausgang setzen.
Andreas B. schrieb:> Ich habe jetzt das DB für diesen Tiny nicht durchgelesen, aber> für die> anderen Tinys muß man die Peripherie (ADC ect.) explizit ausschalten.
Bist du dir da sicher? Ich habe gerade nur mal in das DB vom Attiny841
geguckt, da ist auch alles (I2C, SPI) default deaktiviert.
> Andere Möglichkeit: Du hast offene Eingänge und der uC wird durch diese> floatende Eingänge via IRQ wieder aufgeweckt.
Das kann ich ausschließen, wenn ich mir noch zusätzliche Code einbaue,
der nach dem sleep_cpu() nen Pin auf High zieht, um zu messen, kommt da
nichts.
Außerdem spricht 270µA schon für "nicht an".
> Also vorher alle I/Os auf Ausgang setzen.
Ok, jetzt bin ich ein wenig Sprachlos. Habe einfach mal alles auf
Ausgang gesetzt, da verlässt der Verbrauch meinen Messbereich und zeigt
nur noch 0,0µA an.
Das Ergebniss ist auf jeden Fall erstmal grandios, danke dafür!
Aber: Es sind weder auf den Pins noch global Interrupts aktiviert, der
µC kann also nicht geweckt worden sein. Und es lässt sich ja, wie
erwähnt, auch nachweisen, dass er schläft.
Dirk schrieb:>> Also vorher alle I/Os auf Ausgang setzen.> Ok, jetzt bin ich ein wenig Sprachlos. Habe einfach mal alles auf> Ausgang gesetzt, da verlässt der Verbrauch meinen Messbereich und zeigt> nur noch 0,0µA an.>
Nicht ganz, 0,05µA ;)
Dirk schrieb:> Aber: Es sind weder auf den Pins noch global Interrupts aktiviert, der> µC kann also nicht geweckt worden sein. Und es lässt sich ja, wie> erwähnt, auch nachweisen, dass er schläft.
Offene Eingänge können schwingen, latchups erzeugen und viele unschöne
Dinge mehr. Daher grundsätzlich nichtbenutzte Eingänge auf Ausgang
schalten, pullup aktivieren oder extern auf definierten Pegel setzen.
Das gilt für alle digitalen Schaltungen, nicht nur uCs.
Dirk schrieb:> Bist du dir da sicher? Ich habe gerade nur mal in das DB vom Attiny841> geguckt, da ist auch alles (I2C, SPI) default deaktiviert.
Tiny25-85:
PRR – Power Reduction Register
The Power Reduction Register provides a method to reduce power
consumption by allowing peripheral clock sig-
nals to be disabled.
Bit 7 6 5 4 3 2 1 0
0x20 – – – – PRTIM1 PRTIM0 PRUSI PRADC
Read/Write R R R R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0
PRR
• Bits 7:4 – Res: Reserved Bits
These bits are reserved bits in the ATtiny25/45/85 and will always read
as zero.
• Bit 3 – PRTIM1: Power Reduction Timer/Counter1
Writing a logic one to this bit shuts down the Timer/Counter1 module.
When the Timer/Counter1 is enabled, opera-
tion will continue like before the shutdown.
• Bit 2 – PRTIM0: Power Reduction Timer/Counter0
Writing a logic one to this bit shuts down the Timer/Counter0 module.
When the Timer/Counter0 is enabled, opera-
tion will continue like before the shutdown.
• Bit 1 – PRUSI: Power Reduction USI
Writing a logic one to this bit shuts down the USI by stopping the clock
to the module. When waking up the USI
again, the USI should be re initialized to ensure proper operation.
• Bit 0 – PRADC: Power Reduction ADC
Writing a logic one to this bit shuts down the ADC. The ADC must be
disabled before shut down. Note that the ADC
clock is also used by some parts of the analog comparator, which means
that the analogue comparator can not be
used when this bit is high.
Muß nicht überall so sein. Ich habe mir angewöhnt alles grundsätzlich so
zu setzen wie ich es haben möchte. Ich gehöere aber auch zu den Leuten,
die Variablen in C auch mit 0 initialisieren. ;-)
Dirk schrieb:> Ich weiß, aber die Peripherie ist per default aus und ich habe sie nie> aktiviert (der Code ist so, wie er da steht, auf dem Tiny)
Er meinte wohl die Peripherie jenseits der Innereien des ATtiny selber.
Für die ist NIX garantiert. Jedenfalls nix, was nicht im DB der
jweiligen Peripherie steht. Dabei ist insbesondere zu berücksichtigen,
dass die allerwenigste Peripherie nach einem PowerUp inmittelbar in den
stromsparendsten Zustand geht. Nein, das genaue Gegenteil ist der
Regelfall, man muss sie erstmal aktiv dazu bewegen...
Aber auch der Tiny selber nimmt nicht automatisch den für den
Stromverbrauch günstigsten Zustand an. Das betrifft inbesondere alle
unbeschalteten IO-Pins. Die sind standardmäßig als "offener" Eingang
konfiguriert. Dank der ziemlich hohen Eingangsimpedanz sorgt dann jeder
EMV-Schmutz aus der Umgebung für ein lustiges Toggeln der Eingangsstufe,
was je nach Frequenz des dominierenden EMV-Signals für durchaus
merklichen Stromverbrauch sorgen kann.
Also: erste Maßnahme: alle unbenutzen Pins entweder hardwaremäßig auf
ein definiertes Potential legen (VCC oder GND ist egal) oder
softwaremäßig entweder als Ausgang konfigurieren (für stark
EMV-belastete Umgebungen) oder zumindest den PullUp aktivieren.
> Und selbst wenn, im Power Down Modus würde die Peripherie mit aus> gehen.
Lies' das verdammte Datenblatt, um eine Peilung für die Realität zu
bekommen. Längst nicht alles geht einfach aus im PowerDown. Garantiert
aus geht nur der IO-Takt. Für alles andere bist du selber
verantwortlich...