mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny1616: Stromverbrauch im Sleepmode


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
int main()
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_cpu();
}

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

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Mark S. (voltwide)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst Du die Schaltung mal ohne den Attiny messen?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit "set sleep Mode" schaltest Du nicht die Peripherie ab. Das mußt Du 
manuelll machen.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Dirk (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;-)

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.