PIC verbraucht im SLEEP Modus zu viel Strom

Gast #2186709
Lesenswert?

Hallo,

ich verwende einen PIC 18F1320, der an einer 4V Quelle hängt. Bevor ich 
den PIC in den Sleep-Modus schicke, setzte ich alle PIN als Ausgang und 
ziehe diese auf Masse. Dennoch verbraucht der PIC ca 130µA im FULL SLEEP 
Modus. Um ganz sicher zu gehen, dass es nicht an anderen Komponenten, 
die am Port hängen liegt, habe ich diese von den Ports abgezogen. Nur 
noch der MCLR hängt auf high. Dennoch bleibt der Stromverbrauch gleich 
hoch nach einem sleep(SLEEP_FULL);.

ADC habe ich mit:
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
auch ausgeschaltet.

Jemand eine Ahnung woran es noch liegen könnte? Gibt es noch irgendwas 
was ich ausschalten muss? Laut Datenblatt soll der Stromverbrauch nur 
bei 0,1µA liegen.
Gast #2186729
Lesenswert?

hmm - ich hab auch schon an ein paar PICs rumkonfiguriert um den 
Ruhestromverbrauch zu optimieren.
Die Ports hast Du ja schon richtig gesetzt und den ADC deaktiviert...
Ich glaube ohne BOR kann man auch noch ein paar uA einsparen, schau mal 
ob der power-up timer was bringt.
Das stellst Du mit dem Config-word ein.
Ist mit dem Sleep_Full der watchdog deaktiviert?
Gast #2186738
Lesenswert?

Ja, das sollte alles aus sein. Meine Config sieht so aus:
1
#FUSES NOWDT                   //No Watch Dog Timer
2
#FUSES INTRC_IO                //Internal RC Osc, no CLKOUT
3
#FUSES NOPUT                   //No Power Up Timer
4
#FUSES PROTECT                 //Code protected from reading
5
#FUSES NOPUT                   //No Power Up Timer
6
#FUSES NOBROWNOUT              //No brownout reset
7
#FUSES MCLR                    //Master Clear pin enabled
8
#FUSES NOLVP                   //No low voltage prgming
9
#FUSES NOCPD                   //No EE protection
Gast #2186775
Lesenswert?

OK...
hast Du schonmal das Datenblatt durchgeackert - da gibts oft so 
Aufschlüsselungen des Stromverbrauchs der "internen Peripherie".
Vielleicht gibts da ja noch was das Du nicht deaktiviert hast.

...sehe gerade im Datenblatt, daß im Sleep Mode alle Peripherie 
abgeschaltet wird.
Ich hab mal mit dem '1220 gearbeitet, allerdings nicht 
verbrauchsorientiert...

130uA hört sich nicht wirklich nach Sleep Mode an, bist Du sicher, daß 
der Befehl so funktioniert?
Du kannst Dir ja mal eine PWM erzeugen oder den Timer so konfigurieren, 
daß ein periodisches Signal ausgegeben wird - dann siehst Du ja ob er 
schlafen geht.
Der Strom kann auch wirklich nicht von der Außenbeschaltung verursacht 
werden?

Mehr fällt mir jetzt auch nicht ein - da ist wohl intensives 
Datenblattstudium oder Experimente fällig...

Viel Erfolg!
Gast #2186797
Lesenswert?

inse schrieb:
> ...aber eigentlich hatte er vom Stromverbrauch des PICs geschrieben,
> nicht der ganzen Schaltung...wir werden's (hoffentlich) sehen...

Der PIC kanns wohl nicht sein. Bei mir braucht ein PIC18F2520 im Mittel 
ca 10uA und wird dabei alle 16 ms aufgeweckt um den LCD-Multiplex für 
eine passive Anzeige durchzuführen. Alle Sekunde wird dabei auch noch 
der ADC für 2 Meßwerte aktiviert.

Er hat ja auch nur geschrieben daß er die Daten-Leitungen zur Peripherie 
unterbrochen hat...

Gruß Anja
Gast #2188050
Lesenswert?

Meine Schaltung sieht so aus, dass GND an Vss hängt und +4V and VDD. 
Alle anderen Pins sind nicht verbunden. Auch sonst gibt es keine 
weiteren Geräte mehr, die sonst noch dran hängen und Ströme verursachen 
würden. Habe das ganz auf Lochraster gelötet.


Mein momentan minimierter Code sieht so aus:
1
void setupPIC()
2
{
3
   setup_adc_ports(NO_ANALOGS);
4
   setup_adc(ADC_OFF);
5
   setup_wdt(WDT_OFF);
6
   setup_timer_0(T0_INTERNAL|T0_DIV_64|T0_8_BIT);
7
   setup_timer_1(T1_DISABLED);
8
   setup_timer_2(T2_DISABLED,0,1);
9
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
10
   setup_ccp1(CCP_OFF);
11
   ext_int_edge( 0, H_TO_L);
12
   clear_interrupt(INT_EXT);
13
   enable_interrupts(INT_EXT);
14
}
15

16
void goSleep()
17
{  
18
  //prepare for shutdown
19
  disable_interrupts(GLOBAL);
20
  SET_TRIS_B(0b00000000);
21
  SET_TRIS_A(0b00000000);  
22

23
  output_a(0);
24
  output_b(0);
25
  sleep(SLEEP_FULL);
26
}
27

28

29
void main()
30
{
31

32
  setupPIC();
33
  goSleep();
34
  while(TRUE);
35
}

Doch trotz der minimalen Schaltung und des minimalen Codes zeigt mein 
Multimeter exakt 135µA an :(

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