No hay una señal correcta de ATMEGA162 UART

1

Tengo el siguiente circuito:

simular este circuito : esquema creado usando 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 el monitor de terminal con una velocidad de 9600 y 8n1 obtengo mensajes vacíos. ¿Puedes decirme qué hice mal o qué debo cambiar para que funcione?

    
pregunta kimliv

1 respuesta

3

Aunque usted declaró que usa \ $ 1 \ $ bit de parada, \ $ \ texttt {USBS0} \ $ habilita dos. Pero eso no debería interferir con nada.

El problema más grande está en el generador de velocidad de transmisión. La velocidad de transmisión en modo normal se calcula como \ $ \ dfrac {f_ {osc}} {16 \ cdot (\ texttt {UBRR + 1})} \ $. Entonces, UBRR es \ $ \ dfrac {f_ {osc}} {16 \ cdot BR} -1 \ $ y para \ $ 4.915200 \, \ mathrm {MHz} \ $ es \ $ 31 \ $, no \ $ 51 \ $.

Editar: Otro problema encontrado, cambio de bit incorrecto en el registro de configuración UART C. Debe ser \ $ \ texttt {3 < < UCSZ00} \ $, no \ $ \ texttt {3 < < UCSZ01} \ $.

    
respondido por el venny

Lea otras preguntas en las etiquetas