Forum: Mikrocontroller und Digitale Elektronik ATTINY13V Sleepmode Problem: uC zieht 0,5mA?!


von Marco .. (tuding)


Lesenswert?

Hallo Leute,

ich habe eine kleine Fernbedienung mit nem tiny13v aufgebaut und bin 
wegen dem Stromverbrauch am verzweifeln.

Kurz zum System:

- Stromversorgung: Litium-Batterie CR2025 (170mAh), 3V
- uC: Watchdog-Timer wird verwendet als Interrupt (WDT Always Enable 
Fuse nicht programmiert), Int. RC Clock 4.8MHz, Brown-Out disabled
- Programmierung in AVR-GCC
- Keine ext. Peripherie, keine R,C,L's, nur zwei Taster und eine LED 
ohne Vorwiderstand (uC schaltet High-Active)

Ausschnitt Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

int main(){

  DDRB   = (1<<PB0) | (1<<PB1) | (1<<PB2);
  PORTB |= (1<<PB3) | (1<<PB4);
  PCMSK  = (1<<PCINT3) | (1<<PCINT4);
  GIMSK |= (1<<PCIE);
  ACSR = 0x80;
  sei();

while(1){
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_mode();
  }
  return 0;
}

ISR(WDT_vect) { /* ... */ }

ISR(PCINT0_vect) { /* WDT wecken, ... */ }


Der uC soll immer im Sleep sein, bis ein PCINT oder der Watchdog 
Interrupt aufweckt (letzterer wird in PCINT jeweils gestartet oder 
beendet). Alles klappt ganz gut und der uC scheint auch in den Sleep zu 
gehen (Idle Stromverbrauch ca. 2mA), er zieht aber dann noch satte 
500uA! Deaktivieren von Pullups, externe 1MOhm-Pullups hat daran nichts 
geändert.

Ich möchte die Stromaufnahme mindestens um den Faktor 10 verkleinern, 
sonst wird mir die Litium-Batterie in ein paar Tagen leergesaugt.

Habe ich was wichtiges vergessen? Hat jemand Lösungsansätze?

Viele Grüße

Marco

von Falk B. (falk)


Lesenswert?

@  Marco G. (tuding)

>- Keine ext. Peripherie, keine R,C,L's, nur zwei Taster und eine LED
>ohne Vorwiderstand (uC schaltet High-Active)

Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu 
können?

>Habe ich was wichtiges vergessen? Hat jemand Lösungsansätze?

siehe Sleep Mode

Mfg
Falk

von Nicolas S. (Gast)


Lesenswert?

Wie mißt Du 500µA gepulst?

Grüße
Nicolas

von Marco .. (tuding)


Lesenswert?

> Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu
> können?

Die verwendete LED ist eine IR-LED, die mit 40kHz angepulst wird. Laut 
Datenblatt hält die bis zu 500mA gepulst aus. Da der uC die LED positiv 
treibt, kommen eh nicht so viel durch.

> siehe Sleep Mode

Den Beitrag habe ich gelesen, habe aber nichts gefunden, was ich nicht 
schon beachtet hätte.

von Peter D. (peda)


Lesenswert?

Marco G. schrieb:
> Ausschnitt Code:

D.h. Dein Fehler liegt im nicht geposteten Teil.

Wozu der Watchdog?
Warscheinlich macht der alle 15ms ein Reset und das ergibt dann den 
Verbrauch.

Schalte alles ab und wache nur mit dem Pin-Change-Interrupt auf.
Die Pullups dafür mußt Du natürlich an lassen.


Peter

von Marco .. (tuding)


Lesenswert?

> Wie mißt Du 500µA gepulst?

Ich messe direkt zwischen -Pol Batterie zu Massefläche des Systems die 
Stromaufnahme mit einem 3,5 Digit Multimeter. Die Stromaufnahme bleibt 
konstant bei 500µA während des Sleep, wenn ich ne Taste drücke und den 
µC aufwecke, fließt natürlich kurzzeitig ein höherer Strom. Lasse ich 
die Taste los geht der µC wieder auf die 500µA zurück.

von Marco .. (tuding)


Lesenswert?

> Wozu der Watchdog?
> Warscheinlich macht der alle 15ms ein Reset und das ergibt dann den
> Verbrauch.

Das wird in einem PCINT gesetzt:
WDTCR = (1<<WDTIF) | (1<<WDTIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);

Wie ich oben beschrieben habe, wird der Watchdog nicht zum Reset, 
sondern als Interruptquelle verwendet.

von Peter D. (peda)


Lesenswert?

Marco G. schrieb:
> Das wird in einem PCINT gesetzt:
> WDTCR = (1<<WDTIF) | (1<<WDTIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);

Willst Du Dir jetzt jedes relevante Code-Puzzleteilchen einzeln aus der 
Nase ziehen lassen?

Und lies endlich mal, was über dem Postingfenster steht (Formatierung).


Peter

von Marco .. (tuding)


Lesenswert?

> Willst Du Dir jetzt jedes relevante Code-Puzzleteilchen einzeln aus der
> Nase ziehen lassen?

Viel mehr steht ja nicht im Programm. Für meine Begriffe habe ich im 
ersten Posting alles verständlich erklärt.

Habe jetzt auch in der Initialisierung den ADC nochmal explizit 
ausgeschaltet und den WDT Null gesetzt:
1
  ADCSRA &= ~(1<<ADEN);
2
  WDTCR = 0x00;

Damit bin ich alle Punkte im Datenblatt in Section 7.2 Minimizing Power 
Consumption durchgegangen, die Stromaufnahme ist aber gleich 
geblieben...

Marco

von Nicolas S. (Gast)


Lesenswert?

Marco G. schrieb:
> Ich messe direkt zwischen -Pol Batterie zu Massefläche des Systems die
> Stromaufnahme mit einem 3,5 Digit Multimeter. Die Stromaufnahme bleibt
> konstant bei 500µA während des Sleep, wenn ich ne Taste drücke und den
> µC aufwecke, fließt natürlich kurzzeitig ein höherer Strom. Lasse ich
> die Taste los geht der µC wieder auf die 500µA zurück.

Hmmmmmmmmmm....... also irgendwie sträubt sich alles in mir zu glauben, 
daß ein Baumarktmultimeter soetwas halbwegs richtig anzeigt. Zumal 
mangels Parallelkondensatoren die Stromaufnahme wirklich sehr stark 
gepulst sein dürfte. Hast Du einen Oszi zur Hand, mit dem Du die 
Kurvenform der Stromaufnahme bestimmen kannst?

Grüße
Nicolas

von Marco .. (tuding)


Lesenswert?

> Zumal mangels Parallelkondensatoren die Stromaufnahme wirklich sehr stark
> gepulst sein dürfte. Hast Du einen Oszi zur Hand, mit dem Du die
> Kurvenform der Stromaufnahme bestimmen kannst?

Habe einen 10µF Elko parallel zur Batterie geschaltet und gemessen, kein 
unterschied in der Stromaufnahme. Oszi habe ich leider keins zur Hand. 
Ein Indiz, dass der µC wirklich viel zu viel Strom nimmt ist, dass die 
Batteriespannung innerhalb von 3-4 Tagen auf 2,7 Volt abgefallen ist - 
150mAh sind eben auch bei 0,5mA schnell leergezogen...

von Marco .. (tuding)


Lesenswert?

Hab nochmal ein Minimalbeispiel, falls jemand testen möchte:
1
#define F_CPU 4800000
2
 
3
#include <avr/io.h>
4
#include <avr/sleep.h>
5
6
int main (void) {
7
8
  DDRB = 0xFF;
9
  PORTB = 0x00;
10
11
  while(1) {
12
  
13
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
14
  sleep_mode();
15
16
  }
17
  return 0;
18
}

Stromaufnahme 500µA bei 2,8V Versorgungsspannung.

Fuses:

Low Fuse: SPIEN = 0 und 4,8MHz
High Fuse: Alles 1

Ich tippe mittlerweile auf defekten µC.

von Christian T. (erics)


Lesenswert?

Hast du die interne Voltage Reference für den ADC abgeschaltet?
Hast du die Portpins auf den Zustand gestellt, in dem sie am wenigsten 
Strom verbrauchen, bevor du in den Sleep Mode wechselst?
Watchdog sollte aus sein, da der ja im Power Down Mode weiterläuft. 
Kannst du einfach testen in dem du nach einem Resett einfach mal nen 
Portpin toggelst und schaust ob sich im Sleep Mode was an dem Pin tut.

von ´Dr.Schmock (Gast)


Lesenswert?

Wechsel mal die Zeile
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
aus und schreib lieber:

MCUCR = (1<<SE) | (1<<SM1);

Dann ist sicher, dass der richtige Modus eingestellt ist und das 
SleepEnable (SE) high ist.

von Christian T. (erics)


Lesenswert?

"A programmed DWEN Fuse enables some parts of the clock system to be 
running in all sleep modes. This will increase the power consumption 
while in sleep. Thus, the DWEN Fuse should be disabled when debugWire is 
not used."

Wenn du Debugwire nutzt braucht der Tiny auch mehr Strom im Sleep.

von Rolf Magnus (Gast)


Lesenswert?

Marco G. schrieb:
>> Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu
>> können?
>
> Die verwendete LED ist eine IR-LED, die mit 40kHz angepulst wird. Laut
> Datenblatt hält die bis zu 500mA gepulst aus. Da der uC die LED positiv
> treibt, kommen eh nicht so viel durch.

Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt aber, 
daß man den nur mit 20 mA belasten darf?

von g457 (Gast)


Lesenswert?

Kurzer Test hier:

tiny13V mit obigem Programm (Marco G., 14:20), intern 8MHz mit CKDIV8 
(also 1MHz clock), 5V Versorgungsspannung, auf Brotbrett, keine 
Beschaltung ausser +Vcc und GND;

Gemessen in der Versorgungsleitung mit einem UT70A: 0.47µA - in sehr 
guter Übereinstimmung mit dem Datenblatt.

Entweder misst du Mist oder irgendwas anderes ist kaputt(tm).

HTH

von g457 (Gast)


Lesenswert?

s/8MHz/9.6MHz/g;s/1MHz/1.2MHz/g; ∗hüstel∗</Ingrid>

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt aber,
> daß man den nur mit 20 mA belasten darf?

Nein, bis 40 mA ("Absolute maximum ratings"), und bei Vcc = 2,7 V
und einer Flussspannung der IRED von vielleicht 1,5 V kommen laut
"Typical characteristics" so zwischen 15 und 20 mA da raus, das
passt schon.  Bei Vcc = 3,0 V werden's ein paar mA mehr sein, aber
trotzdem noch vertretbar.  Die Drainstrecke des FETs arbeitet bei
dieser Versorgungsspannung bereits nahezu im Konstantstrombereich
(flacher Kurventeil), bei noch geringeren Vcc ist das noch
ausgeprägter.

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Rolf Magnus schrieb:
>> Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt
>> aber, daß man den nur mit 20 mA belasten darf?
>
> Nein, bis 40 mA ("Absolute maximum ratings"),

Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA.

> und bei Vcc = 2,7 V und einer Flussspannung der IRED von vielleicht 1,5
> V kommen laut "Typical characteristics" so zwischen 15 und 20 mA da
> raus, das passt schon.

Ok. Das dürfte dann aber wiederum für eine Fernbedienung etwas wenig 
sein.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:

> Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA.

Was ist für dich "Normalbetrieb", und wo steht ein solcher Wert?

Dass es für die Benutzung als digitaler Ausgang nur Garantiewerte
bis 10 mA gibt, spielt doch hier keine Rolle, das heißt nur, dass
die High-Ausgangsspannung nur für diesen Strom getestet und vom
Hersteller garantiert wird.  Grenzwert gibt es nur den mit 40 mA
(und dann noch die 200 mA für die Vcc- und GND-Pins, aber das ist
hier auch kein Thema).

Ganz davon abgesehen will er die LED sowieso nur pulsen, da spielt
selbst die Wärmeentwicklung im IC keine Rolle mehr (die sonst noch
ein Grund sein könnte, dass man die Wärme lieber extern in einem
Vorwiderstand verheizt).

> Ok. Das dürfte dann aber wiederum für eine Fernbedienung etwas wenig
> sein.

Mehr bringt doch die popelige Knopfzelle sowieso nicht, selbst diesen
Strom kann man schon nur noch über einen guten Ladekondensator
aufbringen.  Diese Li-Knopfzellen sind nur für wenige mA Dauerstrom
konzipiert.

Keine Ahnung, wie effektiv IREDs dieser Tage so sind.

Wenn die Stromergiebigkeit nicht reicht, könnte er ja noch zwei
Pins parallel schalten.

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Rolf Magnus schrieb:
>
>> Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA.
>
> Was ist für dich "Normalbetrieb", und wo steht ein solcher Wert?

Normalbetrieb ist für mich der, auf den das hier nicht zutrifft: 
"Exposure to absolute maximum rating conditions for extended periods may 
affect device reliability."
Mit anderen Worten: Wenn man immer an die "absolute maximum ratings" 
geht, kann der µC davon kaputtgehen.
Die 20 mA scheinen tatsächlich so nicht im Datenblatt des Tiny13 zu 
stehen. Ich hatte das wohl aus dem Datenblatt eines anderen AVR, wo das 
explizit so steht.

von Marco .. (tuding)


Lesenswert?

Danke an alle die geholfen haben. Der Tiny hatte ne Macke. Habe mir 
Ersatz beschafft, das ursprüngliche Programm (erster Post) draufgeladen 
und gemessen. Das "Baumarktmultimeter" zeigte 0,001 µA. Ziel erreicht.

Warum der andere Tiny 500 mal mehr Strom gezogen hat - weiß der Geier. 
Ansonsten funktioniert der ja tadellos... Eigentlich total mist, dass 
man sowas nicht erkennen kann.

Viele Grüße an alle

Marco

von Falk B. (falk)


Lesenswert?

@  Marco G. (tuding)

>und gemessen. Das "Baumarktmultimeter" zeigte 0,001 µA. Ziel erreicht.

Du meinst sicher 0,001mA, sprioch 1µA. 0,001µA wären 1nA, und das kann 
dein 0815 Multimeter sicher nicht auflösen, noch braucht der Tiny Soooo 
wenig Strom.

MFG
Falk

von Marco .. (tuding)


Lesenswert?

Du hast recht, ich meinte 1µA.

Auch wenn das alte Multimeter nicht das tollste und beste ist, 
"Größenordnungen", d.h. ob eine Anwendung 500µA oder 10µA zieht, kann 
man damit durchaus gut bestimmen.

von Nicolas S. (Gast)


Lesenswert?

Hallo Marco,
ich wollte auch nie Dein Gerät bashen - letztendlich lag es daran ja 
auch nicht - sondern nur das Problembewußtsein schaffen. In der 
Größenordnung von Strom sind mir schon einige Multimeter begegnet, bei 
denen die angezeigte Stromstärke irgendwo zwischen "grob geschätzt" und 
"frei erfunden" einzuordnen war.

Marco G. schrieb:
> [...] d.h. ob eine Anwendung 500µA oder 10µA zieht, kann
> man damit durchaus gut bestimmen.

Kannst Du ernsthaft froh drüber sein. Bei zwei von dreien meiner ist das 
nur noch grobes Stellengewackel.

Viele Grüße
Nicolas

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.