Hallo zusammen,
leider habe ich gerade mal wieder ein Brett vor dem Kopf. Ich möchte
einen Attiny44 schlafen legen. Dies klappt auch super. Der Stromverbauch
geht wie angegeben runter. Jetzt konfiguriere ich einen Port (als
Interrupt) dazu. Wenn sich der Tiny schlafen legt fällt, der Strom -
jedoch fängt dieser dann an zu steigen und geht in den milliampere
Bereich. Der Port ist dabei unbeschaltet. Lege ich Spannung oder Masse
an den Port, bleibt der Strom auf dem sehr niedrigen Niveau.
Ich benötige einen Port Change Interrupt um den Tiny wieder aufzuwecken
(nicht unten enthalten).
Warum saugt ein unbeschalteter Port so viel Strom - oder stehe ich auf
der Leitung.
Hier das Programm:
1
#include<avr/io.h>
2
#include<avr/sleep.h>
3
4
intmain(void){
5
DDRB&=~(1<<PB1);// Input
6
PORTB|=(1<<PB1);// high
7
8
GIMSK|=(1<<PCIE1);// Pin Change Interrupt Enable
9
PCMSK1|=(1<<PCINT8);// Enable Pin Change
10
11
while(1){
12
set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Set sleep mode to POWER DOWN
13
sleep_enable();
14
sleep_mode();
15
}
16
}
Kann mir bitte einer Sagen was ich hier falsch mache.
Vielen Dank vorab.
Gruß
Frank
Mach einfach den Pullup an, dieser hält den Port definiert auf High.
Deine externe Schaltung muss den Pin, um einen Interrupt auszulösen,
kurz auf Masse ziehen. Floatende Pins vebrauchen bei CMOS immer viel
Strom, weil um VCC/2 herum beide Transistoren des Eingangspuffers
leiten.
Hab mit AVR nix am Hut,sollte aber auch nicht viel anders sein wie bei
PICs:
Pull-Ups sind normalerweise optional und muessen entsprechend
konfiguriert werden.Ein kurzer Blick ins Datenblatt zeigt mir dies -
siehe Anhang
Frank Z. schrieb:> Bereich. Der Port ist dabei unbeschaltet. Lege ich Spannung oder Masse> an den Port, bleibt der Strom auf dem sehr niedrigen Niveau.
Das sollte aber nicht sein.
Hallo Thomas,
da ich den Interrupt selber nicht ausgelöst habe. Aber der
Vollständigkeit müsste der folgende Teil noch ergänzt werden, damit im
Falle eines Interrupts kein Programm reset ausgelöst wird:
1
ISR(PCINT1_vect){
2
cli();
3
4
_delay_ms(10);
5
sei();
6
}
Ich habe es auch mit der folgenden zusatzlichen Konfig versucht. Leider
ohne Erfolg. Der Strom steigt immer noch.
1
MCUCR&=~(1<<PUD);
"In addition, the Pull-up Disable – PUD bit in MCUCR disables the
pull-up function for all pins in all ports when set.
....
the PUD bit in the MCUCR Register can be set to disable all pull-ups in
all ports.
...
Bit 6 – PUD: Pull-up Disable
When this bit is written to one, the pull-ups in the I/O ports are
disabled even if the DDxn and
PORTxn Registers are configured to enable the pull-ups ({DDxn, PORTxn} =
0b01)."
Gruß
Frank
Frank Z. schrieb:> konfiguriere ich einen Port (als> Interrupt) dazu. Wenn sich der Tiny schlafen legt fällt, der Strom -> jedoch fängt dieser dann an zu steigen und geht in den milliampere> Bereich. Der Port ist dabei unbeschaltet. Lege ich Spannung oder Masse> an den Port, bleibt der Strom auf dem sehr niedrigen Niveau.
Ach! (Loriots Stimme dazu denken)
> Warum saugt ein unbeschalteter Port so viel Strom
Weil man einen CMOS-Eingang niemals unbeschaltet lassen darf.
Laß mich das in voller Klarheit noch einmal sagen: NIEMALS
Ein CMOS-Eingang ist im Prinzip der Gate-Anschluß eines MOSFET (genauer
geagt: zweier MOSFET, ist für unseren Zweck nebensächlich). Ein solches
Gate ist elektrisch ein Kondensator von einigen pF und wenn es nicht
beschaltet ist, sammelt sich durch Leckströme (Flußmittel-Reste auf der
Leiterplatte? Luftfeuchte?) oder elektromagnetische Einstreuung eine
Spannung auf dem Gate und der Eingang gerät in den "verbotenen" Bereich
zwischen H- und L-Pegel. Und dann säuft das ganze Gebilde Strom.
Leg deinen Eingang mit einem hochohmigen Widerstand auf den inaktiven
Pegel (wenn der angeschlossene Schalter gegen GND schaltet, dann auf H)
und fertig. Diese Widerstände hat ein AVR in eine Richtung (auf H-Pegel)
bereits eingebaut. Sie heißen Pullup-Widerstände und müssen nur
konfiguriert werden.
Aber was mir aufgefallen ist, ist wenn ich den PinChange Interrupt im
PCMSK1 deaktiviere, dann bleibt der Strom konstant. Die nachfolgende
Zeile führt also zu dem steigenden Strom:
1
PCMSK1|=(1<<PCINT8);
Leider brauche ich aber diesen Interrupt.
1
MCUCR&=~(1<<PUD);
hat keinen Einfluss.
Gibt es irgendetwas was ich beim PinChange Interrupt übersehen habe?
Gruss
Frank
Frank Z. schrieb:> Gibt es irgendetwas was ich beim PinChange Interrupt übersehen habe?
Der Interrupt selber ist unkritisch, aber du musst alle Portpins auf
definierte Pegel setzen, auch wenn sie nicht benutzt werden. Am
einfachsten ist es, sie auf Ausgang zu schalten, man kann aber auch die
Pullups aktivieren, vorausgesetzt, sie werden nicht etwa extern auf low
gezogen.
Ein Pinchange Interrupt braucht keine besonderen Vorkehrungen, er weckt
den MC auch aus Powerdown und hat keinen zusätzlichen Stromverbrauch.
Der Tiny44 hat auch das PRR Register, in dem du nicht benutzte
Peripherie, wie z.B. den ADC oder unbenutzte Timer abschalten kannst.
Mit all diesen Vorkehrungen kannst du den Tiny unter 1µA Stromaufnahme
bringen.
Frank Z. schrieb:> Aber was mir aufgefallen ist, ist wenn ich den PinChange Interrupt im> PCMSK1 deaktiviere, dann bleibt der Strom konstant. Die nachfolgende> Zeile führt also zu dem steigenden Strom:PCMSK1 |= (1 << PCINT8);Leider> brauche ich aber diesen Interrupt.MCUCR &= ~(1<<PUD); hat keinen> Einfluss.>> Gibt es irgendetwas was ich beim PinChange Interrupt übersehen habe?
Ja, ATMEL DaBla.
Deswegen dein Zirkus mit Stromverbrauch.
Mach es so, wie empfohlen:
Axel S. schrieb:> und fertig. Diese Widerstände hat ein AVR in eine Richtung (auf H-Pegel)> bereits eingebaut. Sie heißen Pullup-Widerstände und müssen nur> konfiguriert werden.
P.S.
Die internen PullUps sind zwischen 20K und 50K, das kostet dich
also zwischen 100 und 250uA Strom.
Hallo zusammen,
ich habe mal einen neune Tiny genommen. Der arbeitet wie erwartet.
Stromverbrauch liegt bei 5uA mit eingeschaltetem Watchdog. Steigt auch
nicht - ABER mit nach Masse gezogenen Eingang, liegt der Stromverbrauch
bei 91uA. Das ist mir viel zu hoch, da ich nur Öffner benutzen kann. Wie
hochohmig darf denn ein externer Pullup am Eingang sein? 800kOhm klappen
wohl.
Gruß
Frank
Frank Z. schrieb:> ich habe mal einen neune Tiny genommen. Der arbeitet wie erwartet.
Sehr unwahrscheinlich. Das kann eigentlich nur passieren, wenn bei
deinem "alten" Tiny der Pullup kaputt sein sollte. Von so etwas habe ich
noch nie gehört, geschweige denn es selber gesehen ...
> mit nach Masse gezogenen Eingang, liegt der Stromverbrauch> bei 91uA. Das ist mir viel zu hoch, da ich nur Öffner benutzen kann.
Öffner und Strom sparen verträgt sich schlecht.
> Wie hochohmig darf denn ein externer Pullup am Eingang sein?
Kommt drauf an, wie schnell du reagieren mußt. Parasitäre Kapazitäten
werden dann halt nur vom Pullup umgeladen. Je langsamer das passieren
darf, desto größer kannst du den Pullup wählen.
Andererseits gibt es natürlich auch so etwas wie Leckströme [1] und
elektromagnetische Einstreuungen ...
[1] Leckströme sind typischerweise extrem temperaturabhängig. Eine
Schaltung, die bei 25°C Raumtemperatur funktioniert, kann dann bei 70°C
(Auto in der Sonne) spektakulär versagen.