Atmega16 USART初始化

时间:2016-08-23 14:02:16

标签: usart atmega16

我无法为我的生活找到为什么这段代码无法向我的计算机终端窗口发送一个字节。当我省略那条线时,它接收并正常工作。接收和发送也分开工作。请注意,这是通过rs485,所以我必须禁用TXEN如果我想通过线路驱动程序ic接收任何东西。

#define F_CPU 7800000UL  // 7.8 MHz
#include <avr/io.h>
//#include <util/delay.h>
#include <avr/interrupt.h>
#include <math.h>
#define USART_BAUDRATE 57600  
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

volatile unsigned int value = 0;
volatile int recievearray[4] = {0,0,0,0};
volatile int x=0;  

void USART_Init(void)
{
   DDRD = 0x7E; //you have to assign TXEN as output for some reason
   //PORTD = 0xFF;
   UCSRB = 0;
   //Put the upper part of the baud number here (bits 8 to 11)
   UBRRH = (unsigned char) (BAUD_PRESCALE >> 8);

   //Put the remaining part of the baud number here
   UBRRL = (unsigned char) BAUD_PRESCALE;
   //PORTD = 2;
   // ASYNCRONOUS
   UCSRC = (0 << UMSEL);

   //Enable the receiver and transmitter
   UCSRB = (1 << RXEN) | (1 << TXEN) | (0 << UCSZ2) | (1<<RXCIE);

   //Set 1 stop bits and data bit length is 8-bit
   UCSRC = (1 << URSEL) | (0 << USBS) | (3 << UCSZ0);
   //no parity
   UCSRC |= (0 << UPM1);
   UCSRC |= (0 << UPM0);
 }


void USART_SendByte(uint8_t u8Data)
{  
  UCSRB = (1 << TXEN) | (1<<TXCIE); 

  // Wait until last byte has been transmitted
  while((UCSRA &(1<<UDRE))==0);
  UDR = u8Data;
  UCSRB = (0 << TXEN) | (0<<TXCIE);
}

void Led_init(void){
     DDRC = 0xFF;       
}

ISR(USART_RXC_vect)
{   
    //PORTC = 0xFF;
    while((UCSRA &(1<<RXC)) == 0);
    value = UDR;
if (x < 4)
{
    recievearray[x++] = value;
}
else
{
    x = 0;
    recievearray[x++] = value;
    PORTC = 0x00;
}
}


int main(void)
{
   USART_Init();
   sei();         
   Led_init();    
   //PORTC = 0xFF;
   for(;;)
   {        
        if (recievearray[0] + recievearray[1] + recievearray[2] +       recievearray[3] > 100)
        {
            PORTC = 0xFF;
            USART_SendByte(value);
        }

        //_delay_ms(1000);              
   }
}

0 个答案:

没有答案