微芯片PIC16F1829深度睡眠

微芯片PIC16F1829深度睡眠,c,embedded,microcontroller,pic,microchip,C,Embedded,Microcontroller,Pic,Microchip,我正在努力让PIC16F1829进入睡眠模式。当数据表在深度睡眠模式下引用20nA时,该装置的电流约为18mA。有人能帮忙吗 根据数据表,我必须执行以下“WDT、BOR、FVR和T1OSC 禁用,所有外围设备处于非活动状态”我认为这是按如下所示完成的 #include <pic16Lf1829.h> #include <plib/adc.h> #include <plib/pconfig.h> #include <plib

我正在努力让PIC16F1829进入睡眠模式。当数据表在深度睡眠模式下引用20nA时,该装置的电流约为18mA。有人能帮忙吗

根据数据表,我必须执行以下“WDT、BOR、FVR和T1OSC 禁用,所有外围设备处于非活动状态”我认为这是按如下所示完成的

    #include <pic16Lf1829.h>
    #include <plib/adc.h>
    #include <plib/pconfig.h>
    #include <plib/usart.h>


    // Use project enums instead of #define for ON and OFF.

    // CONFIG1
    #pragma config FOSC = ECL    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
    #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    #pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
    #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

    // CONFIG2
    #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
    #pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)


int main(int argc, char** argv) {
/*******************OSCILATOR CONFIGURATION*************/
    OSCCON = 0b01101000; // OSCILATOR CONTROL REGISTER 1MHz
    BORCON = 0x00;
    WDTCON    = 0x00; // Enable watchdog timer
/*******************************************************************************/


/**********************PORT A,B,C SETUP*************************************/

    ANSELB  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    WPUB     =  0b00000000; /* Enable PULL UP 1 = yes 0 - NO*/
    TRISB   =   0b00000000; /* Tri-state PIN*/
    PORTB   =   0b00000000; /* Set PORTB Logic */

    WPUC =      0b00000000;
    ANSELC  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    TRISC   =   0b00000000; /* Tri-state PIN*/
    PORTC =     0b00000000; /* Set PORTB Logic */

    WPUA =      0b00000000;
    ANSELA  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    TRISA   =   0b00000000; /* Tri-state PIN*/
    PORTA   =   0b00000000; /* Set PORTB Logic */


    IOCBP   = 0b00100000;  /* INTERRUPT-ON-CHANGE PORTB POSITIVE EDGE REGISTER*/
    IOCBN   = 0b00000000;  /* INTERRUPT-ON-CHANGE PORTB NEGATIVE EDGE REGISTER*/
    INTCON  = 0b01011000;  /* Enable int on PIN Change*/
 /*******************************************************************************/

    bit_set(INTCON,7); /*ENABLE GLOBAL INTERUPTS*/

    ADCON0 = 0x00;
    ADCON1 = 0x00;

    T1CON  = 0x00;
    T2CON  = 0x00;
    FVRCON = 0x00; //FIXED VOLTAGE REFERENCE CONTROL REGISTER
    CM1CON0 = 0x00;
    CM1CON1 = 0x00;
    CM2CON1 = 0x00;
    CM2CON0 = 0x00;
    PWM1CON = 0x00;
    PWM2CON = 0x00;
    DACCON0 = 0X00;
    DACCON1 = 0X00;
    T1CON =   0X00;


    /********** MAIN LOOP START*******************/
        for(;;) {

    SLEEP();


           }
#包括
#包括
#包括
#包括
//使用项目枚举而不是#定义用于打开和关闭。
//配置1
#pragma config FOSC=ECL//振荡器选择(INTOSC振荡器:CLKIN引脚上的I/O功能)
#pragma config WDTE=OFF//Watchdog Timer Enable(WDT禁用)
#pragma config PWRTE=OFF//通电定时器启用(PWRT禁用)
#pragma config MCLRE=ON//MCLR引脚功能选择(MCLR/VPP引脚功能为MCLR)
#pragma config CP=OFF//Flash程序存储器代码保护(程序存储器代码保护被禁用)
#pragma config CPD=OFF//数据内存代码保护(数据内存代码保护已禁用)
#pragma config BOREN=OFF//Brown out重置启用(Brown out重置禁用)
#pragma config CLKOUTEN=OFF//Clock Out Enable(CLKOUT功能被禁用。CLKOUT引脚上的I/O或振荡器功能)
#pragma config IESO=ON//内部/外部切换(启用内部/外部切换模式)
#pragma config FCMEN=ON//Fail-Safe Clock Monitor Enable(故障安全时钟监视器已启用)
//配置2
#pragma config WRT=OFF//闪存自写保护(写保护关闭)
#pragma config PLLEN=OFF//PLL启用(4x PLL禁用)
#pragma config STVREN=ON//堆栈溢出/下溢重置启用(堆栈溢出或下溢将导致重置)
#pragma config BORV=LO//Brown out重置电压选择(Brown out重置电压(Vbor),选择低触发点。)
#pragma config LVP=ON//低压编程启用(低压编程启用)
int main(int argc,字符**argv){
/*******************振荡器配置*************/
OSCCON=0b01101000;//振荡器控制寄存器1MHz
BORCON=0x00;
WDTCON=0x00;//启用看门狗定时器
/*******************************************************************************/
/**********************端口A、B、C设置*************************************/
ANSELB=0b00000000;/*启用数字输入=0或模拟输入=1*/
WPUB=0b00000000;/*启用上拉1=是0-否*/
TRISB=0b00000000;/*三态引脚*/
端口B=0b00000000;/*设置端口B逻辑*/
WPUC=0b0000000;
ANSELC=0b00000000;/*启用数字输入=0或模拟输入=1*/
TRISC=0b00000000;/*三态引脚*/
端口C=0b00000000;/*设置端口B逻辑*/
WPUA=0b0000000;
ANSELA=0b00000000;/*启用数字输入=0或模拟输入=1*/
TRISA=0b00000000;/*三态引脚*/
PORTA=0b00000000;/*设置端口B逻辑*/
IOCBP=0b00100000;/*更改端口B正边缘寄存器上的中断*/
IOCBN=0b00000000;/*更改端口B负边缘寄存器时中断*/
INTCON=0b01011000;/*启用int on引脚更改*/
/*******************************************************************************/
位设置(INTCON,7);/*启用全局中断*/
ADCON0=0x00;
ADCON1=0x00;
T1CON=0x00;
T2CON=0x00;
FVRCON=0x00;//固定电压参考控制寄存器
CM1CON0=0x00;
CM1CON1=0x00;
CM2CON1=0x00;
CM2CON0=0x00;
PWM1CON=0x00;
PWM2CON=0x00;
DACCON0=0X00;
DACCON1=0X00;
T1CON=0X00;
/**********主回路启动*******************/
对于(;;){
睡眠();
}

这可能是由于缺少异常处理。您启用中断,但没有捕获中断的功能。如果出于任何原因,将设置中断标志,则无需清除该标志,并且您的pic将分支到中断向量,因为GIE已设置(即使处于睡眠状态)。由于您尚未指定中断函数,您可能(取决于您的编译器)最终会在未编程的内存区域中全速执行任意指令

请尝试使用相同的代码:

---  INTCON  = 0b01011000;  /* Enable int on PIN Change*/
+++  INTCON  = 0b00000000;  /* Disable all int */

根据数据表,18mA对于该mcu来说太高(32Mhz时约5mA)

  • 确认mcu引脚未短路
  • 验证输出电压是否正确配置。(例如,i2c引脚应为“输出高”等)
  • 验证您的VCC没有为其他模块供电

你确定18mA是由芯片而不是电路的其他部分绘制的吗?是的,我确定它不是外部电路,我的电路与PIC16F1509相同。这是在深度睡眠中绘制的20nA。我只是简单地切换了芯片。@Clifford是的-我遇到了这个问题,在半小时的头部紧急停堆后意识到了这一点例如,电路板上的一个LED仍然亮着:)你用什么源给处理器计时?通常超低睡眠模式使用次级低频振荡器(或外部芯片)做这项工作。如果你不小心用错了高频电源,那会大大提高功耗。你可以试着在这里问:也可以。你确定
1829
的引脚与
1509
的引脚相同吗?在正常工作条件下,PIC的18 mA似乎相当高,因此可能是不匹配的情况皮诺和一些短路的东西。