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?