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

小弟新手,请教PIC12F508休眠和唤醒

[复制链接]
4154|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tybls|  楼主 | 2013-11-11 14:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近有个小玩意要用到PIC12F508,
电路是这样的,POWER键接在GP5脚,另一个模式切换键接在GP4脚,GP0,GP1接两个电机

为什么POWER键可以进入休眠,但是醒不过来呢?
下面是我的程序,请大侠帮忙看看。

#include <pic.h>//头文件
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(OSC_IntRC&WDT_OFF);//内部RC,看门狗禁止

#define _XTAL_FREQ 4000000

#define m1 GP4//电机m1
#define m2 GP5//电机m2


#define key_power   0x20                 //power键值
#define key_mode        0x10                 //mode键值

uchar motor_mode = 1;        //模式
uchar key_trg;                //按键触发
uchar key_count;        //长按


void get_key(void)                         
{
        uchar temp_data;

        temp_data = (GPIO & 0x30) ^ 0xff;//取得按键状态
        key_trg = temp_data & (temp_data^key_count);//保存触发状态
        key_count = temp_data;
}


void key_proc(void)                 
{
        if (key_trg & key_power)//按电源键
        {   
                GPIO = GPIO;//读取IO
                SLEEP(); //进入休眠模式
        }
        if (motor_mode)//按模式键
        {
                if (key_trg & key_mode)        //模式切换               
                {
                        motor_mode++;
                        if (motor_mode > 3)
                        {
                                motor_mode = 1;
                        }
                }
        }
}

void motor_proc()
{
        if (motor_mode == 0){m1 = 0;m2 = 0;}
        if (motor_mode == 1){m1 = 1;m2 = 1;}
        if (motor_mode == 2){m1 = 0;m2 = 1;}
        if (motor_mode == 3){m1 = 1;m2 = 0;}
}

/****************************************主程序*/
void main()
{
         #asm
                movlw    0FCh;
                tris     6;//设置端口GP0,GP1输出,其他输入
     #endasm

          while(1)
        {
                get_key();
                key_proc();
                motor_proc();
                __delay_ms(10);
    }       
}   
沙发
yewuyi| | 2013-11-11 16:04 | 只看该作者
说的可真是大废话。

在执行POWER键之后,让MCU进入了SLEEP状态,此随后所有的代码都不能执行,所以你那自认为会起作用的唤醒键检测代码自然也不会工作。

你应该打开看门狗,在进入SLEEP之后,由看门狗定时唤醒MCU,然后MCU检测是否有唤醒键动作,如果没有动作则再次进入睡眠,如果有动作,则起床工作。

使用特权

评论回复
板凳
XIEYUANBIN| | 2013-11-11 16:59 | 只看该作者
12F508有引脚变换唤醒功能,但是,唤醒之后是复位而不是从SLEEP之后执行代码,所以你每次复位之后都要查查,是什么复位。

使用特权

评论回复
地板
tozxq| | 2013-11-15 10:12 | 只看该作者
楼上的正解,详情可见数据手册中寄存器的复位条件表,看表中唤醒对应的PC值:

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝