Forum: Compiler & IDEs tiny13 stromaufnahme II


von gone g. (xcc)


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

von Benedikt K. (benedikt)


Lesenswert?

Watchdog usw. ?

von Falk B. (falk)


Lesenswert?


von gone g. (xcc)


Lesenswert?

ACD ist aus
AC ist aus
Watchdog ist aus
Timer ist aus
Digitaler Input ist aus (auch Puffer)
Brownout Detector ist aus
AD-Ref. muss aus sein, da von keinem Gerät verwendet

von Fabian B. (fabs)


Lesenswert?

Womit misst du die 2,6µA?

Gruß
Fabian

von Gast (Gast)


Lesenswert?

Leckströme in Elkos/Kondensatoren der Betriebsspannung?

von Andreas K. (a-k)


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.

von gone g. (xcc)


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

von Fabian B. (fabs)


Lesenswert?

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

von gone g. (xcc)


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.

von Werner A. (homebrew)


Lesenswert?

du könntest es ja zumindest mal mit ner bekannten Spannung und 
Widerstand überprüfen. Dann hast du zumindest die Gewissheit, das nicht 
daran liegt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ok, ok, wer lesen kann ist klar im Vorteil.
>...Widerstand für PB4 aktiviert, leider ohne Erfolg :(

Wie sieht es mit den anderen Pins aus?
Irgendwelche offene Eingänge?
Unbenutzte (offene) Pins am besten als Ausgang definieren.

von gone g. (xcc)


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.

von Micha (Gast)


Lesenswert?

Wie sieht denn das ASM-Programm aus? Gibt's da noch den Source bzw. ein 
Hex-File, das man eventuell dissassemblieren köännte?

von gone g. (xcc)


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. :(

von Falk B. (falk)


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.

von gone g. (xcc)


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.

von Falk B. (falk)


Lesenswert?

@Dominik Hensler (xcc)

>ich ja wie gesagt nach aufflashen des alten asm-Programms eine
>Stromaufnahme von nur 0.2uA messe.

Dann ist es zu 99% ein Softwarefehler. Nochmal GENAU prüfen.

MfG
Falk

von gone g. (xcc)


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?

von Falk B. (falk)


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

von gone g. (xcc)


Lesenswert?

Leider keine Veränderung :/

von Volker (Gast)


Lesenswert?

Dominik Hensler wrote:
>So, hab jetzt das Sourcefile des asm-Programms besorgt,...

Wo liegt dann das Problem?

von gone g. (xcc)


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.

von gone g. (xcc)


Angehängte Dateien:

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.

von Volker (Gast)


Lesenswert?

Hallo Dominik

Ist der Watchdog evt. per Fuse auf "always on"?
Soweit ich das sehen kann wird er in dem ASM-Programm nochmal explizit 
abgeschaltet.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>habe jetzt die Genehmigung des Autors das Programm zu veröffentlichen...
Für die Veröffentlichung so eines Codes hätte ich meine Genehmigung auch 
solange wie irgend möglich verweigert  ;-)

von Volker (Gast)


Lesenswert?

@Dominik:

Vergiss mein letztes Posting, das ist Blödsinn :-D

von Dominik (Gast)


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.

von gone g. (xcc)


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..

von Volker (Gast)


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
}

von Andreas K. (a-k)


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>

von gone g. (xcc)


Lesenswert?

"int main(void) __attribute__((naked)); \" wird nicht übersetzt 
(checksumme ändert sich nicht). :/

von Fabian B. (fabs)


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.

Gruß
Fabian

von Dominik (Gast)


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.

von fabs (Gast)


Lesenswert?

Dann schau dir doch mal den dazu generierten ASM Code an.

Gruß
Fabian

von gone g. (xcc)


Lesenswert?

>Dann schau dir doch mal den dazu generierten ASM Code an.

Öhm.. wo muss ich da nachgucken? Im ".lss" file?

von Falk B. (falk)


Lesenswert?

Ja

von gone g. (xcc)


Angehängte Dateien:

Lesenswert?

Kann nichts verdächtiges erkennen. Der gesetzte Wert 0x30 ist korrekt, 
ebenso Register 0x35 (MCUCR). Ich hab die Datei mal angehängt :/

von Falk B. (falk)


Lesenswert?

Du muss noch die IO-Ports auf Ausgang schalten bzw. den Pull-Up 
einschalten.

MFg
Falk

von Benedikt K. (benedikt)


Lesenswert?

Falk Brunner wrote:
> Du muss noch die IO-Ports auf Ausgang schalten bzw. den Pull-Up
> einschalten.

Muss man das auch, wenn die IO Ports angeschaltet sind ?

von fabs (Gast)


Lesenswert?

Offene Inputs sind immer unglücklich.

Gruß
Fabian

von gone g. (xcc)


Angehängte Dateien:

Lesenswert?

hatte ich doch schon ausprobiert. Hab trotzdem nochmal folgendes
1
DDRB=0xff;     // PB1-5 = Ausgang
2
DDRB&=~(1<<4); // PB4 = Eingang
3
PORTB|=(1<<4); // Pullup für Eingang

hinzugefügt, lss im Anhang.

von Volker (Gast)


Lesenswert?

funktioniert es nun?

von Dominik (Gast)


Lesenswert?

Nein, leider nicht.

von avion23 (Gast)


Lesenswert?

Hallo Dominik,
bist du inzwischen weiter gekommen? Ich habe vielleicht ein ähnliches 
Problem und nach dem googlen ist mir überhaupt nicht mehr klar, wie ich 
die Sleepmodes richtig setze.

von Michael G. (linuxgeek) Benutzerseite


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?

von 900ss (900ss)


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.

von Michael U. (amiga)


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

von 900ss (900ss)


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

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.