No hay señal correcta de ATMEGA162 UART

Tengo el siguiente circuito:

esquemático

simular este circuito : esquema creado con CircuitLab

Y este código para ejecutarlo:

#define F_CPU 4915200UL     // Quarz with 4.9152Mhz
#define BAUD 9600

#include <asf.h>
#include <avr/io.h>
#include "helpFile.h"        // set/clear Bit (LED) 
#include <util/delay.h>

void USART_Init( unsigned int ubrr )
{
    /* Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    /* Enable receiver ?nd transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format 8data, 1stop bit */
    UCSR0C = (1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
}

void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) )
    ;
    /* Put data into bu?fer, sends the data */
    UDR0 = data;
}

void main( void )
{
    USART_Init(31);
    DDRB = ( 1 << PB0 );

    while(1)
    {
        USART_Transmit('C');
        PORTB ^= ( 1 << PB0 );  
        _delay_ms(1000);   
    }
}

Si conecto esto a una herramienta UART/USB e inicio Terminal Monitor con 9600Boud rate y 8n1, obtengo mensajes vacíos. ¿Puede decirme qué hice mal / qué cambiar para que funcione?

El cristal en el esquema está conectado incorrectamente. ¿Lo tienes en el tablero real?
@venny, lo siento, solo el esquema estaba mal en el tablero, es correcto (lo corrigió arriba).
Parece que nunca usas los resultados de util/setbaud.h...
@IgnacioVazquez-Abrams eso era de pruebas anteriores
¿Cambió al oscilador de cristal externo?
Los caspacitores en los cables de cristal (C1 y C2) deben tener aproximadamente 22 pF, no 22 uF.

Respuestas (1)

Aunque dijiste que usas 1 detener un poco, USBS0 habilita dos. Pero eso no debería interferir con nada.

El mayor problema está en el generador de velocidad en baudios. La tasa de baudios en modo normal se calcula como F o s C dieciséis ( UBRR+1 ) . Entonces UBRR es F o s C dieciséis B R 1 y para 4.915200 METRO H z es 31 , no 51 .

Editar: se encontró otro problema, cambio de bit incorrecto en el registro de configuración C de UART. Debería ser 3<<UCSZ00 , no 3<<UCSZ01 .

Lo cambié de 51 a 31 y que la terminal a 8n2 pero el resultado es el mismo (recibo algo pero no el caracter)
@kimliv Respuesta actualizada, ¿funciona ahora?
De acuerdo, dos piezas han estado mal, lo corregiré también en el código anterior para que otros puedan usarlo.