Forum: Mikrocontroller und Digitale Elektronik PIC18 Sleep Mode - LOW Power Modus


von PICIPACO (Gast)


Lesenswert?

Hallo,

ich habe einen PIC18LF25K50 und möchte diesen über die UART 
Schnittstelle ein externes Device (was auch immer) konfigurieren lassen.

Danach möchte ich, um Akku Kapazität zu sparen den PIC "komplett 
abschalten".

Also am besten in Sleep Modus setzen (mit dem Sleep() Makro).

Uart Schnittstelle etc. deaktivieren.
Was muss/sollte ich noch beachten?
Wie die Port Pins konfigurieren?

Anders gefragt, was muss ich alles beachten, um den PIC nach getaner 
Arbeit so wenig wie möglich Strom verbrauchen zu lassen?

Gibt es vielleicht sogar schon Beispiele für den  PIC18LF25K50?

Danke

von PICIPACO (Gast)


Lesenswert?

Alle nicht zu gebrauchenen Pins als Input setzen?

von Frank K. (fchk)


Lesenswert?

Wichtig ist, dass kein Pin zu keinem Zeitpunkt einen undefinierten Pegel 
aufweist. Das verursacht unzulässige Querströme in den Eingangsstufen.

Unbenutzte Pins also auf Ausgang und einen festen Wert setzen, oder auf 
Eingang mit Pullup oder Pulldown.

fchk

von Noch einer (Gast)


Lesenswert?

Solltest auch kontrollieren, was dein Sleep Makro alles abschaltet. Gibt 
mehrere SFRs, in denen du Peripherie und Oszillator abschalten kannst.

Die Pic Datenblätter haben ein eigenes Kapitel "Power Managed Modes". Je 
moderner der Pic, desto umfangreicher.

von Toxic (Gast)


Lesenswert?


von PICIPACO (Gast)


Lesenswert?

Danke für die Antworten.

Ich habe mir einmal das Datenblatt meines PICs ganz genau zu Gemüte 
geführt:

http://ww1.microchip.com/downloads/en/DeviceDoc/30000684B.pdf

Hier auch den Power Managed Modes Sektor.
Hier heisst es um in den Sleep Modus zu kommen muss erst einmal das Idle 
Bit gecleart werden. Im Sleep Modus ist die CPU und alle Peripherals 
OFF. Das ist also genau das was ich möchte.

Bei der Messung ergeben sich leider immer noch 2 mA. Im Sleep Modus 
sollte dieser Wert doch im Nano/mikro Bereich sein???

Einmal mein Testcode (nicht genutze Pins = Output und LOW - Level):
1
#include <p18cxxx.h>
2
#include <usart.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
6
#include "delays.h"
7
#include <string.h>
8
9
10
/** CONFIGURATION **************************************************/
11
12
#pragma config PLLSEL   = PLL3X     // 3X PLL multiplier selected
13
#pragma config CFGPLLEN = OFF       // PLL turned on during execution
14
#pragma config CPUDIV   = NOCLKDIV  // 1:1 mode (for 48MHz CPU)
15
#pragma config LS48MHZ  = SYS48X8   // Clock div / 8 in Low Speed USB mode
16
#pragma config FOSC     = INTOSCIO  // HFINTOSC selected at powerup, no clock out
17
#pragma config PCLKEN   = OFF       // Primary oscillator driver
18
#pragma config FCMEN    = OFF       // Fail safe clock monitor
19
#pragma config IESO     = OFF       // Internal/external switchover (two speed startup)
20
#pragma config nPWRTEN  = OFF       // Power up timer
21
#pragma config BOREN    = SBORDIS   // BOR enabled
22
#pragma config nLPBOR   = OFF        // Low Power BOR
23
//#pragma config WDTEN    = SWON     // Watchdog Timer controlled by SWDTEN
24
#pragma config WDTEN    = OFF      // Watchdog Timer controlled by SWDTEN
25
#pragma config WDTPS    = 32768     // WDT postscalar
26
#pragma config PBADEN   = ON       // Port B Digital/Analog Powerup Behavior
27
#pragma config SDOMX    = RB3       // SDO function location
28
#pragma config LVP      = OFF       // Low voltage programming
29
#pragma config MCLRE    = ON        // MCLR function enabled (RE3 disabled)
30
#pragma config STVREN   = ON        // Stack overflow reset
31
#pragma config XINST    = OFF       // Extended instruction set
32
33
34
// 16 MHz
35
#define FOSC        16000000 // in a global header
36
#define BAUDRATE    115200   // ""
37
#define SPBRG_VAL (((FOSC/BAUDRATE)+2)/4)-1     // BRG16=1, BGH=1 !
38
39
/** I/O pin definitions ********************************************/
40
#define INPUT_PIN 1
41
#define OUTPUT_PIN 0
42
43
void __init(void)
44
{
45
    OSCCONbits.IRCF = 0b111;                                // 16MHz
46
    OSCCONbits.IDLEN = 0;                                   // Enter Sleep Mode on instruction
47
    
48
    baud1USART(BAUD_IDLE_RX_PIN_STATE_HIGH &
49
                 BAUD_IDLE_TX_PIN_STATE_HIGH &
50
                 BAUD_16_BIT_RATE &
51
                 BAUD_WAKEUP_ON &
52
                 BAUD_AUTO_OFF);
53
54
    Open1USART( USART_TX_INT_OFF & USART_RX_INT_OFF &
55
                USART_ASYNCH_MODE & USART_EIGHT_BIT &
56
                USART_CONT_RX &
57
                USART_BRGH_HIGH & USART_ADDEN_OFF,
58
                SPBRG_VAL );
59
60
61
void UserInit(void)
62
{
63
64
    __init();                                   // UART INIT
65
66
67
    // setze unbenutzte Eingänge auf Output und definierten Zustand (hier: 0)
68
    TRISAbits.TRISA1 = OUTPUT_PIN;
69
    TRISAbits.TRISA2 = OUTPUT_PIN;
70
    TRISAbits.TRISA3 = OUTPUT_PIN;
71
72
73
    LATAbits.LATA1 = 0;
74
    LATAbits.LATA2 = 0;
75
    LATAbits.LATA3 = 0;
76
77
    TRISCbits.TRISC0 = OUTPUT_PIN;
78
    TRISCbits.TRISC4 = OUTPUT_PIN;
79
    TRISCbits.TRISC5 = OUTPUT_PIN;
80
81
    LATCbits.LATC0 = 0;
82
    LATCbits.LATC4 = 0;
83
    LATCbits.LATC5 = 0;
84
}
85
    
86
}
87
88
void InitializeSystem(void)
89
{
90
    
91
    ANSELA = 0x00;                                                  // Set All Pins to digital
92
    ANSELB = 0x00;
93
    ANSELC = 0x00;
94
    UserInit();
95
96
void main(void) {
97
    
98
    InitializeSystem();
99
100
   Sleep();                          // send Pic into Sleep
101
    while(1)
102
    {
103
104
105
    }
106
}
107
}

Muss der Oszillator noch richtig eingestellt werden? Eigentlich doch 
egal, weil dieser doch eh bei Entering des Sleep Modes abgestellt wird??

von Toxic (Gast)


Lesenswert?

Soweit ich das beurteilen kann,sollte sich der uC entsprechend deiner 
Konfiguration im sleep-Modus befinden.

Bist Du sicher,dass nicht deine aeussere Beschaltung des uCs die Ursache 
der hohen Stromaufnahme ist?

von Noch einer (Gast)


Lesenswert?

Würde zuerst mal, wie von Frank empfohlen, alle unbenutzten Pins auf 
Ausgang und Low initialisieren.

Ist an den UART Pins etwas angeschlossen? Wenn die 2mA nicht 
verschwinden, als Test die UART-Initialisierung raus nehmen und 
stattdessen alle Pins als Ausgang und Low initialisieren.

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.