attiny44A power down

OP #3049548
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
Gast #3049556
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
Gast #3049618
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
#3049647
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.
Gast #3049663
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.
(Firma: TravelRec.) Persönliche Seite #3049671
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.
Gast #3049682
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.
OP #3049892
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?

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