打印

有是中断问题,串口中断和定时器中断同时运行出问题

[复制链接]
7317|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jony.z|  楼主 | 2012-6-3 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有关中断的问题,PIC16F877A中有多个中断源,但只有一个中断入口,在一个中断子程序中可以通过中断标志位判断是哪个中断从而执行。下面那个程序是一个测试程序,:中断子程序中有两个中断,一个是串口中断,另一个是time0中断,time0中断是让蜂鸣器间隔响,但是发现上电后蜂鸣器没有响,只有运行串口调试助手程序使串口收发数据后才能使蜂鸣器响,按理说一上电time0定时器应该已经执行,和串口的执行与否没关系的。另外还发现蜂鸣器响的时间不是我所设定的中断时间,并且无法改变时间,好像蜂鸣器响的时间间隔是由串口的波特率决定的。这是怎么回事?PIC的中断难懂,真让我这从51刚转过来的新手纳闷。
#include<pic.h>
__CONFIG(0X1832);
#define uchar unsigned char
#define fmq RC2
unsigned int t;

void delay(uchar z)
{
uchar i;
while(z--)
  for(i=0;i<250;i++);
}

void port_init()
{
TRISC=0xc0;  //RC7/RXRC6/TX输入,其余口输出,RX,TX口必须设置为输入状态,之后硬件会自动匹配为相应方向
}
void usart_init()
{
SPBRG=0X33;  //4M晶振,1200波特率
TXSTA=0X20;
RCSTA=0X90;
RCIE=0X01;  //接收中断使能
GIE=0X01;  //总中断使能
PEIE=0X01;  //外部中断使能
}
void interrupt receive_data(void)
{
if(T0IF==1)
{
  TMR0=100;
  T0IF=0;
  t++;
  if(t==1000)
  {
   t=0;
   fmq=1;
  }
  fmq=0;
}
if(RCIE&&RCIF)  //判断是否中断和中断标志位是否为1
{
  PORTC=RCREG;  //C口的LED亮
  TXREG=RCREG;
   while(!TRMT);
}
}
void main()
{
port_init();
usart_init();
TMR0=100;
T0IE=1;
TXREG=0X01;
  while(!TRMT);
while(1);
}
沙发
jony.z|  楼主 | 2012-6-4 22:39 | 只看该作者
怎么没人指点一下啊?跪……

使用特权

评论回复
板凳
yewuyi| | 2012-6-5 08:58 | 只看该作者
1、既然你知道“if(RCIE&&RCIF) ”这么写,为何又写成了“if(T0IF==1)” ?
2、一共也没多少代码,自己耐心点调试就是了,这也要别人帮忙?
3、PIC16的中断很简单,按照顺序查标志位,先查到谁就先执行谁。
4、看到那个delay就头大,请先去学习如何写一个无堵塞的程序

使用特权

评论回复
地板
kvdong| | 2012-6-5 10:03 | 只看该作者
建议多个中断查询时做成分支查询
if(XX0IE&&XX0IF)
{

}
else if(XX1IE&&XX1IF)
{

}
...
else if(XXnIE&&XXnIF)
{

}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
shuidi_wangdan + 2 很给力!
5
兰天白云| | 2012-6-5 14:36 | 只看该作者
if(T0IF==1)
{
  TMR0=100;
  T0IF=0;
  t++;
  if(t==1000)
  {
   t=0;
   fmq=1;    //这里是开蜂鸣器吧
  }
  fmq=0;    //这里是关蜂鸣器吧,关的也太快了,能响吗?
}

使用特权

评论回复
6
jony.z|  楼主 | 2012-6-10 22:27 | 只看该作者
谢谢你的建议! 4# kvdong

使用特权

评论回复
7
jony.z|  楼主 | 2012-6-10 22:39 | 只看该作者
我以前没写过PIC的程序,只学过51,现在在公司用的是PIC单片机也在写一些程序。这次就是写一个包含通讯的程序,我只需要完成通信子程序和相关数据处理的程序,其他程序由另一个工程师完成。程序中包含了PWM,time0和通讯部分,因为PIC16F690的PWM用到time2的分频比,但是那位工程师设置中开了允许中断,但是我写中断子程序的时候发现中断运行不正常,最后测试才发现被一个time2的中断标志位带入断,但是却没有在中断中做判断,所以就死在中断里。这个问题的原因发现之前我以前从来没遇到过这样的问题,就在学习板上做877A的子程序实验,也来论坛上问问。呵呵,不过最终解决了,现在我们的设备已经能和电脑正常通信了。
另外请问下yewuyi老师,无堵塞的程序是什么意思? 3# yewuyi

使用特权

评论回复
8
a20084666| | 2014-12-23 11:19 | 只看该作者
你的问题搞定没?

使用特权

评论回复
9
liu0000feng| | 2015-4-23 17:03 | 只看该作者
按标准的格式来写!

使用特权

评论回复
10
baiyutang| | 2015-9-17 11:43 | 只看该作者
你好。我也在用PIC16F877A搞RS-485通讯。用AUSART中断实现。但是一开TMR0中断通讯数据就出错,愁死我了:Q

使用特权

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

本版积分规则

9

主题

56

帖子

2

粉丝