[求助] 串口TX0中断的初始化程序错在哪儿?

sopu7758   2012-5-22 22:22 楼主

编程目标:使用AVR128单片机,让TX0以9600的波特率,连续不断地发送数据0X33。

目前存在的问题是:初始化程序中必须加一句UDR0 =0x00,TX0发送中断程序OSUart0TX才被“激活”,才会连续不断地发送0X33。如果去掉这句,一个0X33也发不出。

 

这是为什么呢?

类似现象还有:如果我在中断程序中OSUart0TX加入IF语句,只有条件符合时,UDR0才被赋值,那么,由于不是连续发送数据,结果一个数据也发不出去。给人的感觉是,必须靠前一个发送数据来“激活”,如果有间断,就“死掉”了,就发不了数据了。

 

这是怎么回事呢?

 

紧急求助!!!

 

 

我编的程序如下:

一、初始化程序是:

{
/***********************************初始化串口*********************************/
 //启用针脚第二功能----CCL设计更改单
 DDRE &= ~BIT(0);     //RX0
 DDRE |= BIT(1);     //TX0
 PORTE |= BIT(0);
 PORTE |= BIT(1);
 
    //串口配置----CCL注
    UCSR0B = 0x00;      //初始化之前要关闭中断----  UCSR0A = 0x00;
  UCSR0C = 0x06;      //八位字符,无校验   异步 一位停止位
                             
  UBRR0L = 104;      //波特率:16000000Hz/16分频/104=9615bit/s---- 

 UBRR0H = 0x00;      //set baud rate hi
  
  UCSR0B = 0xD8;      //使能发送、发送中断、接收、接收中断---- 


 UDR0 =0x00;//随便赋值,以激活发送中断----CCL注

}

 

二、TX0发送程序是:

#pragma interrupt_handler OSUart0TX:21
void OSUart0TX(void)

    UDR0 =0x33; //仅供实验 
}

回复评论 (3)

程序设置有些问题,我记得以前好像碰到这样的问题,是寄存器设置有问题,
点赞  2012-5-23 15:07
我又试了试,发现删除程序其他部分,只保留定时器0、TX0的中断及初始化,故障依旧。
可见,不是其他程序导致本问题。

哪位大哥有TX0中断源程序,发我一份?求助!
点赞  2012-5-24 14:03

我找到问题了:

把UCSR0B = 0xD8; 改成UCSR0B = 0xF8;

就可以了。

 

谢谢关心。

点赞  2012-5-28 14:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复