打印

PIC16F1937电平变化中断问题请教

[复制链接]
9462|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xushouxue999|  楼主 | 2012-9-17 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我将PIC16F1937电平变化中断寄存器如下设置:
IOCBP = 0X00;//正边沿电平变化中断允许
IOCBN = 0XFF;//负边沿电平变化中断允许
我的理解是只有在下降沿时才进中断,上升沿不进中断

而实际测试时发现不管是上升沿还是下降沿都进了,

不知怎么回事,我看资料怎么看怎么觉得我的理解没问题,

所以想请教各位这块到底是怎么回事,谢谢
沙发
xushouxue999|  楼主 | 2012-9-17 10:09 | 只看该作者
程序是这样的,大家帮看看:

void SYS_INT(viod)
{
        TRISB               =              0B00000111;
        ANSELB            =              0B00000000;
        IOCBP        =        0X00;        //RB口上升沿中断允许
     IOCBN        =        0X07;        //RB口下降沿中断允许
     IOCIE        =        1;
     GIE                =        1;
}

void interrupt intsrv(void)
{
//---------------timer1定时器中断------------------------------
        if(TMR1IF)
        {
                TMR1IF        =        0;
                TMR1H        =        0XFC;
                TMR1L        =        0X18;
                time20ms++;
                if(time20ms >= 20)
                {
                        time20ms = 0;
                        time20ms_reg        =        1;
                }
        }
        if(IOCBF0)
        {
                IOCBF0        =        0;
                power_380v_a_count++;       
                     TEST_GPIO = ~TEST_GPIO//在这里搞了个IO观察               
        }
        if(IOCBF1)
        {
                IOCBF1        =        0;
                power_380v_b_count++;               
        }
        if(IOCBF2)
        {
                IOCBF2        =        0;
                power_380v_c_count++;               
        }
       
}

使用特权

评论回复
板凳
1521732588| | 2012-9-17 10:11 | 只看该作者
标志位没清,进中断之后要读一下IO电平,清标志位

使用特权

评论回复
地板
xushouxue999|  楼主 | 2012-9-17 10:24 | 只看该作者
哦还要读IO电平啊,既然是中断的话按照资料理解只要设置好,
IOCBP        =        0X00;        //RB口上升沿中断允许
IOCBN        =        0X07;        //RB口下降沿中断允许
它应该就是只有在下降沿的时候,相应IOCBF才置位啊,

在这里我读相应的IOCBF位,然后清零应该就可以的啊??

使用特权

评论回复
5
xushouxue999|  楼主 | 2012-9-17 10:28 | 只看该作者
1521732588:

你说的我的标记位没有清是指什么没清啊 ??

使用特权

评论回复
6
yewuyi| | 2012-9-17 10:45 | 只看该作者
1、每个PORTB 引脚都带有一个上升沿检测器和一个下降
沿检测器。要使某个引脚检测上升沿,必须将IOCBP 寄
存器中相应的IOCBPx 位置1。要使某个引脚检测下降
沿,必须将IOCBN 寄存器中相应的IOCBNx 位置1。
通过分别将IOCBP寄存器中相应的IOCBPx位和IOCBN
寄存器中相应的IOCBNx 位置1,可将某个引脚配置为
同时检测上升沿和下降沿。

2、见手册的一下内容:
-------------------------------------------
13.3 中断标志
IOCBF 寄存器中的IOCBFx 位是与PORTB 的电平变化
中断引脚对应的状态标志位。如果在相应的已使能引脚
上检测到预期的边沿,则该引脚的状态标志位将置1,且
如果IOCIE 位置1 的话,还会产生中断。INTCON 寄存
器的IOCIF 位反映所有IOCBFx 位的状态。
13.4 清零中断标志
各个状态标志(IOCBFx 位)可通过将其复位为零来清
零。如果在清零操作期间又检测到一个边沿,那么在清
零序列结束后相关状态标志位会置1,而与实际写入的
值无关。
为了确保清零标志时不丢失所检测到的边沿,只需执行
用于屏蔽已知更改位的“逻辑与”操作。以下举例说明
了应执行的序列。
例13-1:
13.5 休眠期间的工作原理
如果IOCIE 位置1 的话,电平变化中断序列会将器件从
休眠模式唤醒。
如果在休眠模式下检测到边沿,则在退出休眠模式执行
第一条指令之前,会更新IOCBF 寄存器。
图13-1: 电平变化中断框图
MOVLW 0xff
XORWF IOCBF, W
ANDWF IOCBF, F
------------------------------------

使用特权

评论回复
7
xueweianying| | 2012-9-18 11:41 | 只看该作者
芯片手册 :13电平变化中断部分
13.2 独立的引脚配置
每个PORTB 引脚都带有一个上升沿检测器和一个下降沿检测器。要使某个引脚检测上升沿,必须将IOCBP 寄存器中相应的IOCBPx 位置1。要使某个引脚检测下降沿,必须将IOCBN 寄存器中相应的IOCBNx 位置1。通过分别将IOCBP寄存器中相应的IOCBPx位和IOCBN寄存器中相应的IOCBNx 位置1,可将某个引脚配置为同时检测上升沿和下降沿。
    你的程序里同时允许上升沿与下降沿的中断,当然都进入中断了。
    你的程序:
                      void SYS_INT(viod)
                {
                   TRISB               =              0B00000111;
                   ANSELB            =              0B00000000;
                   IOCBP        =        0X00;        //RB口上升沿中断允许
                         IOCBN        =        0X07;        //RB口下降沿中断允许
                       
                          IOCIE        =        1;
                   GIE                =        1;
                  }

使用特权

评论回复
8
qhtflsw| | 2014-10-16 17:17 | 只看该作者
xueweianying 发表于 2012-9-18 11:41
芯片手册 :13电平变化中断部分
13.2 独立的引脚配置
每个PORTB 引脚都带有一个上升沿检测器和一个下降沿检 ...

bit 7-0     IOCBP<7:0>:正边沿电平变化中断允许位

             1 = 允许引脚上的正边沿电平变化中断。检测到边沿时,将相关状态位和中断标志位置 1。
             0 = 禁止相关引脚的电平变化中断。


IOCBP =0x00,不是禁止上升沿中断了么

使用特权

评论回复
9
车彦锋| | 2014-10-16 17:56 | 只看该作者
看程序没什么问题啊,会不会是内部上拉不好用,或消抖程序有问题导致的,有干扰又进中断了,外部上拉试试,或示波器测一下脉冲沿正不正确,新手勿喷,谢谢

使用特权

评论回复
10
pkk1989| | 2015-1-29 12:53 | 只看该作者
我也遇到了这个问题。 后来中断里又判断了一下IO的电平。 治标不治本。不知道楼主怎么解决?

使用特权

评论回复
11
opal11| | 2015-2-6 16:25 | 只看该作者
中断初始化及进入中断后加上:
IOCBF = 0x00;

使用特权

评论回复
12
UPS2015| | 2015-2-6 17:28 | 只看该作者
yewuyi 发表于 2012-9-17 10:45
1、每个PORTB 引脚都带有一个上升沿检测器和一个下降
沿检测器。要使某个引脚检测上升沿,必须将IOCBP 寄
...

大师,能回一下我的贴吗?

使用特权

评论回复
13
dadada757102928| | 2015-9-16 16:30 | 只看该作者
进入中断清一下IOCIF位试试

使用特权

评论回复
14
dadada757102928| | 2015-9-16 16:33 | 只看该作者
xueweianying 发表于 2012-9-18 11:41
芯片手册 :13电平变化中断部分
13.2 独立的引脚配置
每个PORTB 引脚都带有一个上升沿检测器和一个下降沿检 ...

1)读一次PORTB口,消除产生中断标志的硬件条件;
2)清除IOCIF位

使用特权

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

本版积分规则

个人签名:白羊座的人就是喜欢战斗,也勇于战斗!

31

主题

291

帖子

0

粉丝