打印

pic16F887定时器0中断和串口中断能同时使用吗?

[复制链接]
4595|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aresmcu|  楼主 | 2014-7-13 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单独使用定时器0  或者串口中断都没事,放在一起编译就出错了
Error   [1375] F:\zzjh-code\main.c; 73. multiple interrupt functions (_ISR_int and _tmr0_int) defined for device with only one interrupt vector
请问哪里还要设置?有高手2个中断一起用的吗?可否贴一个自己成功的代码给我学习下呢?谢谢。
/*==================================================
void tmr0int(void) //定时器0初始化.
{
T0CS=0;    //TMR0工作在定时方式.
PSA=0;     //将分频器分配给TMR0(为1则分配给看门狗).
PS2=1;PS1=1;PS0=1; //设置分频比1:256.11.0592M晶振,1ms中断一次.
T0IF=0;    //清除TMR0的中断标志.
T0IE=1;    //TMR0中断允许.
TMR0=0xF5; //初始约为1ms溢出
}

void interrupt tmr0_int(void) //11.0592M晶振,1ms中断一次.
{
if(T0IF==1)  //检查是否是TMR0中断.T0IF==1
   {            
      T0IF=0;  //清除TMR0中断溢出标
      TMR0=0xF5;
//      key_time++;
  //    time_500ms++;
   //   scan_key=1;
   }

}

==========================================================*/
void main()
{        uchar i;
init();
tmr0int();
while(1)
{        if (FLAG)
{        for (i=0;i<6;i++)         //先发送“OK !!!”
{        SEND_ONE(DD1[i]);
}
SEND_ONE(0x0D);         //发送一个回车
for (i=0;i<N;i++)
{        SEND_ONE(DD[i]);
}
FLAG=N=0;         //重新清0,为下次接收做准备
}
};
}
void init()
{
TRISC=0xff;         //这里要把高二位设置这输入,但在以下的串口使能后,系统自动将RC6变成通信输出
TXSTA=0x24;
RCSTA=0x90;
SPBRG=25;        //9600波特率
GIE=1;
PEIE=1;
RCIE=1;         //打开中断
}
void interrupt ISR(void)
{
if(RCIE && RCIF)         //不必清RCIF,因为接收数据后RCIF自动清0
{        DD[N]=RCREG;
if (DD[N]==0x0D)
FLAG=1;        //如果收到回车,标志位置1
N++;
if (N>=20)
N=0;        //如果接收数据数超出,从0存放
}
}






沙发
aresmcu|  楼主 | 2014-7-13 23:16 | 只看该作者
串口中断是网上找的,别人测试成功的,编译也同过,定时器部分是我写的其他程序上测试通过的,但不知道为什么2个中断放在一起就编译错误了,烦请高手指点一下,非常感谢。

使用特权

评论回复
板凳
yklstudent| | 2014-7-14 10:07 | 只看该作者
只要你想 中断全开也没问题的

使用特权

评论回复
地板
aresmcu|  楼主 | 2014-7-14 10:08 | 只看该作者
发现问题了,887只有一个中断入口,都放在一个中断处理就通过了。
====================发给遇到同样问题的人============
void interrupt tmr0_int(void) //11.0592M晶振,1ms中断一次.
{
if(T0IF==1)  //检查是否是TMR0中断.T0IF==1
   {            
      T0IF=0;  //清除TMR0中断溢出标
      TMR0=0xF5;
//      key_time++;
  //    time_500ms++;
   //   scan_key=1;
   }
if(RCIE && RCIF)         //不必清RCIF,因为接收数据后RCIF自动清0
{        DD[N]=RCREG;
if (DD[N]==0x0D)
FLAG=1;        //如果收到回车,标志位置1
N++;
if (N>=20)
N=0;        //如果接收数据数超出,从0存放
}
}

使用特权

评论回复
5
yklstudent| | 2014-7-14 10:08 | 只看该作者
不过你要知道PIC16系列中断入口就有一个
你写两个中断函数,你想让编译器崩溃啊

使用特权

评论回复
6
aresmcu|  楼主 | 2014-7-14 10:10 | 只看该作者
不知道就一个入口,所以进行了错误操作,现在知道了,谢谢。

使用特权

评论回复
7
磨刀师傅| | 2014-7-14 11:10 | 只看该作者
资料都没认真看

使用特权

评论回复
8
yewuyi| | 2014-7-14 11:31 | 只看该作者
中断可以同时发生,但中断不能同时响应并处理,按优先级处理,在PIC16上则按照你中断服务代码中的程序写法运行

使用特权

评论回复
9
aresmcu|  楼主 | 2014-7-14 14:27 | 只看该作者
yewuyi 发表于 2014-7-14 11:31
中断可以同时发生,但中断不能同时响应并处理,按优先级处理,在PIC16上则按照你中断服务代码中的程序写法 ...

我现在写好了,但出现个问题,PC给单片机发送0x83  0X00 0X69  单片机应该是 接收到什么就回什么,结果出现0XFF 0x83 0XFF 0X00 0XFF 0X69 前面都多了个0XFF,不知道哪里来的,给PC发的数组也只有3个元素,为什么会多出3个呢?

使用特权

评论回复
10
aresmcu|  楼主 | 2014-7-14 14:31 | 只看该作者
void interrupt tmr0_int(void) //11.0592M晶振,1ms中断一次.
{
if(RCIE&&RCIF)         //不必清RCIF,因为接收数据后RCIF自动清0  
{
        input_temp[N]=getch();
  if(input_temp[N]==0x83)  
   {RA0=!RA0;}       
   N++;
  if(N>=2)
   {N=0;FLAG=1;ck_jishi=1;}       
}
            if((ckjishi==20)&&(FLAG==1))//20MS
              {
               FLAG=0;
               ckjishi=0;
               ur_puts(input_temp);//发给PC
              }

==================================RA0接了LED 发一次取反一次  LED正常 但回的数据就不正常

使用特权

评论回复
11
yewuyi| | 2014-7-15 11:52 | 只看该作者
向发送缓存送数据之前,先把发送寄存器和缓存寄存器都清除一下看看。

另外,官网上应当由UART的例程,如果看手册弄不清楚,自己对照例程看看找找问题就是了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
aresmcu + 2
12
feixiang1162003| | 2014-7-27 16:41 | 只看该作者
手册里面找答案

使用特权

评论回复
13
xlsf1048| | 2014-8-6 11:42 | 只看该作者
同时产生2个中断,进入中断入口,再根据中断标志和允许位进行处理

使用特权

评论回复
14
acetuo| | 2020-10-8 12:51 | 只看该作者
楼主,搞好了没

使用特权

评论回复
15
acetuo| | 2020-10-8 23:59 | 只看该作者
还发不了短信!等楼主过来看

使用特权

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

本版积分规则

215

主题

254

帖子

2

粉丝