马老师请教您一个有关串口发送与接收的问题(不是知道是不是AVR的BUG)
当我在主程序里循环发送数据时,接受中断怎么不能及时响应,而是在所有数据都完全发送完以后才可以响应中断,这是AVR自身决定的还是,在程序里需要一些特殊的设置吗?
谢谢您! AVR的USART硬件本身支持全双工工作,也就是说,硬件本身可以实现同时的发送和接收。
而在实际使用中,同时发送和接收就不是那么简单了,因为你的软件需要及时对发送和接收的数据进行处理的。如果软件编写的不合理,不能及时的处理发送和接收的数据,不能跟上硬件的速度,那么就会发生问题,如丢失接收的数据等。
因此在一般性的应用中,建议你使用半双工方式,这样软件编写的难度相对小些,容易实现。 马老师我在主程序一直写发送一个数据,一共发送一千个,但是这期间我从上位机向AVR128发送数据,但是在这一千数据发送中,是不响应接受中断的,这是为什么??
void init_devices(void)
{
CLI();
XDIV= 0x00;
XMCRA = 0x00;
port_init();
uart0_init();
MCUCR =0x00;
EICRA =0x00;
EIMSK =0x50;//EIMSK =0x50;
EICRB =0x11;//EICRB =0x11;
TIMSK =0x05;// TIMSK =0x05;
ETIMSK =0x04;
SEI();
}
//////////////////////////////////////////////////////////////////
//
//LCD切换显示子程序
//
//////////////////////////////////////////////////////////////////
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR= 0x00; //set async mode
TCNT0 = 0x16; //set count
OCR0= 0xEA;
//TCCR0 = 0x07;//start timer
}
/*/////////////////////////////////////////////////////////////
//串口初始化程序
//
//发送子程序
//
////////////////////////////////////////////////////////////*/
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x19; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
//
void USART_Transmit(unsigned int data)
{ //SEI();
while(!(UCSR0A&0x20)); //等待发送缓冲器空,UDRE0数据寄存器空标志
UDR0=data; //发送数据,将被发送数据付给UDR0数据寄存器
}
//
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
unsigned char i;
v1++;
i=UDR0;
USART_Transmit(v1);
}
///////////////////////////////////////////////////////////////////////////////
//
//TIMER3 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value:1.000Sec (0.0%)
//
///////////////////////////////////////////////////////////////////////////////
//
//
void main(void)
{
int sum;
int i;
qwer=5;
v1=0;
sum=0;
init_devices();
while(1)
{
if(sum<1000)
{
USART_Transmit('0');
sum++;}
}
} void USART_Transmit(unsigned int data)函数中的while循环后不应该加“;”号。最好用串口接收和发送中断处理来做。看不到你timer0在哪里被使用。而且也没有定时器中断的处理。好像定时器初始化的设置也有问题 。
页:
[1]