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
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
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.
PICmicro® Power Managed Tips 'n Tricks https://www.google.ie/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjC54iPyZHLAhUCXRoKHaaGC6sQFggcMAA&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2Fdevicedoc%2F41200B.pdf&usg=AFQjCNFT5bwVRHThPtFQP9in7BR9kGHe-g&cad=rja
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??
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.