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
voidinit_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
voidinit_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
intmain(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
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
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.
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
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.
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.
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.
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.
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?
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.