AVR USART No está recibiendo

1

He conectado mi AVR USART al flujo de archivos para facilitar el envío de cadenas formateadas en ATmega8

Desde el AVR, puedo enviar (TX) bien. Sin embargo, no estoy recibiendo nada. No puedo ponerle la mano, pero parece que estoy pasando por alto algo muy básico.

uart.c

#define FOSC 8000000
#define BAUD_RATE 38400
#define UBRR_VALUE (uint16_t)(FOSC/16/BAUD_RATE-1)

#include "uart.h"

FILE uart0_str = FDEV_SETUP_STREAM(UARTSendByte, UARTReceiveByte, _FDEV_SETUP_RW);


void UART_INIT(void)
{
    UBRRH = (uint8_t)(UBRR_VALUE>>8); //set UBRR register
    UBRRL = (uint8_t)UBRR_VALUE;
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<USBS);//set frame format: asynchronous,8data,2 stop,no parity
    UCSRB = (1<<TXEN) | (1<<RXEN) ;
    _delay_ms(10);

    stdin=&uart0_str;
    stdout=&uart0_str;
}

void UART_WRITE_STRING(char* str)
{
    printf("%s",str);

}

int UARTSendByte(char u8data, FILE *stream)
{
    if(u8data=='\n')
    {
        UARTSendByte('\r',stream);
    }
    while(!(UCSRA&(1<<UDRE))){};
    UDR = u8data;
    return 0;
}

int UARTReceiveByte(FILE *stream)
{
    printf("hello1\r");
    UART_WRITE_STRING("hello1\r");
    uint8_t data;
    // Wait for byte to be received
    while(!(UCSRA&(1<<RXC))){};
    data=UDR;
    //echo input data
    UARTSendByte(data,stream);
    // Return received data
    return data;
}

main.c

#include "uart.h"
#include "twi.h"
#include "ds1307.h"

void bootCode(void);


int main (void)
{
    DDRC = 0x01; //set PC0 as output
    PORTC = 0x01; //turn on PC0
    DDRD = 0x02; //PD0 = RXD = INPUT,PD1 = TXD = OUTPUT

    UART_INIT(); //initialize UART
    TWI_INIT(); //initialize TWI

    UART_WRITE_STRING("ANKIT.*****@GMAIL.COM\r");
    UART_WRITE_STRING("JUNE 16, 2014\r");
    UART_WRITE_STRING("####################################\r\r\r\r");

    while(1)
    {

    };
}

Cuando ejecuto esto, obtengo las cadenas impresas, pero no hay respuesta alguna al texto que ingresé.

cuando envío el texto, lo ideal es que se repita en el terminal. También debería obtener las cadenas "hello1" codificadas en la función UARTReceiveByte

ACTUALIZAR

Mientras miraba mi código tuve otro pensamiento.

Ya que estoy vinculando mi entrada y salida de USART a las secuencias de archivos estándar = > si, para poder transmitir desde AVR a TX, necesito usar "printf". Por la misma lógica, los datos ingresados desde mi terminal de PC no serán válidos a menos que haya una llamada "scanf" en mi código.

Entonces, como prueba, agregué una línea en mi main.c antes del bucle infinito

unit8_t d;
scanf("%c",&d);

Ahora, cuando ingrese algo en el terminal, obtengo "hello1" 2 veces impresas en el terminal (como se codifica en la función UARTReceiveByte ).

Como pregunta complementaria, mientras uso las secuencias FILE, ¿también puedo usar interrupciones USART?

    
pregunta Ankit

1 respuesta

1

Como se sugiere en los comentarios, no hubo ninguna llamada a la función USARReceiveByte por la falta de cualquier declaración scanf. Esto solucionó el problema.

    
respondido por el Ankit

Lea otras preguntas en las etiquetas