12f508睡眠唤醒问题

2020-02-08 09:22发布

我的代码睡眠后唤不醒,是通过电压变化来唤醒的
GP0--------------------KEY1   接开关后直接接地
GP1--------------------KEY2   接开关后直接接地
GP2--------------------LED    经电阻后接LED,接地
void fIoInit()
{
        OPTION = 0;
        TRIS = 0xf8;
        GPIO = 0xff;
}

if(0x03 == (0x03&GPIO))     需要睡眠的时候,检测一下电平是否正常,LED端口是低,按键端口是高
{
    GPIO = GPIO;
    GPIO = GPIO;            读IO状态,然后进入睡眠
    SLEEP();
}
在工作状态下,KEY1按一下进入睡眠
但醒不过来了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
crazydog2009
1楼-- · 2020-02-08 11:22
有人救救俺么,唉。以前未用过这芯片,呵呵,datasheet写得也很简单。其实这芯片本来就简单,唉。
crazydog2009
2楼-- · 2020-02-08 17:17
手册里有说到这么一句
注:
当TRIS 位清零(= 0)时,相应引脚的电
平变化唤醒和上拉功能都是被禁止的
(即,注意TRIS 的优先级高于GPPU/RBPU 和GPWU/RBWU 选择控制位)。


将TRIS 寄存器的某位置1,可
使相应的输出驱动器置于高阻模式。 而将TRIS 寄存器
的某位清零,会将输出数据锁存器的内容送入选定的引
脚并使能输出缓冲器。

不知道是不是这原因了。我的tris一直是0。
crazydog2009
3楼-- · 2020-02-08 18:55
 精彩回答 2  元偷偷看……
wangjiati
4楼-- · 2020-02-09 00:50
关于休眠:

状态寄存器(地址:03h)(PIC12F508/509)

bit 4 TO:超时位
    1 = 在上电或执行CLRWDT 或SLEEP 指令之后
    0 = 发生了WDT 超时
bit 3 PD:掉电位
    1 = 上电或执行了CLRWDT 指令之后
    0 = 执行了SLEEP 指令

//此机 程序总线宽度为12位,休眠时不能几下断点,因堆栈只有2级,记不下休眠地址,只能用户自己想办法. MUC提供了两个标志位
crazydog2009
5楼-- · 2020-02-09 04:16
谢谢楼上解答,是不是说,上电的时候需要检测这两标志位,如果是IO口电平发生变化,需要重新初始化呢?

一周热门 更多>