Atmega8 USART transmitiendo datos incorrectos

Estoy tratando de hacer que USART funcione en mi microcontrolador atmega8-16PU. Estudié la documentación y tomé los ejemplos de código de allí. Logré transmitir los datos del microcontrolador al chip PL-2303HX que está conectado a mi computadora a través de USBingrese la descripción de la imagen aquí

El problema es que recibo datos diferentes a los que envío desde mcu. Aquí está el código:

#define F_CPU 8000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)

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

void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) );
    /* Put data into buffer, sends the data */
    UDR = data;
}

int main()
{
    USART_Init(MYUBRR);
    while(1)                      /* run continuously */
    {
        USART_Transmit('a');
        _delay_ms(100);
    }
}

Obtengo 0x80 0x00 en el lado del receptor y ese no es el símbolo 'a'. Si es importante se conecta un cuarzo de 12 MHz al chip PL-2303HX. ¿Qué estoy haciendo mal?

Respuestas (2)

Error más común: Olvidó el Fusible Clock Div8 (predeterminado) y su MCU funciona en 1 MHz en lugar de 8 MHz. Intente configurar su COM Baudrate a 1200 Baud en la PC.

Otro detalle:

#define FOSC 8000000UL // Clock Speed
...
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)

Observe que definió FOSCpero luego usó F_CPUen su macro.

Gracias por su respuesta. En cuanto a la directiva de definición, es mi culpa, no he copiado el código correctamente. Vea el comentario de arriba por favor. Acabo de intentar cambiar la tasa de baudios del puerto com a 1200 sin ningún éxito. Ahora obtengo el 0xE1 del código de puerto y todavía no es el carácter 'a'
¡He usado 2 bits de parada con una velocidad de transmisión de 1200 y todo parece funcionar correctamente! Muchas gracias. Pero todavía estoy interesado por qué los datos se transmiten incorrectamente cuando se usa 1 bit de parada.
¿Dónde se encuentra DIV8?

Está calculando su tasa de baudios incorrectamente. definió #define FOSC 8000000UL como la velocidad del reloj de su reloj, pero el cálculo de la velocidad en baudios requiere un símbolo F_CPU. Ese símbolo se define como 1 MHz en la biblioteca #include. Entonces, su tasa de baudios calculada es incorrecta, así como el tiempo de su retraso. así que cambie ese FOSC a F_CPU y defínalo antes de #include o defínalo usando la opción -D para su compilador. Espero que esto ayude

Lo siento, copié el código incorrectamente, FOSC se definió anteriormente, por lo que no se copió.