打印
[AVR单片机]

AVR串口中断问题

[复制链接]
5843|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ytjzhjun|  楼主 | 2013-5-3 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚刚接触AVR单片机,型号为ATmega16A;
写的程序,串口通讯本来正常,可现在莫名出现了问题,
现象是:一旦向串口发送了数据,串口中断程序就连续进入,即使不再向它发数据了,还像有数据似的进入串口中断程序。
请大虾们看看是什么情况。
相关程序如下:

/*串口初始化函数*/
void uart_init(void)
{
    UCSRA = (1 << U2X);          /*倍速*/
    UCSRB = ((1 << RXEN) | (1 << TXEN) | (1 << RXCIE));         /*允许接收和中断*/
    UCSRC |= ((1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0));    //8位无校验
    UBRR = 12;                                                  /*波特率9600 (@2M clk)*/
   // UBRR = 25;                                                  /*波特率9600 (@4M clk)*/
// UBRR = 6;                                                  /*波特率9600 (@1M clk)*/
}

void UartSendByte(unsigned char i)
{
    while (!(UCSRA & (1<<UDRE)));   
    UDR=i;
}

/*接收结束中断*/
#pragma interrupt_handler uart_rx_isr:12
void uart_rx_isr(void)
{
  UCSRB &= ~(1 << RXCIE);         //关闭串口中断

while((UCSRA & (1<<RXC)) == 0);
Receive = UDR;
  
UCSRB |=  (1 << RXCIE);         //打开串口中断
}

相关帖子

沙发
ytjzhjun|  楼主 | 2013-5-3 15:30 | 只看该作者
问题已经消失,莫名奇妙的消失。

使用特权

评论回复
板凳
huangxz| | 2013-5-3 16:20 | 只看该作者
楼主在中断处理里面不用关闭自身中断吧, 有点怪怪的,读完马上退出,花不了多少时间的

使用特权

评论回复
地板
qin552011373| | 2013-5-5 13:01 | 只看该作者
ytjzhjun 发表于 2013-5-3 15:30
问题已经消失,莫名奇妙的消失。

想明白是什么问题了吗

使用特权

评论回复
5
ytjzhjun|  楼主 | 2013-5-6 13:23 | 只看该作者
qin552011373 发表于 2013-5-5 13:01
想明白是什么问题了吗

这个还没有明白。

使用特权

评论回复
6
qin552011373| | 2013-5-6 13:36 | 只看该作者
ytjzhjun 发表于 2013-5-6 13:23
这个还没有明白。

使用特权

评论回复
7
boswars| | 2014-11-9 17:28 | 只看该作者
这个没有读取UDR的原因,数据手册上这么说的:使用中断方式进行数据接收时,数据接收结束中断服务程序程序必须从UDR读取数据以清RXC标志,否则只要中断处理程序一结束,一个新的中断就会产生。

使用特权

评论回复
8
divinitus| | 2014-11-9 17:33 | 只看该作者
用个变量读取UDR,或者直接用UDR进行比较等操作,读取完UDR,就会清楚RXC标志,不会产生连续的中断!

使用特权

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

本版积分规则

个人签名:凡事都要坚持,因为你是个男人!

235

主题

309

帖子

1

粉丝