Me gustaría comunicarme entre mi controlador atmega8 y la PC a través de un módulo bluetooth HC-06.
Debería recuperar el mismo carácter que envié, pero obtengo algunos caracteres incorrectos. El módulo bluetooth usa una velocidad de transmisión de 9600 (predeterminado), así que configuro el reloj interno de mi controlador a 8Mhz. (No sé si lo puse correctamente ...)
#include <avr/io.h>
#include <inttypes.h>
#define F_CPU 8000000UL
void USARTInit(uint16_t ubrr_value)
{
//Set Baud rate
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
/*Set Frame Format
>> Asynchronous mode
>> No Parity
>> 1 StopBit
>> char size 8
*/
UCSRC=(1<<URSEL)|(3<<UCSZ0);
//Enable The receiver and transmitter
UCSRB=(1<<RXEN)|(1<<TXEN);
}
void USARTWriteChar(char data)
{
//Wait until the transmitter is ready
while(!(UCSRA & (1<<UDRE)))
{
//Do nothing
}
//Now write the data to USART buffer
UDR=data;
}
char USARTReadChar()
{
//Wait untill a data is available
while(!(UCSRA & (1<<RXC)))
{
//Do nothing
}
//Now USART has got data from host
//and is available is buffer
return UDR;
}
int main()
{
char data;
USARTInit(51); //UBRR = 51
//Loop forever
while(1)
{
//Read data
data=USARTReadChar();
/* Now send the same data but but surround it in
square bracket. For example if user sent 'a' our
system will echo back '[a]'.
*/
USARTWriteChar('[');
USARTWriteChar(data);
USARTWriteChar(']');
}
return 0;
}
Configuré SUT_CKSEL en INTRCOSC_8MHZ_6CK_0MS en Fuses en Atmel studio para aplicar la frecuencia de reloj de 8Mhz.
Prueba:
Si envío 'k' entonces vuelvo [B], Si envío 'j' entonces vuelvo [@], Si envío 'h' entonces vuelvo [@], Si envío 'g' entonces vuelvo [F] ... etc.