[PIC®/AVR®/dsPIC®产品]

pic16f1787单片机sleep 唤醒问题

[复制链接]
1721|19
手机看帖
扫描二维码
随时随地手机跟帖
y18370990546|  楼主 | 2019-2-22 09:45 | 显示全部楼层 |阅读模式
本帖最后由 y18370990546 于 2019-3-2 18:38 编辑

最近,在做低功耗的项目,用到了单片机sleep休眠,唤醒方式采用按键,电平变化触发。晶振采用内部4M
采用3节7号南孚电池大概是4.8V供电


出现问题:长时间休眠之后,按键触发无法唤醒,需重新上电,休眠能被按键唤醒才可以(目前猜测是用电过大,导致电池没电造成)

程序如下:
void init()
{
    OSCCONbits.SCS = 0x2;       //选择内部4M晶振
    OSCCONbits.IRCF = 0xd;
    OSCCON = 0b11101010;
    TRISD = 0;
    TRISC = 0;
    TRISB = 0b00111011;          //RB0,RB1,RB3,RB4,RB5输入
    ANSELB = 0;
    ANSELD = 0;
    PORTB = 0;
    LATB = 1;
    LATD = 0;
    LATC = 0;
}

void main()
{
    init();                                    //相应I0口配置
    OPTION_REG |= 0b0000000;  //INT选择上升沿触发唤醒休眠
    IOCBP = 0x1;                        //电平上升沿触发               
    IOCBN = 0x0;
    INTCON |=  0b11000000;       //全局中断GIE,外围PIE1使能
    INTCONbits.IOCIE = 1;          //电平变化中断使能
    SLEEP();                               //休眠
    NOP();                                 //空
    while(INT_value == 1)         //中断唤醒
    {........}
}
void interrupt ISR (void)
{
   if(INTCONbits.IOCIF && PORTBbits.RB0 == 1)  //开关机键外部中断唤醒单片机,
    {      
        if(PORTBbits.RB0==1)//开机键按下
        {   
            __delay_ms(50);
            if(PORTBbits.RB0==1)//再次判断
            {
                INTCONbits.IOCIF=0;
                INT_value++;                                  //外部中断变量++
                INT_value=(INT_value==1)? 1:0;     //通过INT_value变量控制while()循环,开关机
           }            
        }
    }

求教各位!!!帮忙解惑答疑。
CoolSilicon| | 2019-2-22 14:34 | 显示全部楼层
检查一下是不是关掉了外部中断使能, 顺便看一下全局中断使能.

使用特权

评论回复
y18370990546|  楼主 | 2019-2-22 16:24 | 显示全部楼层
CoolSilicon 发表于 2019-2-22 14:34
检查一下是不是关掉了外部中断使能, 顺便看一下全局中断使能.

已重新编辑,并粘贴部分程序,请再思考一下

使用特权

评论回复
钓鱼大师| | 2019-2-23 16:59 | 显示全部楼层
y18370990546 发表于 2019-2-22 16:24
已重新编辑,并粘贴部分程序,请再思考一下

init函数里面的内容不贴出来别人怎么知道你是怎么写的?

使用特权

评论回复
小明的同学| | 2019-2-24 09:06 | 显示全部楼层
按键是中断、?看看按键相关的操作是否弄好

使用特权

评论回复
gyxlzc| | 2019-2-24 15:10 | 显示全部楼层
楼主意思是短时间休眠后可以唤醒,而长时间不行?多长时间?

使用特权

评论回复
gyxlzc| | 2019-2-24 15:21 | 显示全部楼层
检查下 ANSB 设置得对不对?要将按键IO口设为数字IO,而上电默认是模拟输入

使用特权

评论回复
jujkjmjh| | 2019-2-25 17:11 | 显示全部楼层
时钟配置和中断配置以及端口配置检查一下

使用特权

评论回复
734774645| | 2019-2-25 23:06 | 显示全部楼层
系统睡死了。

使用特权

评论回复
CoolSilicon| | 2019-2-26 08:57 | 显示全部楼层
重新上电, 是无需唤醒的, 系统是POR的...

另外, 你怎么判断MCU是进入休眠了呢?
要不, 接个万用表观测一下电流,  看是不是真正的进入了休眠..而不是跑飞了..

使用特权

评论回复
cdyyabc| | 2019-2-26 09:34 | 显示全部楼层
唤醒之后,进入中断服务程序了,话说你在中断服务程序里面干了些什么?

使用特权

评论回复
lcczg| | 2019-2-27 10:08 | 显示全部楼层
何为“长时间”,短时间行?

使用特权

评论回复
钓鱼大师| | 2019-2-27 11:19 | 显示全部楼层
lcczg 发表于 2019-2-27 10:08
何为“长时间”,短时间行?

对呀,休眠之后是不是要有其他什么东西在运行?

使用特权

评论回复
y18370990546|  楼主 | 2019-3-2 17:36 | 显示全部楼层
CoolSilicon 发表于 2019-2-26 08:57
重新上电, 是无需唤醒的, 系统是POR的...

另外, 你怎么判断MCU是进入休眠了呢?

你好,我也猜测是没进入休眠,写了sleep();怎么会不进入呢?
我想是耗电过大,导致电池电压小,电量不足造成的

使用特权

评论回复
y18370990546|  楼主 | 2019-3-2 17:39 | 显示全部楼层
cdyyabc 发表于 2019-2-26 09:34
唤醒之后,进入中断服务程序了,话说你在中断服务程序里面干了些什么?

中断中,进行变量的++,应该不是这个造成的,我重新上电,然后一直按开关机键可以,实现开关机

使用特权

评论回复
y18370990546|  楼主 | 2019-3-2 18:13 | 显示全部楼层
钓鱼大师 发表于 2019-2-27 11:19
对呀,休眠之后是不是要有其他什么东西在运行?

设置了端口上拉,然后休眠,没有其它的呢,搞不清这是为何?

使用特权

评论回复
CoolSilicon| | 2019-3-3 10:50 | 显示全部楼层
y18370990546 发表于 2019-3-2 18:13
设置了端口上拉,然后休眠,没有其它的呢,搞不清这是为何?

有可能是一进入休眠, 然后马上又被唤醒了...

使用特权

评论回复
oxygenzz| | 2019-3-3 17:44 | 显示全部楼层
1. main函数里面,没有while(1),导致main函数只执行一次就会退出
  SLEEP();                               //休眠
    NOP();                                 //空
    while(INT_value == 1)         //中断唤醒
    {........}
2. 中断服务程序里面,INT_value这样处理的用意是什么?
                INT_value++;                                  //外部中断变量++
                INT_value=(INT_value==1)? 1:0;     //通过INT_value变量控制while()循环,开关机
3. 如果怀疑是电压太低,可以用万用表测量实际电压

使用特权

评论回复
北极风| | 2019-3-4 08:28 | 显示全部楼层
应该是楼上说的第一条的原因。主程序进图休眠,喊醒一次就不再休眠了。

使用特权

评论回复
operating| | 2019-3-5 17:57 | 显示全部楼层
楼上正解,楼主可以改了试一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

112

帖子

0

粉丝