Forum: Mikrocontroller und Digitale Elektronik Stromverbrauch unbeschalteter Port


von Frank Z. (frankza)


Lesenswert?

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
int main(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

: Bearbeitet durch User
von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Frank Z. (frankza)


Lesenswert?

Hallo Knut,

vielen Dank für Deine schnelle Antwort, aber mit:
1
PORTB |= (1<<PB1); // high
setze ich doch den internen Pullup - oder habe ich einen Knoten im Kopf?

Gruss

Frank

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

Hast du kontrolliert, ob dein Sleep das Pullup Disable setzt?

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Frank Z. schrieb:
> (nicht unten enthalten)

Warum nicht?

Zeig das ganze Programm.

von Frank Z. (frankza)


Lesenswert?

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

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Frank Z. (frankza)


Lesenswert?

Hallo zusammen,

der Pullup ist aktiv:
1
PORTB |= (1<<PB0);

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.
1
digital input is clamped to ground at the input of the Schmitt Trigger
2
to prevent a floating level while in sleep mode,

 ABER
1
 unless the pin is configured as an external interrupt.

 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.

: Bearbeitet durch User
von Frank Z. (frankza)


Lesenswert?

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

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

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.

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.