打印

关于PIC16f887中断问题的请教

[复制链接]
3819|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinc_mark|  楼主 | 2013-3-7 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用16887写程序,需要用到定时器中断和电平变化中断,在写定时中断调试后,一切正常,但加上B0口的电平变化中断后,发现定时器好像不行了,而且,由于我是使用PORTB0位的电平变化中断,我发现只要置位ANSELH.12(POERTB0的模拟量输入),就会影响到原来可以正常运行的定时器,我的中断处理函数如下:
void interrupt interruptdeal(void)
{
if(T0IF)  //定时器溢出中断
{
   timegrow = timegrow + 1;
   TMR0 = 0x97;
   T0IF = 0;    //清除T0IF
   CLRWDT();
}
else if(RBIF)   //电平变化中断
{
  PortB0Intrupt = PortB0Intrupt+ 1;
  PORTB = PORTB;
  RD0 = ~RD0;
  SendToPrin(&PortB0Intrupt,2);
  RBIF = 0;
}
}我的疑问是:
1:难道16887只能处理一种中断,不能存在定时中断和电平变化中断吗?
2:对于电平变化中断,16887是不是PORTB中的任何一位都可以采集到电平变化中断,这个中断需要电压稳定多长?或者换句话说,能采集到多快的脉冲变化,请有经验的指导一下:
下面是我的电平变化中断初始化:
void PortB0JumpInitFunc(void)
{
TRISB = 0X01;  //B0~B3为输入方式;
PORTB = 0X01;
ANSEL = 0;
// ANSELH = 0;
  ANSELH = 0xEF;(ANSELH.4影响到了定时器中断)

GIE = 1;
PEIE = 1;   //允许外设中断
RBIE = 1;
IOCB = 0x01;   //B0电平变化中断;
WPUB = 0X0F;
RBIF = 0;
INTE = 1;
}
沙发
兰天白云| | 2013-3-7 16:42 | 只看该作者
第1个问题,多个中断可以同时存在,看你的中断服务程序的处理,处理有先后
第2个问题,我的印象中RB口不是每个引脚都可以电平变化中断
TRISB = 0X01;  //B0~B3为输入方式 这个写法能实现你的要求???
建议
if(T0IF) 改为if(T0IE&&T0IF),其他照此推理

使用特权

评论回复
板凳
sinc_mark|  楼主 | 2013-3-7 20:19 | 只看该作者
谢谢楼上的,我现在知道是怎么回事了,
1:是可以多中断存在,中断处理的时候看程序的顺序;
2:PORTB的电平变化中断和相应的ANSELH位存在关联,如果ANSELH对于的位清0,则自动关闭该位的电平变化中断;
PS:还是需要谢谢楼上!

使用特权

评论回复
地板
backupyan| | 2013-3-8 21:11 | 只看该作者
楼主问题解决了吗?

引自数据手册:
---------------------------------------------------------------------------------------------
ANSELH
bit 7-6 未实现:读为0
bit 5-0 ANS<13:8>:模拟选择位
分别选择引脚AN<13:8> 的模拟或数字功能。
1 =模拟输入。引脚被分配为模拟输入(1)。
0 =数字 I/O。引脚被分配给端口或特殊功能。
注 1: 将引脚设置为模拟输入将自动禁止数字输入电路、弱上拉电路和电平变化中断 (如果可有的话) 。
相应的TRIS 位必须置 1以将引脚设置为输入模式,从而允许从外部控制引脚电压。
---------------------------------------------------------------------------------------------
看手册上说ANSELH'4位为1时才禁止电平变化中断的,楼主不是将其初始化为0了吗?
我不理解楼主的回复。

使用特权

评论回复
5
sinc_mark|  楼主 | 2013-3-11 09:55 | 只看该作者
backupyan 发表于 2013-3-8 21:11
楼主问题解决了吗?

引自数据手册:

就像你说的,我开始的时候,没注意到这个问题了!

使用特权

评论回复
6
yewuyi| | 2013-3-11 16:49 | 只看该作者
if(T0IF) 改为if(T0IE&&T0IF)

----
如上,单中断源的时候,中断标志和中断容许位应该一起判断,类推,RBIF也必须按照这个方式写才行。

使用特权

评论回复
7
sinc_mark|  楼主 | 2013-3-11 19:45 | 只看该作者
yewuyi 发表于 2013-3-11 16:49
if(T0IF) 改为if(T0IE&&T0IF)

----

已经按提示修改完,谢谢!

使用特权

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

本版积分规则

个人签名:教育,就是把娃围起来,一期一期的收钱。 医疗,就是把命围起来,一天一天的收钱。

47

主题

301

帖子

0

粉丝