Atmega8 + Modulo Bluetooth HC-06

Hola comunidad, espero que esten muy bien! Compre un modulo Bluetooth para realizar algunos proyectos basicos que tengo en mente, y realizo el post para saber si podrian ayudarme. Cree una aplicacion con APP INVENTOR del MIT para probar el modulo mediante una comunicacion con ARDUINO UNO via bluetooth y funciona de maravillas!
Ahora, mi problema de comunicacion es cuando intento utilizar directamente AVR-STUDIO y APP INVENTOR.
Lei por algunos foros que se trataba de un problema de tiempos de comunicacion en el programa realizado en avr c, pero no pude resolverlo por mi cuenta y es por eso que recurro en ayuda de ustedes! Les dejo mi codigo hecho en AVR-STUDIO y espero sus opiniones. Desde ya, saludos y gracias!

PHP:
/*
 * Bluetooth.c
 *
 * Created: 16/06/2016
 *  Author: Gustavo
 */ 

/* Librerias */
#include <avr/io.h>
#include <util/delay.h>

/* Variables a Utilizar */
uint8_t dato_serial = 0;

/* Función para inicializar USART */
void iniciar_usart(unsigned int baud)
{
    /* Se establece la tasa de baudios con el valor ingresado a la funcion */
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Se habilita la recepción y la transmisión de datos */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Se establece el formato de la trama: 8 bits de datos, 2 bits de parada, sin bits de paridad */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

/* Función para recibir un caracter */
unsigned char recibirbyte_usart(void)
{
    /* Espera a recibir datos */
    while (!(UCSRA & (1<<RXC)));
    /* Devuelve el dato leido */
    return UDR;
}

int main(void)
{
	// Inicializacion de USART a 9600 Baudios
	iniciar_usart(104);
	// PB5 como salida
	DDRB = (1<<PB5);
	// Limpiamos PORTB
	PORTB = 0x00;
    // Retardo 200ms, para que el modulo bluetooth se inicie correctamente
	_delay_ms(200);
	
    while(1)
    {
		// Almacenamos dato recibido por puerto serial en "dato_serial"
		dato_serial = recibirbyte_usart();
		
		// Preguntamos si "dato_serial" es igual al caracter "a"
		if (dato_serial == "a")
		{
			// Si es correcto, encendemos el led
			PORTB = (1<<PB5);
		}
		// Preguntamos si "dato_serial" es igual al caracter "b"
		if (dato_serial == "b")
		{
			// Si es correcto, apagamos el led
			PORTB = (0<<PB5);
		}
    }
}




EDITO PARA NO REALIZAR OTRO POST: Adjunto aplicacion para android y hex compilado con arduino para que vean que funciona perfectamente. Mi problema es el que planteo arriba.
 

Adjuntos

  • LED_ONOFF.rar
    1.4 MB · Visitas: 15
Última edición:
Bueno, he podido solucionarlo! Contaba con dos problemas, uno era la configuracion de los fuses. Los cuales quedaron configurados de este modo:



Y el segundo problema es que el codigo requeria comillas simples(') en la comparacion y no dobles("), quedando de este modo:

PHP:
/*
 * Bluetooth.c
 *
 * Created: 16/06/2016
 *  Author: Gustavo
 */ 

/* Librerias */
#include <avr/io.h>
#include <util/delay.h>

/* Variables a Utilizar */
uint8_t dato_serial = 0;

/* Función para inicializar USART */
void iniciar_usart(unsigned int baud)
{
    /* Se establece la tasa de baudios con el valor ingresado a la funcion */
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Se habilita la recepción y la transmisión de datos */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Se establece el formato de la trama: 8 bits de datos, 2 bits de parada, sin bits de paridad */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

/* Función para recibir un caracter */
unsigned char recibirbyte_usart(void)
{
    /* Espera a recibir datos */
    while (!(UCSRA & (1<<RXC)));
    /* Devuelve el dato leido */
    return UDR;
}

int main(void)
{
    // Inicializacion de USART a 9600 Baudios
    iniciar_usart(104);
    // PB5 como salida
    DDRB = (1<<PB5);
    // Limpiamos PORTB
    PORTB = 0x00;
    // Retardo 200ms, para que el modulo bluetooth se inicie correctamente
    _delay_ms(200);
    
    while(1)
    {
        // Almacenamos dato recibido por puerto serial en "dato_serial"
        dato_serial = recibirbyte_usart();
        
        // Preguntamos si "dato_serial" es igual al caracter "a"
        if (dato_serial == 'a')
        {
            // Si es correcto, encendemos el led
            PORTB = (1<<PB5);
        }
        // Preguntamos si "dato_serial" es igual al caracter "b"
        if (dato_serial == 'b')
        {
            // Si es correcto, apagamos el led
            PORTB = (0<<PB5);
        }
    }
}

y funcionando a la perfeccion! :D
Espero les sirva a ustedes, les mando un saludo grande!
 
Última edición:
Atrás
Arriba