UART Baudrate en ATmega328p

1

Escribí un programa para ejecutar el UART en una placa personalizada, usando el atmega328p solo con el oscilador interno, aquí está mi código:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define BAUD 9600 
#define MYUBRR    F_CPU/16/BAUD-1

void init_uart(unsigned short uValue  ){
    // setting the baud rate 
    UBRR0H =(unsigned char)  ( uValue>> 8);  // 0x00 
    UBRR0L =(unsigned char) uValue;  // 0x0C
    // enabling TX & RX 
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    UCSR0A = (1<<UDRE0);
    UCSR0C =  (1 << UCSZ01) | (1 << UCSZ00);    // Set frame: 8data, 1 stop

}
int main (){
    init_uart(MYUBRR);
    DDRD |= (1<< PD7);
    for(;;){
        PORTD ^= (1<< PD7);
        UDR0 = 'k';
        //_delay_ms(500);
    }
    return 0;
}

He establecido los valores de registro en base al ejemplo en hoja de datos página 241. el problema que tengo es que no recibo la palabra correctamente, esto es lo que recibo:

¿Alguna idea de lo que me estoy perdiendo aquí?

gracias de antemano!

    
pregunta Engine

1 respuesta

1

Lo resolví. Tuve que esperar en el transmisor y recibir banderas aquí el código de trabajo:

#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
#define BAUD 9600 
#define MYUBRR    F_CPU/8/BAUD-1

void init_uart(unsigned short uValue  ){
    // setting the baud rate  based on the datasheet 
    UBRR0H =0x00;//(unsigned char)  ( uValue>> 8);  // 0x00 
    UBRR0L =0x0C;//(unsigned char) uValue;  // 0x0C  
    // enabling TX & RX 
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    UCSR0A = (1<<UDRE0)|(1<<U2X0);
    UCSR0C =  (1 << UCSZ01) | (1 << UCSZ00);    // Set frame: 8data, 1 stop

}

unsigned char USART_Receive( void )
{
    /* Wait for data to be received */
    while ( !(UCSR0A & (1<<RXC0)) )
    ;
    /* Get and return received data from buffer */
    return UDR0;
}
void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) )
    ;
    /* Put data into buffer, sends the data */
    UDR0 = data;
}

int main (){
    init_uart(MYUBRR);
    DDRD |= (1<< PD7);
    for(;;){
        PORTD ^= (1<< PD7);
        USART_Transmit('x');
        USART_Transmit('l');
        //_delay_ms(1000);
    }
    return 0;
}
    
respondido por el Engine

Lea otras preguntas en las etiquetas