sundaqing 发表于 2007-6-30 09:49:11

马老师请教您一个有关串口发送与接收的问题(不是知道是不是AVR的BUG)

当我在主程序里循环发送数据时,接受中断怎么不能及时响应,而是在所有数据都完全发送完以后才可以响应中断,





这是AVR自身决定的还是,在程序里需要一些特殊的设置吗?



谢谢您!

machao 发表于 2007-6-30 13:15:09

AVR的USART硬件本身支持全双工工作,也就是说,硬件本身可以实现同时的发送和接收。



而在实际使用中,同时发送和接收就不是那么简单了,因为你的软件需要及时对发送和接收的数据进行处理的。如果软件编写的不合理,不能及时的处理发送和接收的数据,不能跟上硬件的速度,那么就会发生问题,如丢失接收的数据等。



因此在一般性的应用中,建议你使用半双工方式,这样软件编写的难度相对小些,容易实现。

sundaqing 发表于 2007-7-2 08:49:10

马老师我在主程序一直写发送一个数据,一共发送一千个,但是这期间我从上位机向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++;}

          

       

       

   }

}

RoShiKa 发表于 2007-7-12 13:45:35

void USART_Transmit(unsigned int data)函数中的while循环后不应该加“;”号。最好用串口接收和发送中断处理来做。看不到你timer0在哪里被使用。而且也没有定时器中断的处理。好像定时器初始化的设置也有问题 。
页: [1]
查看完整版本: 马老师请教您一个有关串口发送与接收的问题(不是知道是不是AVR的BUG)