Search code examples
avratmegausart

AVR Atmega32a USART library isn't working


/*
 * RC_Car_AVR.c
 *
 * Created: 4/18/2018 7:55:07 PM
 * Author : 
 */ 

#define F_CPU 16000000
#define BAUD 9600
#define TUBRR (((F_CPU / 16) / BAUD) - 1)

#include <avr/io.h>
#include <util/delay.h>

char Read;

void USART_Init(void){
    
    UBRRL = TUBRR;
    
    UCSRB = (1<<TXEN)|(1<<RXEN);
    UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
}

char USART_Receive(void){
    
    /* Wait for data to be received */
    while (!(UCSRA & (1<<RXC)));
    
    /* Get and return received data from buffer */
    return UDR;
}

int main(void){
    
    USART_Init();
    
    DDRB |= (1<<0);
    
    PORTB |= (1<<0); 
    
    while (1){
        
        Read = USART_Receive();
        
        if(Read == 'F'){
            
            PORTB ^= (1<<0);
            _delay_ms(100);
        }
    }
}

I'm trying to toggle an LED when I receive a certain character through the Bluetooth module (HC05).

I've written the USART library just like the datasheet but it doesn't seem to work (I'm only concerned with the initialization and receiving code since I'm working on a half duplex system so i don't need the transmition part).

I'm using Atmega32a with a 16MHz external crystal Oscillator.

Please tell me if you find anything wrong.

Thanks in advance.


Solution

  • Your Initialization is wrong.

    Try this

    void USART_Init(void){
    
    UBRRL = TUBRR;
    UBRRH = TUBRR >> 8;
    UCSRB = (1<<TXEN)|(1<<RXEN);
    UCSRC = (1<<UCSZ1)|(3<<UCSZ0);
    
    
    }
    

    This is the following initialization code provided in data sheet of atmega32

    void USART_Init( unsigned int baud )
    {
        /* Set baud rate */
        UBRRH = (unsigned char)(baud>>8);
        UBRRL = (unsigned char)baud;
        /* Enable receiver and transmitter */
        UCSRB = (1<<RXEN)|(1<<TXEN);
        /* Set frame format: 8data, 2stop bit */
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    

    I know following datasheet is little overhead in beginning But eventually you will see all your answers are provided there.