PIC18 Sleep Mode - LOW Power Modus

Gast #4481895
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
Gast #4482497
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.
Gast #4482807
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??
Gast #4483062
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?
Gast #4483131
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.

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