Forum: Mikrocontroller und Digitale Elektronik attiny44A power down


von Mc S. (mcsplanish)


Lesenswert?

Hallo zusammen,

ich brauch eure Hilfe.
Ich habe den tiny so programmiert, dass er in den power down modus geht 
und ich diesen mit einem taster wieder aufwecken kann. Funktioniert auch 
super! Allerdings habe ich einen Stromverbrauch von 360uA... Das 
verstehe ich nicht. Im Datenblatt stehen 100nA.... Würde mich ja schon 
mit 1uA zufrieden geben. Ich messe mit einem Multimeter den 
Versorgungsstrom des tiny hinter einem linearregler (3,3V). Schalte mit 
den 7 Ausganspins eine Segmentanzeige. Hier mal mein Code und die 
Fusebits. Vielleicht geht ja bei dieser Konfiguration nichht weniger....
1
void init_ports(void)
2
{
3
  DDRA = (1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA7);
4
  DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2);
5
  PORTA = 0x01;
6
}
7
8
void init_int (void)
9
{
10
  //falling edge
11
  MCUCR |= (1 << ISC01);
12
  //Pin change on INT0
13
  PCMSK0 |= (1 << PCINT0);
14
    //configure external interrupt
15
    GIMSK |= (1 << PCIE0);
16
}
17
18
int main(void)
19
{
20
  init_ports(); //inizialize the ports
21
  init_int();
22
23
  //Global Interrupts enable
24
  sei();
25
26
  for(;;)
27
  {
28
29
            //do something
30
            PORTA |= (1<<PA2);
31
            _delay_ms(2000);
32
            PORTA &= ~(1<<PA2);
33
34
35
      // Sleep enable
36
      MCUCR |= (1<<SE)|(1<<SM1);
37
      // ADC deactivate
38
      ADCSRA &=~ (1<<ADEN);
39
40
      sei();
41
42
      // Set the sleep mode "power down"
43
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);
44
45
        // go to sleep
46
        sleep_mode();
47
48
        cli();
49
50
        // Sleep disable
51
        //MCUCR &= ~(1<<SE);
52
53
        // ADC activate
54
        ADCSRA |= 1<<ADEN;
55
56
        // Sleep enable
57
        MCUCR |= (1<<SE);
58
59
  }
60
}
61
62
63
ISR(PCINT0_vect)
64
{
65
  PORTA |= (1<<PA1);
66
  _delay_ms(2000);
67
        PORTA &= ~(1<<PA2);
68
}


 -U lfuse:w:0x62:m \
 -U hfuse:w:0xDF:m \


Danke für die Tips

von Ingo (Gast)


Lesenswert?

Du musst schon alle Register ziehen, und den ADC und den 
AnalogKomparator abschalten. Alle IOs müssen als Eingang ohne Pull ups 
gesetzt werden. Guck mal ins Datenblatt zum Thema Strom sparen. Da kann 
man einiges falsch machen...



Ingo

von Peter D. (peda)


Lesenswert?

Ingo schrieb:
> Alle IOs müssen als Eingang ohne Pull ups
> gesetzt werden.

Und wie willste dann aufwachen?

Alle unbenutzen Pins sollten auf definiertem Potential sein, z.B. 
Eingang mit Pullup.

Das BOR braucht leider auch sehr viel Strom. Braucht man den EEPROM, muß 
man daher einen externen sparsameren Reset-IC nehmen.

von Ingo (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ingo schrieb:
>> Alle IOs müssen als Eingang ohne Pull ups
>> gesetzt werden.
>
> Und wie willste dann aufwachen?
>
> Alle unbenutzen Pins sollten auf definiertem Potential sein, z.B.
> Eingang mit Pullup.
>
> Das BOR braucht leider auch sehr viel Strom. Braucht man den EEPROM, muß
> man daher einen externen sparsameren Reset-IC nehmen.
Man muss halt alle Pins bei denen auf definierten Zustand verzichtet 
werden kann abschalten, der Wake-up sollte natürlich beschaltet sein. 
Zur Not externe Widerstände nutzen. BOR ist echt unverschämt, da ist in 
der Tat manchmal ein externes Bauteil effektiver.


Ingo

von Peter D. (peda)


Lesenswert?

Ingo schrieb:
> Man muss halt alle Pins bei denen auf definierten Zustand verzichtet
> werden kann abschalten

Das ist Quatsch, die IO-Stufen arbeiten statisch. Ob High, Low oder 
Pullup, der Stromverbrauch ist gleich.
Alle Ausgänge müssen Ausgänge bleiben. Man setzt sie auf den Pegel, bei 
dem die angeschlossenen Last aus ist.

Die neueren AVRs schalten auch die Eingangsstufen im Power-Down ab, die 
nicht zum Aufwachen benötigt werden. Trotzdem ist es unschön, Pins 
floaten zu lassen. Im Idle merkt man deutlich den erhöhten 
Stromverbrauch.

von Ingo (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ingo schrieb:
>> Man muss halt alle Pins bei denen auf definierten Zustand verzichtet
>> werden kann abschalten
>
> Das ist Quatsch, die IO-Stufen arbeiten statisch. Ob High, Low oder
> Pullup, der Stromverbrauch ist gleich.
Sicher, aber wenn man Ausgänge für z.B. eine Status LED in Sleep auf 
Eingang stellt spart man mehr Strom. Ein eingeschalteter Pullup benötigt 
mehr Strom als ohne Pullup.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> die IO-Stufen arbeiten statisch. Ob High, Low oder
> Pullup, der Stromverbrauch ist gleich.

Peter Dannegger schrieb:
> Trotzdem ist es unschön, Pins
> floaten zu lassen.

Das ist der Punkt. Der erreichte Pegel muss unter 1/3 Vcc oder über 2/3 
Vcc liegen, sonst kommt pro Pin bis zu 0.5mA Stromverbrauch in jedem 
Power-Modus dazu. Das merkt man auch besonders schön, wenn man Pins an 
LEDs auf Eingang schaltet und diese Pins dann die Flussspannung der LED 
annehmen, die um 2.2V liegt. Wenn der Controller mit 4..5V betrieben 
wird, ist man "wunderbar" im verbotenen Bereich, wo beide Eingangs-FETs 
leiten. Also besser den Pin auf Ausgang Low schalten, wenn die externe 
Last nach Masse geschaltet ist oder entsprechend auf Ausgang High, wenn 
die externe Last an Vcc geschaltet ist. Ist der Pin frei, dann ist 
Eingang-PullUp die sicherste Variante.

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Das BOR braucht leider auch sehr viel Strom. Braucht man den EEPROM, muß
> man daher einen externen sparsameren Reset-IC nehmen.

Oder man konfiguriert den BOD einfach so, daß er im Sleepmodus 
abgeschaltet wird. Siehe BODS/BODSE in MCUCR. Zumindest beim 1284P ist 
das möglich, das weiß ich sicher, weil ich das selber schon erfolgreich 
benutzt habe.

Vermutlich gibt es diese Funktion aber auch bei vielen anderen neueren 
AVRs.

von Thomas E. (thomase)


Lesenswert?

c-hater schrieb:
> Vermutlich gibt es diese Funktion aber auch bei vielen anderen neueren
> AVRs.
Der 44a kann das auch.

mfg.

von Mc S. (mcsplanish)


Lesenswert?

Erstmal danke für die "Hinweise".

Aber letztendlich habe ich doch alles so gemacht!

ADC ist abgeschalten. Pins sind alle als Ausgang konfiguriert und die 
7-Segment hat gemeinsame Kathode.
Analogkomperator wird laut Datenblatt im power-down sowiso gekillt.
Watchdog und BOD sind mit den fuses abgeschalten.

So und wat nu?

von Thomas E. (thomase)


Lesenswert?

Mc Splanish schrieb:
> So und wat nu?
Benutzt du einen Debugger?
Im DW-Mode ist der Sleep unwirksam.

mfg.

von Mc S. (mcsplanish)


Lesenswert?

Nein! Ich sehe dass der Tiny44 schlafen geht. Bei der 7-Seg alle LED an 
= 7mA. Alle aus 1,2mA. Geht er schlafen. 360uA... Da muss doch weniger 
gehen?!

von Thomas E. (thomase)


Lesenswert?

Also kein Debugger.
Prorammer ist natürlich auch nicht gesteckt und das Multimeter ist 
hochwertig genug, dass es sich im <µA-Bereich keine Werte ausdenkt, um 
überhaupt etwas anzuzeigen?

mfg.

von Mc S. (mcsplanish)


Lesenswert?

AHHHHHHHHHHHHHH!!!!

Der Programmer wars ;) Oh man! Danke! Und jetzt mach ich besser erstmal 
den Rechner aus!

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.