tiny13 stromaufnahme II

#939504
Lesenswert?

hi

laut Datenblatt soll der Tiny13 im power down mode 0.2 Mikroampere 
verbrauchen. Folgendes Testprogramm verbraucht jedoch ganze 2.6 
Mikroampere :
1
#include <avr/io.h> 
2
#include <stdint.h> 
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
#include <avr/sleep.h>
6

7
int x;
8

9
int main(void)
10
{
11

12
    sei();
13
  ACSR|=(1<<ACD);
14
  DIDR0|=(1<<AIN1D);
15
  DIDR0|=(1<<AIN0D);
16
  DIDR0|=(1<<ADC0D);
17
  DIDR0|=(1<<ADC1D);
18
  DIDR0|=(1<<ADC2D);
19
  DIDR0|=(1<<ADC3D);
20
  ADCSRA&=~(1<<ADEN);
21
         sleep_enable();
22
         set_sleep_mode(SLEEP_MODE_PWR_DOWN);
23
         sleep_cpu();
24
    while(1)
25
    { 
26
    }
27
}

Was könnte da noch laufen?


Danke

Dominik
#939649
Lesenswert?

Was hängt an den Pins? CMOS Pins auf Halbmast verbrauchen Strom, d.h. 
man sollte irgendwie dafür sorgen, dass die Pins entweder low oder high 
Pegel haben, aber nicht floaten. Und Strom sollte dabei natürlich nicht 
fliessen.

Also Pins wenn es passt als Ausgang setzen, oder extern irgendwas 
anschliessen, oder wenn offen die Pullups aktivieren.
#939689
Lesenswert?

an PB0 und PB3 hängen LEDs, an PB4 (Input) hängt im wesentlich nur ein 
Draht, bzw. ein durchtrennter Draht. Werden die Drahtenden nicht 
berührt, d.h. ist der Stromkreis offen, soll das Gerät einschlafen und 
bei Berührung aufwachen. An der Hardware kann es aber eigentlich nicht 
liegen, zumal ich den Schaltkreis von jemandem bekommen habe, der darauf 
vorher ein asm Programm laufen ließ welches tatsächlich nur 0.2 
mikroampere im powerdown Zustand benötigte.

Hab eben probehalber den internen pullup Widerstand für PB4 aktiviert, 
leider ohne Erfolg :(


EDIT: zum messen benutze ich das Voltcraft VC-20
#939830
Lesenswert?

Fabian B. wrote:
> mit einem Voltcraft VC-20?
> Das hat im Meßbereich 400µA eine Genauigkeit von +-2% plus 8 Digits. Und
> kalibriert isses sicher auch nicht...
> In dem Fall ist es eher ein Schätzeisen...
>
> Gruß
> Fabian

Kann mir nicht vorstellen, dass es etwas mit der Messgenauigkeit des 
Multimeters zu tun hat. Als noch besagtes asm Programm im Flash-Speicher 
war, hab ich mit dem gleichen MM gemessen und noch mit einem weiteren, 
geliehenen, und es wurden mir von beiden Geräten 0.2uA angezeigt.
Moderator (Firma: Titel) Persönliche Seite #940306
Lesenswert?

>...an PB4 (Input) hängt im wesentlich nur ein Draht,
>bzw. ein durchtrennter Draht...

So wird i.A. ein offener Eingang definiert, oder?
CMOS-Eingänge sollen nicht offen gelassen werden.

Wurde hier von Andreas Kaiser schon angesprochen:
>CMOS Pins auf Halbmast verbrauchen Strom, d.h. man sollte irgendwie
>dafür sorgen, dass die Pins entweder low oder high Pegel haben,
>aber nicht floaten.

Also:
Eingänge (zumindest hochohmig) auf irgendeinen definierten Pegel ziehen.
#940504
Lesenswert?

also, habe obigem Testprogramm jetzt folgendes hinzugefügt:

    DDRB=0xff;     // PB1-5 = Ausgang
    DDRB&=~(1<<4); // PB4 = Eingang
    PORTB|=(1<<4); // Pullup für Eingang

Mehr I/O pins gibt`s auf dem tiny13 ja nicht.

Das MM werde ich nachher auf jeden Fall noch mal genau überprüfen und 
mir vielleicht noch eins vom Nachbar leihen, sobald der wieder da ist.
#942931
Lesenswert?

So, hab jetzt das Sourcefile des asm-Programms besorgt, möchte aber noch 
mal Rücksprache mit dem Autor halten, bevor ich es hier veröffentliche. 
In jedem Fall zeigt das MM bei dem asm-Programm nach wie vor 0.2mA an, 
somit kann es daran schon mal nicht liegen. :(
#942993
Lesenswert?

@  Dominik Hensler (xcc)

>In jedem Fall zeigt das MM bei dem asm-Programm nach wie vor 0.2mA an,

Das sind 200uA.

>somit kann es daran schon mal nicht liegen. :(

Was bezweifelt werden darf. In deinem ersten Posting hiess es noch

"verbrauchen. Folgendes Testprogramm verbraucht jedoch ganze 2.6
Mikroampere :"

Kann es ein, dass du mit Mikro und Milliampere nicht so ganz klar 
kommst?

MFG
Falk

P.S. Ich hab mal an nem Mega32 bzw. Tiny2313 mit ner UltrabilligGurke 
von Volkraft gemessen, kleinster Messbereich 2000uA (Mikro Ampere). Dort 
sieht man im Power Down etwa 1uA MIKRO Anzeigewert. Wieviel es WIRKLICH 
sind kann ich mangels sicherer Vergleichsmessung mit einem guten 
Messgerät nicht sagen. Aber ich glaube Atmel da einfach mal.

Wenn du WIRKLICH 2.6uA (MIRKO) misst, und doch schon alles abgeschaltet 
hast, ist es wahrscheinlich ein Kriechstrom, verurscht durch Dreck, Fett 
oder Flussmittel. Wenn den Tiny gesockelt ist, zieh den mal raus und 
miss nochmal den Rest der Schaltung + Platine.
#943049
Lesenswert?

Falk Brunner wrote:
> @  Dominik Hensler (xcc)
>
>>In jedem Fall zeigt das MM bei dem asm-Programm nach wie vor 0.2mA an,
>
> Das sind 200uA.
>
>>somit kann es daran schon mal nicht liegen. :(
>
> Was bezweifelt werden darf. In deinem ersten Posting hiess es noch
>
> "verbrauchen. Folgendes Testprogramm verbraucht jedoch ganze 2.6
> Mikroampere :"
>
> Kann es ein, dass du mit Mikro und Milliampere nicht so ganz klar
> kommst?
>
> MFG
> Falk
>

Nein, das war schlicht ein Tippfehler. Sollte uA heißen.


> P.S. Ich hab mal an nem Mega32 bzw. Tiny2313 mit ner UltrabilligGurke
> von Volkraft gemessen, kleinster Messbereich 2000uA (Mikro Ampere). Dort
> sieht man im Power Down etwa 1uA MIKRO Anzeigewert. Wieviel es WIRKLICH
> sind kann ich mangels sicherer Vergleichsmessung mit einem guten
> Messgerät nicht sagen. Aber ich glaube Atmel da einfach mal.
>
> Wenn du WIRKLICH 2.6uA (MIRKO) misst, und doch schon alles abgeschaltet
> hast, ist es wahrscheinlich ein Kriechstrom, verurscht durch Dreck, Fett
> oder Flussmittel. Wenn den Tiny gesockelt ist, zieh den mal raus und
> miss nochmal den Rest der Schaltung + Platine.

Der Tiny ist nicht gesockelt, und ich messe tatsächlich 2.6 Mikroampere. 
Dass ein Kriechstrom die Ursache ist, halte ich für ausgeschlossen, da 
ich ja wie gesagt nach aufflashen des alten asm-Programms eine 
Stromaufnahme von nur 0.2uA messe.
#943308
Lesenswert?

Ja, davon gehe ich auch aus. Aber was kann es nur sein?

ADC: Ausgeschaltet durch ADCSRA&=~(1<<ADEN);
AC : Ausgeschaltet durch ACSR|=(1<<ACD);
Bei beiden wäre die Stomaufnahme sowieso wesentlich höher als 
2.6uA-0.2uA.
Browout Detector: Kann nur durch Fusebit aktiviert werden
Watchdog: Per default aus, außerdem wäre Stromaufnahme höher.
Inner Voltage Reference: Muss aus sein, da AC und ADC aus sind.
Digitaler Input:
  DIDR0|=(1<<AIN1D);
  DIDR0|=(1<<AIN0D);
  DIDR0|=(1<<ADC0D);
  DIDR0|=(1<<ADC1D);
  DIDR0|=(1<<ADC2D);
  DIDR0|=(1<<ADC3D);
einschleißlich Puffer ausgeschaltet.
Port Pins:     DDRB=0xff;     // PB1-5 = Ausgang
               DDRB&=~(1<<4); // PB4 = Eingang
               PORTB|=(1<<4); // Pullup für Eingang
Vier von fünf Pins sind Ausgänge, einer ist als Eingang konfiguriert. 
Wüsste nicht, was da noch Strom ziehen sollte?

Vielleicht irgendeine besonderheit in der sleep_cpu funktion, die ich 
nicht beachtet hab?
#943353
Lesenswert?

@Dominik Hensler (xcc)

>Port Pins:     DDRB=0xff;     // PB1-5 = Ausgang
>               DDRB&=~(1<<4); // PB4 = Eingang
>               PORTB|=(1<<4); // Pullup für Eingang
>Vier von fünf Pins sind Ausgänge, einer ist als Eingang konfiguriert.
>Wüsste nicht, was da noch Strom ziehen sollte?

Hmm, kann es ein, dass du für den einen Eingang mit interen Pull-Up die 
Digital Disable Funktion NICHT nutzen darfst, weil du sonst deinen 
Pull-Up auf Masse ziehst?

DIDR0|=(1<<ADC2D);

Das würde ich mal rausnehmen.

MFG
Falk
#943494
Lesenswert?

Volker wrote:
> Dominik Hensler wrote:
>>So, hab jetzt das Sourcefile des asm-Programms besorgt,...
>
> Wo liegt dann das Problem?

Bin gerade dabei, das Assembler Programm nach Auffälligkeiten zu 
durchsuchen. Ist aber ein ziemlicher Brocken, nicht kommentiert, und 
meine ASM-Kentnisse sind eher bescheiden.
#943871
Lesenswert?

So, habe jetzt die Genehmigung des Autors das Programm zu 
veröffentlichen (-> Anhang).
Beide Programme, obiges und das angehängte, benutzen die gleiche 
Schaltung, eines hat eine Stromaufnahme von 2.6uA, das andere eine von 
0.2uA.


Zur Schaltung: An dem Tiny13 befinden sich zwei LEDs, eine an PB0, die 
andere an PB3. An PB4 (Eingang) befindet sich ein durchtrennter Draht 
als Auslöser.
Angehängte Dateien:
Gast #944694
Lesenswert?

>Für die Veröffentlichung so eines Codes hätte ich meine Genehmigung auch
>solange wie irgend möglich verweigert  ;-)

Ich bin auch mittlerweile schon kurz davor aufzugeben :/



Volker: Watchdog ist sowieso aus :)

Ich vermute mal, dass es entweder an der Konfiguration irgendeines Pins 
liegt, oder an der internen Referenz.
#946399
Lesenswert?

hab das Problem jetzt weiter eingegrenzt:


Folgendes ASM Programm geht mit einer Stromaufnahme von 0.1uA in den 
Schlafzustand:
1
.include "tn13def.inc"
2

3
    .CSEG    
4
    rjmp start
5
start:           nop
6
    nop
7
    cli
8
    ldi r16 ,LOW (RAMEND)
9
    out SPL ,r16
10
    ldi r16 ,0b00110000
11
    out MCUCR ,r16
12
    sleep


das gleiche in C und schon steigt die Stromaufnahme auf 2.6uA:
1
#include <avr/io.h> 
2
#include <stdint.h> 
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
#include <avr/sleep.h>
6

7

8
int main(void)
9
{
10
   MCUCR=0b00110000; //SE(Sleep Enable) und SM1 bit(PWR_DOWN) in MCUCR setzen
11
   asm("sleep"); //inline asm, um auszuschließen, dass es etwas mit sleep_cpu() zu tun hat
12
   while(1)
13
   {
14
   }
15

16
return 0;
17
}


Seltsame Dinge gehen hier vor sich..
Gast #946595
Lesenswert?

Wenn ich dein C-Programm bei mir compiliere (avr-libc 1.6.2), dann 
initialisiert er in main nochmal den Stackpointer und zwar SPL und wie 
es aussieht SPH, obwohl es den beim Tiny13 laut meinem Datenblatt gar 
nicht gibt. Somit schreibt er in ein reserviertes Register (0x3e) den 
Wert 0.
Keine Ahnung ob es was damit zu tun hat, ich kann es auch nicht selbst 
überprüfen da ich keinen Tiny13 habe.

Versuch doch mal folgendes:
1
int main(void) __attribute__((naked)); \
2
int main(void)
3
{
4
 ...
5
}
#946600
Lesenswert?

Volker wrote:

> Wenn ich dein C-Programm bei mir compiliere (avr-libc 1.6.2),

Die avr-libc compiliert nichts, das tut der Compiler. WinAVR 20080610 
(gcc 4.3.0) jedenfalls lässt innerhalb von main() SP in Frieden.

Und die Runtime davon (das jetzt ist die avr-libc) initialisiert nur 
SPL.

main() sieht dabei so aus:
00000048 <main>:
  48:   80 e3           ldi     r24, 0x30       ; 48
  4a:   85 bf           out     0x35, r24       ; 53
  4c:   88 95           sleep
  4e:   ff cf           rjmp    .-2             ; 0x4e <main+0x6>
Gast #946870
Lesenswert?

>@xcc: probiers doch mal mit den Sleep-Macros aus der sleep.h anstatt mit
>dem inline asm Befehl. Ich komme jedenfalls bei mir mit C auf ca 300nA.

schon geschehen, hab sowohl versucht sleep_enable(), set_sleep_mode() 
und sleep_cpu() zu verwenden, als auch in obigem Programm nur das 
asm-sleep durch sleep_cpu() zu ersetzen. Ob ich die Makros aus sleep.h 
benutze oder nicht, solange ich winavr/avr-gcc verwende komme ich immer 
auf 2.6uA. Nicht so mit AVR-Studio und reinem Assemler.
Persönliche Seite #1085316
Lesenswert?

Dominik Hensler wrote:
> hi
>
> laut Datenblatt soll der Tiny13 im power down mode 0.2 Mikroampere
> verbrauchen. Folgendes Testprogramm verbraucht jedoch ganze 2.6
> Mikroampere

Und mit was hast Du das bittesehr gemessen und vor allem: wie? Hast Du 
nur die Leistungsaufnahme des AVR selber gemessen? Dir ist hoffentlich 
klar dass Du dazu ein Messgeraet mit entsprechender Genauigkeit 
brauchst. Und die Leistungsaufnahme ist auch immer vom Systemtakt 
abhaengig. Fuer welchen Systemtakt sind die 0.2uA angegeben?
#1085332
Lesenswert?

Michael G. wrote:
> Und die Leistungsaufnahme ist auch immer vom Systemtakt
> abhaengig. Fuer welchen Systemtakt sind die 0.2uA angegeben?

Na mal wieder die Finger nicht ruhig halten können vor dem Einschalten 
des.....
Anstatt hier wieder Blödsinn zu verbreiten hättest du selber auch mal 
nachsehen können. Frage mich, was es DIR geholfen hätte, wenn du den 
Systemtakt dazugewußt hättest wenn es denn einen geben würde für diesen 
Fall.

@avion23:
Also im Powerdown-Mode ist überhaupt keine Taktquelle mehr aktiv, also 
ist auch der Strom in diesem Fall nicht vom Takt abhängig. Siehe 
Datenblatt S.30/31.

Solange du keine Vergleichsmessung machen kannst (wie oben im Thread), 
würde ich den Meßwert auch anzweifeln. Es sei denn, dein Meßgerät ist 
über alle Zweifel erhaben.
#1085340
Lesenswert?

Hallo,

@Michael G.: was hackt ihr eigentlich immer auf dem Messgerät rum?

Wenn ich in einer unveränderten Schaltung mit Software A den Stron x 
messe und mit Software B das gelicge Messgerät mehr als den 10-fachen 
Strom anzeigt, ist was seltsam.
Selbst dann, wenn das Baumarktteil statt µA mA oder kA anzeigt oder um 
50% abweicht.
Ich glaube auch nicht, daß es für den Threadstarter sonderlich wichtig 
ist, ob es 0,2µA oder 0,4µA sind und die 2,6µA vielleicht 2,0µA oder 
5,2µA sind.
Die Differenz ist einfach zu groß.

Ich habe letztens ähnliche Übungen mit einer Schaltung gemacht, mit 
einem Tiny85 und einer diskreten FET-Vollbrücke hintendran messe ich 
jetzt ca. 10µA, allerdings ist das für mich zum Glück völlig 
ausreichend.

Gruß aus Berlin
Michael
#1085365
Lesenswert?

Michael U. wrote:
> Ich glaube auch nicht, daß es für den Threadstarter sonderlich wichtig
> ist, ob es 0,2µA oder 0,4µA sind und die 2,6µA vielleicht 2,0µA oder
> 5,2µA sind.

Hast du Recht, aber men Posting bezog sich auf das Posting des 
Threadstarters sondern von avion23 (4 Postings back).
Außerdem auf die Bemerkung vom linuxgeek, der was von Taktfrequenz 
faselte.

Ansonsten stimme ich dir voll zu.
Gruß 900ss

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren