AVR USART enviando basura

0

Estoy tratando de hacer un ATMega328P para enviar datos en serie a mi computadora e imprimir en Putty usando una placa de arduino para hacer las conversiones de USB a serie. Los datos que se imprimen, sin embargo, son datos de basura. He intentado cambiar el número de bits de parada, he comprobado las comunicaciones en serie en la masilla, he comprobado las tasas de error en baudios y también he añadido un retraso para que la computadora pueda leer los datos en serie con mayor facilidad. Aquí está el código:

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

#define USART_BAUDRATE 9600
#define F_CPU 7372800
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

void printString(const char myString[]){
    uint8_t i = 8;
    while(myString[i]){
       while ((UCSR0A &(1<<UDRE0)) == 0){}//do nothing until transmission flag is set
          UDR0 = myString[i];
          i++;
    }    
}

int main(void)
{
    //--------------init usart----------------//
    UCSR0B = (1<<RXEN0)|(1<<TXEN0); //Enables the USART transmitter and receiver
    _delay_ms(10);
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(USBS0<<1); //tells it to send 8bit characters (setting both USCZ01 and UCSZ00 to one)
    //now it has 2 stop bits.

    UBRR0H = (BAUD_PRESCALE >> 8); //loads the upper 8 bits into the high byte of the UBRR register
    UBRR0L = BAUD_PRESCALE; //loads the lower 8 bits
    //----------------------------------------//
    _delay_ms(10);


    for(;;){
    printString("Hello World!\r\n");
    }
return (0);
}

Y los datos que se muestran en masilla son los siguientes. Primero hay un montón de esto:   àà àà à à àààààààà à. Luego hay un montón de esto:    f, Mün $ M´M, M´M $ M´M, M´M, M´M, M´M y otros personajes similares. No sé por qué estos se están imprimiendo. Gracias.

edite: aquí está la hoja de datos

    
pregunta Cate

3 respuestas

2

Esta línea parece sospechosa:

  

UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(USBS0<<1);

Probablemente quieras que sea:

UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);

    
respondido por el Turbo J
0

Le pregunté a la gente de AVR Freaks y dijeron que F_CPU no cambia la velocidad del reloj; Sólo se utiliza para establecer la escala de previsión de baudios. Como el arduino funciona a 16MHz, solo tuve que cambiar de F_CPU a 16000000 y luego cambiar de uint8_t i=8; a uint8_t i=0; .

    
respondido por el Cate
0
((UCSR0A &(1 << UDRE0)) == 0)

marque esta línea en la hoja de datos de atmega328 > UART > Código de inicialización UART disponible allí. Creo que ese podría ser tu problema, creo que debería ser

((!(UCSR0A &(1 << UDRE0)))

no agregue == 0.

    
respondido por el kaiser

Lea otras preguntas en las etiquetas