编程目标:使用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; //仅供实验
}
此帖出自
小平头技术问答
可见,不是其他程序导致本问题。
哪位大哥有TX0中断源程序,发我一份?求助!
我找到问题了:
把UCSR0B = 0xD8; 改成UCSR0B = 0xF8;
就可以了。
谢谢关心。
一周热门 更多>