Forum: Mikrocontroller und Digitale Elektronik 328P im powersave immer noch 1.8 mA


von Carsten M. (cmoos)


Lesenswert?

Hi,
der Powersave Mode will mir einfach nicht gelingen.
Ich habe schon viel gelesen und probiert, aber ich komme nicht mehr 
weiter.

Als Hardware habe ich ein Pro Mini 328P Entwicklungsboard von eHaJo.
Das Projekt ist Temperatur- Datenlogger und als Teilprojekt ist der Pro 
Mini ein Mobilteil, dass über SPI ausgelesen wird.

Vom Board habe ich die Power-LED entfernt.

Die CPU läuft im Normalbetrieb mit 8 MHz. Zur Zeit mit internem 
Oszillator, weil ich dachte, es zieht weniger Strom als die Verwendung 
des externen Quarzes, was aber nicht der Fall ist.

Im Powersave Modus läuft "eigentlich" nur der watchdog timer und weckt 
die CPU alle 4s auf. Das funktioniert auch und wird als 2. Zeitbasis 
verwendet. Die Zeitbasis ist über zwei Tage ausreichend genau.

Die nicht belegten I/O Pins sind mit Pull Up beschaltet.

Der Wechsel zwischen SLOWCLOCKMODE und Normalmode passiert über einen 
Pin, der im Normalbetrieb high und im SLOWCLOCKMODE auf GND geschaltet 
ist.

Im Normalbetrieb benötige ich 8 MHz, damit eine SPI Verbindung zu einem 
anderen Controller klappt.

Nach Messungen mit dem Multimeter zieht das Board im Normalbetrieb ca. 
10 mA und im SLOWCLOCKMODE / powersave leider immer noch 1.84 mA.

Es ist ein AtmelStudio 6 Projekt.

Hier möchte ich verstehen wieso und wie komme ich deutlich unter 500 
nA????
(Ich weiß, dass es eine Bibliothek zu Thema gibt, wrde ich als letztes 
probieren. Ich will es aber gerne verstehen).

Der abgespeckte Code dazu: ( ich habe nur wesentliche Teile geschrieben 
und hoffe es ist verständlich. )
1
#define SLEEP_ENABLED 1   /*  Konfiguration */
2
3
#include <avr/io.h>
4
#include <avr/power.h>    // for clock_prescale_set
5
#include <util/delay.h>
6
#include <stdlib.h>        /* for itoa, fprintf  fscanf, fputs, fgets */
7
#include <avr/interrupt.h> /* for Clock and SPI */
8
#include <avr/eeprom.h>    /* for 8 Bit integer store */
9
#include <avr/sleep.h>     /* for idle/powersave mode */
10
11
main()
12
{
13
14
  while (1)
15
16
      if(SLOWCLOCKMODE!= getClockMode())
17
      {
18
        SLOWCLOCKMODE=getClockMode();  // Setze neu , weil geändert
19
        //setClockMode(SLOWCLOCKMODE);   // setze neuen Clockmode nur in ISR
20
      }
21
       if(SLOWCLOCKMODE && SLEEP_ENABLED){  
22
      
23
        //if (MCU_mega328P) set_sleep_mode(SLEEP_MODE_PWR_SAVE);
24
        if (MCU_mega328P) {
25
          
26
          setPowerConf();
27
28
          //set_sleep_mode(SLEEP_MODE_PWR_SAVE);
29
          WDTCSR |= (1<<WDIE);  // enable WDT
30
          //set_sleep_mode(SLEEP_MODE_IDLE);
31
          set_sleep_mode(SLEEP_MODE_PWR_DOWN);
32
          sleep_enable();
33
          sleep_mode();
34
          //sleep_bod_disable();
35
          sleep_disable();
36
          power_all_enable();
37
        }
38
      }
39
      
40
  }// while end
41
}// main end
42
43
44
void init_WDT()
45
{
46
  cli();
47
  /* Clear the reset flag. */
48
  MCUSR &= ~(1<<WDRF);
49
  /* In order to change WDE or the prescaler, we need to
50
  * set WDCE (This will allow updates for 4 clock cycles).
51
  */
52
  WDTCSR |= (1<<WDCE) | (1<<WDE);
53
    WDTCSR = 1<<WDP3;                     /* 4.0 seconds */
54
55
  sei();
56
}
57
58
ISR(WDT_vect)      // 2. Zeitbasis +/- 1" / Stunde
59
{
60
    static uint8_t WDTSLOWCLOCKMODE=SLOWCLOCK;
61
    static uint16_t CTR=0;
62
    CTR++;
63
// weitere Aktionen entfernt
64
    if (CTR>=900) CTR=0;
65
    if(WDTSLOWCLOCKMODE!= getClockMode())  // hier in ISR damit synchron zu SEKUNDE/MINUTE
66
    {
67
      WDTSLOWCLOCKMODE=getClockMode();  // Setze neu , weil geändert
68
      setClockMode(WDTSLOWCLOCKMODE);   // setze neuen Clockmode
69
    }
70
71
}
72
73
void setClockMode(uint8_t m)
74
{
75
  // m==1 Fclock=low m==0 Fclock= high
76
  m=m;  // dummy to avoid compiler warning
77
  cli();
78
  #if MCU_mega328P == 1
79
    if(m==SLOWCLOCK)   // low
80
    {
81
      clock_prescale_set(clock_div_256);   // f_clock/256 = 62.5 kHz
82
      TIMSK1&=~(1<<OCIE1A);
83
      TIFR1 &=~(1<<OCF1A);
84
      init_WDT();
85
    }
86
    else
87
    {
88
      clock_prescale_set(clock_div_1);   // 8 MHz, minimum damit er SPI noch schafft, interner Oszillator
89
      WDTCSR&=~(1<<WDIE);
90
      //wdt_disable();
91
      TIMSK1|=(1<<OCIE1A);
92
      TIFR1 |=(1<<OCF1A);
93
      OCR1A  =31250 ;                    // CLKDIV_1 für 8 MHz
94
      TCCR1B&=(0b11111000) ;             // Timer1 stop
95
      TCCR1B|=(1<<CS12)          ;       // Prescaler für T1 auf 256 und los geht's
96
    }
97
  #endif
98
  sei();
99
}
100
101
102
void setPowerConf()
103
{
104
  // unused PINS should be with PULL-UP
105
  // do in init_MCU
106
  // ADC power off
107
  ADCSRA&=~(1<<ADEN);
108
  // ACC
109
  ACSR|=(1<<ACD);
110
  // TWI off
111
  TWCR&=~(1<<TWEN);  // not needed in Idle
112
  //BOD off
113
  MCUSR|=(1<<BODS)|(1<<BODSE);  // Part one 
114
  MCUSR|=(1<<BODS);
115
  MCUSR&=~(0<<BODSE);  // Part two within 4 Clock
116
  //sleep_bod_disable();
117
  // TC2
118
  
119
  //TC0
120
  
121
  //USART0 off
122
  
123
  // to set clock off during sleep set these flags
124
  #define PRTWI0 7
125
  PRR|=(1<<PRTWI0)|(1<<PRTIM0)|(1<<PRTIM2)|(1<<PRUSART0)|(1<<PRADC);  //(1<<PRTIM1) ??
126
  
127
}

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Schaue in das Listing, ob die Zuweisungen an MCUSR innerhalb der 4 
Takte ausgeführt werden.

von Harald (Gast)


Lesenswert?

Sorry, bringt nur ein paar µA. Dein Problem liegt wo anders. Zum 
Beispiel eingeschaltete PullUps die extern auf GND gezogen werden.

von S. Landolt (Gast)


Lesenswert?

Wieviel Strom fließt, wenn der ATmega328P per Minimalprogramm fest in 
den Power-down-Modus geschickt wird, also auch ohne WDT?

von H.Joachim S. (crazyhorse)


Lesenswert?

MCUSR|=(1<<BODS)|(1<<BODSE);  // Part one
 MCUSR|=(1<<BODS);
 MCUSR&=~(0<<BODSE);  // Part two within 4 Clock

Du musst wahrscheinlich dem Compiler irgendwie sagen, dass er diese 
Zeilen nicht optimieren soll, die schreien ja sonst förmlich nach 
Zusammenfassung.

von Stefan F. (Gast)


Lesenswert?

Wie viel Strom nimmt der Spannungsregler auf dem Board auf?

von Falk B. (falk)


Lesenswert?

@ H.Joachim Seifert (crazyhorse)

>MCUSR|=(1<<BODS)|(1<<BODSE);  // Part one
> MCUSR|=(1<<BODS);
> MCUSR&=~(0<<BODSE);  // Part two within 4 Clock

>Du musst wahrscheinlich dem Compiler irgendwie sagen, dass er diese
>Zeilen nicht optimieren soll, die schreien ja sonst förmlich nach
>Zusammenfassung.

Nö, das darf er gar nicht, denn die Zugriffe auf IO-Register wie MCUSR 
sind volatile.

von Jim M. (turboj)


Lesenswert?

H.Joachim S. schrieb:
> Du musst wahrscheinlich dem Compiler irgendwie sagen, dass er diese
> Zeilen nicht optimieren soll,

Das macht normalwerweise die Deklaration der Register als volatile.

Leider könnte er dazwischen Instuktionen einfügen, die sieht man nur im 
(Dis-)assembly Listing. Gibt es nicht eine fertige Funktion für sowas..?


Welche Taktquelle nutzt der WDT? Bei laufendem internen 8MHz Oszillator 
wären die 1,8mA IMHO in Ordnung...

von my2ct (Gast)


Lesenswert?

Harald schrieb:
> Dein Problem liegt wo anders. Zum Beispiel eingeschaltete PullUps die
> extern auf GND gezogen werden.

Bei nicht belegten I/O Pins kann das nicht passieren und für die anderen 
müsste man den Schaltplan konsultieren.

Carsten M. schrieb:
> Die nicht belegten I/O Pins sind mit Pull Up beschaltet.

Nach dem Schaltplan des Gesamtaufbaus gehe ich jetzt aber nicht suchen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Ok, war nur ne Idee:-).
Ich benutze CodeVision und da muss ich das expizit angeben.

von Harald (Gast)


Lesenswert?

my2ct schrieb:
> Harald schrieb:
>> Dein Problem liegt wo anders. Zum Beispiel eingeschaltete PullUps die
>> extern auf GND gezogen werden.
>
> Bei nicht belegten I/O Pins kann das nicht passieren und für die anderen
> müsste man den Schaltplan konsultieren.

Selbstverständlich meine ich Pins an denen etwas angeschlossen ist.

von Stefan F. (Gast)


Lesenswert?

Harald, bist du Carsten?

[ ] Nein, ich habe die Forumsregeln nicht gelesen, sie sind mir scheiß 
egal.

Nochmal meine Frage:
> Wie viel Strom nimmt der Spannungsregler auf dem Board auf?

[ ] Ich beantworte Rückfragen nur, wenn ich Hilfe erwarte. Heute trolle 
ich aber nur.

Bitte zutreffendes Sätze ankreuzen oder meine Frage beantworten.

von Harald (Gast)


Lesenswert?

Stefan U. schrieb:

> Harald, bist du Carsten?

Stefan, bist du Martin?

von Stefan F. (Gast)


Lesenswert?

> Stefan, bist du Martin?

Nein

Aber du hast nun schon wieder eine meiner Rückfragen nicht beantwortet. 
Damit bin ich hier raus, verschaukele dich selbst!

von Harald (Gast)


Lesenswert?

Stefan U. schrieb:

> Damit bin ich hier raus, verschaukele dich selbst!

Selbst für die kleinen Dinge des Lebens bin ich dankbar.

von Stefan F. (Gast)


Lesenswert?

Ich glaube, wir sollten jetzt erst einmal die Antworten von Carsten Moos 
abwarten.

von Carsten M. (cmoos)


Lesenswert?

Stefan U. schrieb:
> Wie viel Strom nimmt der Spannungsregler auf dem Board auf?

Hi Stefan,
lt. Hersteller des Controller-Boards ist das nicht das Hauptproblem. Er 
meint, dass eher der CPU-Takt weiterläuft. Der Spannungsregler ist 
vermutlich ein MIC 5205.
VG
Carsten

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

S. Landolt schrieb:
> Wieviel Strom fließt, wenn der ATmega328P per Minimalprogramm fest in
> den Power-down-Modus geschickt wird, also auch ohne WDT?

Power-down mode, WDT enabled: ca. 4.2µA
Power-down mode, WDT disabled: ca. 0.1µA

(Typical values at 25°C, VDD = 3V)

Table 32-4. ATmega328P DC characteristics
Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016

von S. Landolt (Gast)


Lesenswert?

> lt. Hersteller ...
Wie wäre es mit messen? Um ausnahmsweise mich selbst zu zitieren:

>Wieviel Strom fließt, wenn der ATmega328P per Minimalprogramm
> fest in den Power-down-Modus geschickt wird, also auch ohne WDT?
1
#include <avr/sleep.h>
2
3
void main()
4
{
5
 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
6
 sleep_enable();
7
 sleep_mode();
8
}


an Georg M.:
Das Datenblatt ist mir bekannt, es geht um die Verhältnisse bei Carsten 
Moos.

von Carsten M. (cmoos)


Lesenswert?

S. Landolt schrieb:
> Wieviel Strom fließt, wenn der ATmega328P per Minimalprogramm fest in
> den Power-down-Modus geschickt wird, also auch ohne WDT?

Hallo S. Landolt,
habe ich keine extra Messung dazu. Es gab aber zwischendurch einen 
Programmierfehler, der dazu füherte, dass der WDT nicht initilaiisert 
und verwendet wurde. Dabei war der Strom ebenfalls um 2 mA. Das ist aber 
scheinbar eine Idee, die dazu führt, wieviel Strom der Einsatz des WDT 
ausmacht. Das dürfte hier aber unerheblich sein: lt. Datenblatt
WDT enabled, VCC
= 3V T = 85°C 4.2µA 15µA
WDT disabled, VCC
= 3V T = 85°C 0.1µA bis max 2µA
Das sind also maximal 15µA

VG
Carsten

von S. Landolt (Gast)


Lesenswert?

Es geht mir erstmal darum zu entscheiden, ob es an der Hard- oder an der 
Software liegt, und das geht mit obigem Dreizeiler.

von Carsten M. (cmoos)


Lesenswert?

Jim M. schrieb:
> H.Joachim S. schrieb:

> Welche Taktquelle nutzt der WDT? Bei laufendem internen 8MHz Oszillator
> wären die 1,8mA IMHO in Ordnung...

Hallo Jim,
der WDT sollte den asynchronen Takt nutzen: Also 128 kHz mit Prescaler
1
  WDTCSR = 1<<WDP3;                     /* 4.0 seconds */

Ich habe dazu eine Funktion, die ich leider noch nicht im Quellcode 
gezeigthabe:
1
void init_WDT()
2
{
3
  cli();
4
  /* Clear the reset flag. */
5
  MCUSR &= ~(1<<WDRF);
6
7
  /* In order to change WDE or the prescaler, we need to
8
  * set WDCE (This will allow updates for 4 clock cycles).
9
  */
10
  WDTCSR |= (1<<WDCE) | (1<<WDE);
11
12
  /* set new watchdog timeout prescaler value */
13
  //WDTCSR = 1<<WDP1 | 1<<WDP2;             /* 1.0 seconds */
14
  //WDTCSR = 1<<WDP0 | 1<<WDP1 | 1<<WDP2; /* 2.0 seconds */
15
  WDTCSR = 1<<WDP3;                     /* 4.0 seconds */
16
  //WDTCSR = 1<<WDP0 | 1<<WDP3;           /* 8.0 seconds */
17
18
  /* Enable the WD interrupt (note no reset). */
19
  //WDTCSR |= _BV(WDIE); // Not here but when we go to Sleep
20
sei();
21
}

von Georg M. (g_m)


Lesenswert?

Jim M. schrieb:
> Welche Taktquelle nutzt der WDT? Bei laufendem internen 8MHz Oszillator
> wären die 1,8mA IMHO in Ordnung...

Das wäre kein Schlafmodus.

von Stefan F. (Gast)


Lesenswert?

> Der Spannungsregler ist vermutlich ein MIC 5205.

Wer sagt das? Der Hersteller, der es sogar für unnötig hält, Schaltpläne 
zu veröffentlichen? Da wäre ich aber sehr skeptisch.

Die Chinesen verbauen viel billigere Spannungsregler, die eine 
Ruhestromaufnahme von ca. 1,5mA haben.

Ich fasse mal zusammen:

Du hast ein Board mit unbekannter Bestückung. An der 
Gesamt-Stromaufnahme glaubst du zu erkennen, dass dein Programm 
fehlerhaft ist. Es ist aber kein offensichtlicher Fehler erkennbar. Was 
macht man dann?

1) Schaltplan besorgen
2) Stromaufnahme des Boardes berechnen
3) Programm auf ein Minimum reduzieren:
1
int main()
2
{
3
    PORTA = 0xFF;
4
    PORTB = 0xFF;
5
    PORTC = 0xFF;
6
    PORTD = 0xFF;
7
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
8
    sleep_enable();
9
    sleep_mode();
10
    while (1);
11
}
4) Dann nochmal messen.

Wenn du dann immer noch unzufrieden bist, dann löte mal den 
Spannungsregler aus.

von Carsten M. (cmoos)


Lesenswert?

S. Landolt schrieb:
>> lt. Hersteller ...
> Wie wäre es mit messen? Um ausnahmsweise mich selbst zu zitieren:
>
>>Wieviel Strom fließt, wenn der ATmega328P per Minimalprogramm
>> fest in den Power-down-Modus geschickt wird, also auch ohne WDT?
>
>
1
> #include <avr/sleep.h>
2
> 
3
> void main()
4
> {
5
>  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
6
>  sleep_enable();
7
>  sleep_mode();
8
> }
9
>
>
S. Landolt schrieb im selben Artikel:
>Es geht mir erstmal darum zu entscheiden, ob es an der Hard- oder an der
>Software liegt, und das geht mit obigem Dreizeiler.

Hallo S. Landolt,
okay, habe ich verstanden. Leider muss ich das auf morgen verschieben, 
weil ich dazu umverkabeln muss; die SPI Schnittstelle ist ja vom 
Programm belegt. Ich möchte aber vorher noch wissen, ob es nicht mehr 
Sinn machen würde, wenn ich dazu den I/O Bereich konfiguriere, den JDT 
abschalte und die MCU Register so setze, wie im Programm?

VG
Carsten

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Am meisten Sinn macht es wie gesagt, das Programm auf ein Minimum zu 
reduzieren.

> weil ich dazu umverkabeln muss.

WAS musst du umverkabeln? Wir diskutieren hier die ganze Zeit über das 
Nackte Board!

Kann es sein, dass du uns entscheidende Informationen vorenthältst? 
Möglicherweise Informationen, die Dir persönlich (mangels Know-How) 
vollkommen irrelevant erscheinen?

Wir reden aber von diesem Board, oder nicht?
https://www.ehajo.de/boards/148/pro-mini-328p-entwicklungsboard

von S. Landolt (Gast)


Lesenswert?

> ob es nicht mehr Sinn ...

Dieser Dreizeiler reicht, vorausgesetzt, es wurde nicht im 
Fuse-High-Byte WDTON programmiert.

von Carsten M. (cmoos)


Lesenswert?

Stefan U. schrieb:

>
>> weil ich dazu umverkabeln muss.
>
> WAS musst du umverkabeln? Wir diskutieren hier die ganze Zeit über das
> Nackte Board!
>
> Kann es sein, dass du uns entscheidende Informationen vorenthältst?
> Möglicherweise Informationen, die Dir persönlich (mangels Know-How)
> vollkommen irrelevant erscheinen?

Hallo Stefan U.
nun komme mal wieder runter.
Auf der SPI-Schnittstelle des Boards steckt ein Stecker mit Kabel. Am 
anderen  Ende des Kabels ist auch ein Stecker. Dieser Stecker ist 
unbeschaltet, dann fließen dort 0 µA. Wird dieser Stecker gesteckt 
verbindet er zu einem zweiten Kontroller und es fließt ein Strom.
Ich hoffe das zeigt, welches Know How dazu nötig ist.

Falls Du nun gleich wieder nach Know How und exclusiven Informationen 
rufst:
Nein dieser zweite Stecker ist nicht geeignet für eine ISP 
Programmierung und ich muss dazu umverkabeln.

Trotzdem scheint mir dieser Vorschlag der nächste Schritt zu sein. Die 
Frage ob es hardware- oder softwareseitig ist wohl entscheidend.
Ich bin erstaunt, wie "kompromisslos" schnell ihr seid. Leider kann ich 
das heute nicht mehr messen.
Vg
Carsten

von Carsten M. (cmoos)


Lesenswert?

Stefan U. schrieb:

>
> Wir reden aber von diesem Board, oder nicht?
> https://www.ehajo.de/boards/148/pro-mini-328p-entwicklungsboard

Ja genau!

VG
Carsten

von Stefan F. (Gast)


Lesenswert?

Lange Kabel mit offenen Enden wirken als Antennen. Sie empfangen 
hochfrequente Signale, was die Stromaufnahme in die Höhe treibt. 
Vermutlich zwar nicht auf 1,8mA aber doch deutlich messbar (nachdem die 
eigentliche Problem-Ursache gelöst ist).

von S. Landolt (Gast)


Lesenswert?

> ... wie "kompromisslos" schnell ihr seid ...
Logisch, so kurz vorm Grab bleibt uns nicht mehr viel Zeit!

von Carsten M. (cmoos)


Lesenswert?

Habe doch noch gemessen. Wenn ihr schon so schnell seid:
1
#include <avr/io.h>
2
#include <avr/sleep.h>
3
int main()
4
{
5
  //PORTA = 0xFF;   // der 328 hat keinen
6
  PORTB = 0xFF;
7
  PORTC = 0xFF;
8
  PORTD = 0xFF;
9
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
10
  sleep_enable();
11
  sleep_mode();
12
  while (1);
13
}

Die Stromaufnahme beträgt 0.33 mA
Im Powersafe Modus sind es auch 0.33 mA
Das ist da, wo ich hin kommen will.
Also : es ist noch ein Software-Problem
1
#include <avr/io.h>
2
#include <avr/sleep.h>
3
int main()
4
{
5
  //PORTA = 0xFF
6
  PORTB = 0x0;
7
  PORTC = 0x0;
8
  PORTD = 0x0;
9
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
10
  sleep_enable();
11
  sleep_mode();
12
  while (1);
13
}

Da noch eine LED an PB5 verbaut ist, habe ich die PORTs mal schnell mit 
0 initialisiert. Nun habe ich 94 µA.

Es muss also noch ein Software-Problem sein.

von Stefan F. (Gast)


Lesenswert?

> Nun habe ich 94 µA.
> Es muss also noch ein Software-Problem sein.

Na also, diese Erkenntnis ist ein ganz großer Schritt nach vorne.

Als nächstes würde zu diesem Minimalprogramm schrittweise Sachen 
hinzufügen, bis der Fehler wieder auftritt. So kannst du die 
Fehlerursache einkreisen.

von Georg M. (g_m)


Lesenswert?

Bleibt in dem Minimalprogramm der ADC eingeschaltet?

von Stefan F. (Gast)


Lesenswert?

> Bleibt in dem Minimalprogramm der ADC eingeschaltet?

Ja, da kannst du noch bis zu 300µA einsparen.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Carsten M. schrieb:
> /* In order to change WDE or the prescaler, we need to
>   * set WDCE (This will allow updates for 4 clock cycles).
>   */
>   WDTCSR |= (1<<WDCE) | (1<<WDE);
>
>   /* set new watchdog timeout prescaler value */
>   //WDTCSR = 1<<WDP1 | 1<<WDP2;             /* 1.0 seconds */
>   //WDTCSR = 1<<WDP0 | 1<<WDP1 | 1<<WDP2; /* 2.0 seconds */
>   WDTCSR = 1<<WDP3;                     /* 4.0 seconds */
>   //WDTCSR = 1<<WDP0 | 1<<WDP3;           /* 8.0 seconds */
>
>   /* Enable the WD interrupt (note no reset). */
>   //WDTCSR |= _BV(WDIE); // Not here but when we go to Sleep
> sei();
> }

... der wdt dürfte wohl kaum laufen, weil hiermit WDTCSR = 1<<WDP3, das 
WDE wieder auf zero steht und der wdt disabled ist!

aber ALLE wdt funktionen sind in #include <avr/wdt.h> bereits definiert!
wie hier immer alle ihre zeit verschwenden ohne sinnvolle ergebnisse zu 
erzeugen ... geht lieber in die sonne ihr ahnungslosen!

ausserdem würde ich mal im atmel simulator mir den code anschauen ...


mt

: Bearbeitet durch User
von Mike J. (linuxmint_user)


Lesenswert?

Carsten M. schrieb:
> Da noch eine LED an PB5 verbaut ist, habe ich die PORTs mal schnell mit
> 0 initialisiert. Nun habe ich 94 µA.
>
> Es muss also noch ein Software-Problem sein.

Du hast dich noch gar nicht zu dem Stromverbrauch des Spannungsreglers 
geäußert, denn der verbraucht ja auch seinen eigenen Ruhestrom der in 
die Rechnung mit einfließt.
Du kannst also vielleicht den Controller und sämtliche Peripherie 
entfernen und der Stromverbrauch ändert sich trotzdem nicht merklich.

Carsten M. schrieb:
> Hier möchte ich verstehen wieso und wie komme ich deutlich unter 500
> nA? (???)

Dazu müsstest du zusätzlich den Watchdog Timer deaktivieren, deine 
ganzen Sensoren abschalten und die Pins auf ein definiertes Level legen.

von Peter D. (peda)


Lesenswert?

Im Powerdown kommt man auf <1µA.
Mit Watchdog sind es einige 10µA.
Wenn Du einen Spannungsregler hast, kann der ganz heftig ziehen. Es gibt 
auch Spannungsregler die nur ~2µA benötigen.

von Feldkurat K. (feldkurat)


Lesenswert?

Mike J. schrieb:
> Du hast dich noch gar nicht zu dem Stromverbrauch des Spannungsreglers
> geäußert, denn der verbraucht ja auch seinen eigenen Ruhestrom der in
> die Rechnung mit einfließt.
> Du kannst also vielleicht den Controller und sämtliche Peripherie
> entfernen und der Stromverbrauch ändert sich trotzdem nicht merklich.

Es wäre auch schön, wenn man wüßte WO der fließende Strom gemessen 
wurde.
Nicht, daß er 5 Volt einspeist und den Regler "von hinten" her füttert. 
Das gefällt dem nämlich nicht und er dankt das mit anständiger 
Stromaufnahme.

von Mike J. (linuxmint_user)


Lesenswert?

Feldkurat K. schrieb:
> Es wäre auch schön, wenn man wüßte WO der fließende Strom gemessen
> wurde.
Ja, so ein kleiner Übersichtsplan wäre jedenfalls nett, muss ja nichts 
aufwendiges sein. Paint reicht oft für sowas aus.

Er schreibt ja von einem "mobil-teil", also könnte ich mir vorstellen 
dass er einen LiIon-Akku an den Eingang des Reglers hängt.
Man kann den Aufdrucken von China-Bauteilen aber nicht trauen, daher 
sollte er den Ruhestrom des Spannungsreglers mal einzeln messen.

Die Chinesischen XC6206P332MR von eBay verbrauchen ja auch nicht nur 
1µA, man misst 7µA da es eigentlich TX6206 sind.
Dafür kosten 100 Stück nur 1,32€.

Dass sie für den Preis etwas schlechter sind ist okay, aber es ist mies 
dass die einen verarschen.
Sie könnten doch einfach schreiben: "TX6206 - günstige Alternative zu 
XC6206".

von Manfred (Gast)


Lesenswert?

Peter D. schrieb:
> Mit Watchdog sind es einige 10µA.

Nö, mit einem 5V-ProMini habe ich für jeweils ein paar Sekunden 
einstellige µA, nach dem Strickmuster:
http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/

Gedanken muß man sich um die Peripherie machen, z.B. Spannungsteiler per 
FET nur zuschalten, solange man sie braucht.

von Carsten M. (cmoos)


Angehängte Dateien:

Lesenswert?

Stefan U. schrieb:
>> Nun habe ich 94 µA.
>> Es muss also noch ein Software-Problem sein.
>
> Na also, diese Erkenntnis ist ein ganz großer Schritt nach vorne.
>
> Als nächstes würde zu diesem Minimalprogramm schrittweise Sachen
> hinzufügen, bis der Fehler wieder auftritt. So kannst du die
> Fehlerursache einkreisen.

Hallo Stefan,
so werde ich es machen. Auch wenn es leider der aufwendigste Weg durch 
die 1600 Zeilen ist.

Auf dem Spannungsregler steht RB 50. Ich werde ihn erstmal nicht einzeln 
messen. Da er keinen Längswiderstand zu haben scheint, kann ich auch 
Strom nicht indirekt messen. Er dürfte aber bei Gesamt 94 µA abzüglich 
(bis zu) 300µA für ADC und abzüglich ein paar µA für WDT nicht mehr 
allzu hoch sein.

Nach einem Schaltplan wurde gefragt: Die Peripherie ist  bei den 
Messungen nicht verbunden. Lediglich ein Sensor-Board (BME280) ist 
eingesteckt.

Apollo Mond schrieb:
>... der wdt dürfte wohl kaum laufen, weil hiermit WDTCSR = 1<<WDP3, das
>WDE wieder auf zero steht und der wdt disabled ist!

Das ist richtig: ein "|" fehlt: ...  WDTCSR| = 1<<WDP3

Da muss ich mal schauen. Tatsache ist, dass der WDT - ISR Vector 
angesprungen wird und nach 4s der Counter inkrementiert wird. Daraus 
würde ich schließen, dass der WDT Timer sehr wohl läuft. Den (leider 
abwertenden)
Hinweis auf die wdt.h werde ich auch aufgreifen.

Dann wurde befürchtet, dass die Spannung an VCC anliegt: Spannung liegt 
an RAW. Der Regler wird also vorwärts betrieben.

Es ist übrigens die 5V Variante.

Es ist noch kein LiPo. Es sind 4 xAA.

Danke für die vielen Anregungen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wenn Dir Langzeit-Batteriebetrieb wichtig ist, solltest du entweder 
einen Spannungsregler nehmen, der nur wenige µA aufnimmt oder noch 
besser gar keinen Spannungsregler.

Das China-Board mit unbekannter Bestückung scheint mir die falsche Wahl.

von Carsten M. (cmoos)


Lesenswert?

>Apollo Mond schrieb:
>>... der wdt dürfte wohl kaum laufen, weil hiermit WDTCSR = 1<<WDP3, das
>WDE wieder auf zero steht und der wdt disabled ist!

>Das ist richtig: ein "|" fehlt: ...  WDTCSR| = 1<<WDP3

>Da muss ich mal schauen. Tatsache ist, dass der WDT - ISR Vector
>angesprungen wird und nach 4s der Counter inkrementiert wird. Daraus
>würde ich schließen, dass der WDT Timer sehr wohl läuft. Den (leider
>abwertenden)

in der main loop steht
1
WDTCSR |= (1<<WDIE);  // enable WDT

 damit ist auch klar, warum der WDT läuft.

Die oben zitierte Zeile steht in der init_WDT(), die nur einmal 
aufgerufen wird. Das ist verwirrend.

von Georg M. (g_m)


Lesenswert?

Carsten M. schrieb:
> Der Spannungsregler ist vermutlich ein MIC 5205.

Ja, und "LDO" heißt nicht automatisch "Ultralow Quiescent Current LDO".

von Mike J. (linuxmint_user)


Lesenswert?

Carsten M. schrieb:
> Er dürfte aber bei Gesamt 94 µA abzüglich
> (bis zu) 300µA für ADC und abzüglich ein paar µA für WDT nicht mehr
> allzu hoch sein.

Im PowerDown ist der Takt für den ADC doch abgeschaltet, du musst nur 
vor dem Sleep-Modus noch die interne Referenzspannung abschalten.

Carsten M. schrieb:
> Es ist übrigens die 5V Variante.

Die hat doch einen 16MHz Quarz. Nutzt du den "Prescaler" um auf die 8MHz 
zu kommen?
1
clock_prescale_set(clock_div_1);
Scheint hier nicht so zu sein.

Hast du eine Möglichkeit den "LDO" mal auszulöten?

Bei meinem Arduino-Pro-Mini ist auch ein so ein "KB 50" SOT23-5 
Spannungsregler drauf, man kann auch die Kondensatoren rechts und links 
von ihm entlöten damit man besser an in ran kommt, dauert höchstens ein 
paar Minuten wenn man vorsichtig ist.

Du kannst den ATmega auch direkt mit einem 4.1V LiIon-Akku (am Vcc-Pin) 
betreiben wenn die Peripherie das auch so aushält. Die meisten Sensoren 
brauchen aber 3.3V um zu funktionieren.

von Manfred (Gast)


Lesenswert?

Mike J. schrieb:
> Bei meinem Arduino-Pro-Mini ist auch ein so ein "KB 50" SOT23-5 Spannungsregler 
drauf,

... den ich herunterwerfe, wenn ich Strom sparen will.

KB50 wäre das Marking eines Micrel MIC5205. Laut Datenblatt hat dieser 
bei 50mA Last typ. 350 / max. 600 µA Querstrom.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Georg M. schrieb:
> Ja, und "LDO" heißt nicht automatisch "Ultralow Quiescent Current LDO".

so ist es, hier kommt z.b. ein mcp1700 mit 1,6uA quiescent current zum 
einsatz bzw. bei dem thema low power sollte man ohne auskommen.


Carsten M. schrieb:
> Da muss ich mal schauen. Tatsache ist, dass der WDT - ISR Vector
>>angesprungen ...

es gibt keinen wdt interrupt vector, sondern nur einen reset vector mit 
4 quellen! die isr ist unvollständig, weil sie die reset quelle im mcusr 
register nicht abfragt.

für mich ist das hier beobachte vorgehen trail and error von 
ahnungslosen. das die netten leute hier ihre zeit investieren, um 
frage/antwort ping-pong zu spielen erstaunt mich immer wieder.


mt

von Stefan F. (Gast)


Lesenswert?

> das die netten leute hier ihre zeit investieren, um
> frage/antwort ping-pong zu spielen erstaunt mich immer wieder.

Einige Leute machen mit Elektronik nur als Hobby herum, haben es nie 
richtig gelernt. Ich zähle mich (trotz Ausbildung als 
Kommunikationselektroniker) dazu, weil es für mich nie zum Beruf wurde.

Damals als ich angefangen hatte, war es sehr schwierig, als 
Informationen zu kommen. Für Datenblätter musste man den 
Chip-Herstellern Briefe mir Bargeld in der jeweiligen Landeswährung 
schicken und dann wochenlang auf Antwort hoffen. Mikrocontroller mit 
Minimalbeschaltung und Programmieradapter kosteten bis zu 100x so viel, 
wie heute. Und wenn man weder Internet noch Leute kennt, die man fragen 
kann, musste man sich in Geduld üben. Oder eben irgendwie 
durchprobieren.

Ich bin sehr dankbar für jede Hilfe, die ich hier im Forum bekommen 
habe. Die Mitglieder hier haben mich sehr viel weiter gebracht, als 
meine Ausbildung. Aus Dankbarkeit helfe ich nun anderen, so weit ich 
kann. Aus dem selben Grund betreibe ich auch seit nun etwa 20 Jahren 
meine Homepage.

von M. K. (sylaina)


Lesenswert?

Apollo M. schrieb:
> es gibt keinen wdt interrupt vector

Dann ist das Datenblatt des Atmega328P nicht richtig und meinen 
Atmega328P, die ich so benutze, darf man das auch nicht sagen, dass sie 
eigentlich keinen Interruptvector für den Watchdog haben.
Interruptvector 7, Program Address 0xc...wenn ich mich recht 
erinnere...warum weis ich das eigentlich auswendig? Jetzt bekomm ich 
Angst...

von sumo (Gast)


Angehängte Dateien:

Lesenswert?

Apollo M. schrieb:
> es gibt keinen wdt interrupt vector,

Wie ist dann das Datenblatt (siehe Bild) zu erklären?
"Interrupt Vector 7 - WDT"

von HildeK (Gast)


Lesenswert?

Apollo M. schrieb:
> es gibt keinen wdt interrupt vector, sondern nur einen reset vector mit
> 4 quellen!

Da verwechselst du was.
Es gibt einen Resetvektor. Vector 1.
Es gibt einen WD-Interruptvector, wie schon erwähnt.
Und das was du meinst mit 'reset vector' ist vermutlich das Register, in 
dem die Quellen des letzten Resets gespeichert sind. MCUSR. Das ist auch 
kein Vektor, sondern sind nur Flags.
Es aber nichts mit dem WDT-Interrupt zu tun, allerdings steht drin, ob 
am µC der Reset durch den Watchdog ausgelöst wurde - oder durch 
Power-Up, Brown-out oder den Resetpin.
Watchdog-Reset und Watchdog-Interrupt sind zwei Dinge, wenn auch durch 
den selben Timer betrieben.

von Carsten M. (cmoos)


Lesenswert?

Stefan U. schrieb:
>> das die netten leute hier ihre zeit investieren, um
>> frage/antwort ping-pong zu spielen erstaunt mich immer wieder.
>
> Einige Leute machen mit Elektronik nur als Hobby herum, haben es nie
> richtig gelernt. Ich zähle mich (trotz Ausbildung als
> Kommunikationselektroniker) dazu, weil es für mich nie zum Beruf wurde.
>
> Damals als ich angefangen hatte, war es sehr schwierig, als
> Informationen zu kommen. Für Datenblätter musste man den
>...
> meine Homepage.

Offtopic:
Das finde ich sehr tröstlich. Dachte schon, ich wäre hier als "Ping Pong 
Spieler" abgestempelt und umgeben von unnötiger Arroganz. Ist ziemlich 
derb, wie manche hier schreiben. Selbst wenn jemand sich mit den Sachen 
über das Datenblatt vertraut gemacht hat, kann es doch noch schief 
gehen.
Ich habe nichts gegen "trial and error". Finde es eher ironisch, wenn 
Apollo mir/uns das vorwirft, es aber nicht mal richtig schreiben kann.

: Bearbeitet durch User
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.