打印

按键触发无法唤醒

[复制链接]
721|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2022-1-2 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近,在做低功耗的项目,用到了单片机sleep休眠,唤醒方式采用按键,电平变化触发。晶振采用内部4M
采用3节7号南孚电池大概是4.8V供电


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

使用特权

评论回复
沙发
dingy| | 2022-1-2 11:14 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zyf部长|  楼主 | 2022-1-2 11:14 | 只看该作者

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()循环,开关机
           }            
        }
    }
更多操作

使用特权

评论回复
地板
shimx| | 2022-1-2 11:16 | 只看该作者
检查一下是不是关掉了外部中断使能, 顺便看一下全局中断使能.

使用特权

评论回复
5
zyf部长|  楼主 | 2022-1-2 11:19 | 只看该作者

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

使用特权

评论回复
6
wyjie| | 2022-1-2 11:23 | 只看该作者
init函数里面的内容不贴出来别人怎么知道你是怎么写的?

使用特权

评论回复
7
juventus9554| | 2022-1-2 11:25 | 只看该作者
按键是中断、?看看按键相关的操作是否弄好

使用特权

评论回复
8
chuxh| | 2022-1-2 11:32 | 只看该作者
楼主意思是短时间休眠后可以唤醒,而长时间不行?多长时间?

使用特权

评论回复
9
dengdc| | 2022-1-2 11:37 | 只看该作者
检查下 ANSB 设置得对不对?要将按键IO口设为数字IO,而上电默认是模拟输入

使用特权

评论回复
10
xxrs| | 2022-1-2 11:43 | 只看该作者
时钟配置和中断配置以及端口配置检查一下

使用特权

评论回复
11
zhenykun| | 2022-1-2 11:45 | 只看该作者
系统睡死了。

使用特权

评论回复
12
stly| | 2022-1-2 11:47 | 只看该作者
重新上电, 是无需唤醒的, 系统是POR的...

使用特权

评论回复
13
hanwe| | 2022-1-2 11:50 | 只看该作者
另外, 你怎么判断MCU是进入休眠了呢?

使用特权

评论回复
14
zhenykun| | 2022-1-2 11:52 | 只看该作者
要不, 接个万用表观测一下电流,  看是不是真正的进入了休眠..而不是跑飞了..

使用特权

评论回复
15
stly| | 2022-1-2 11:55 | 只看该作者
唤醒之后,进入中断服务程序了,话说你在中断服务程序里面干了些什么?

使用特权

评论回复
16
stly| | 2022-1-2 11:57 | 只看该作者
何为“长时间”,短时间行?

使用特权

评论回复
17
xxrs| | 2022-1-2 11:59 | 只看该作者
对呀,休眠之后是不是要有其他什么东西在运行?

使用特权

评论回复
18
zyf部长|  楼主 | 2022-1-2 12:01 | 只看该作者
你好,我也猜测是没进入休眠,写了sleep();怎么会不进入呢?

使用特权

评论回复
19
zwll| | 2022-1-2 12:03 | 只看该作者
我想是耗电过大,导致电池电压小,电量不足造成的

使用特权

评论回复
20
zyf部长|  楼主 | 2022-1-2 12:06 | 只看该作者
中断中,进行变量的++,应该不是这个造成的,我重新上电,然后一直按开关机键可以,实现开关机

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝