Saludos a todos
Resulta que estoy haciendo una pequeña aplicación en la cual estoy comunicando unos equipos vía inalámbrica, estos equipos se comunican cada cierto tiempo, y por lo tanto, el tiempo restante es deseable que los equipos se encuentren consumiendo la menor cantidad de energía posible, estos equipos se encuentran conformados básicamente por un microcontrolador PIC16F886 y un modulo Xbee pro, la primera parte del problema que estoy atacando es optimizar el consumo energético del microcontrolador después atacaré el problema del consumo de energía del equipo Xbee.
Según el datasheet del PIC16F886 más exactamente en la sección AUTO - WAKE -UP ON BREAK (página 166) explican un método de despertar el microcontrolador por medio de una interrupción en la transmisión o recepción del USART, de lo anterior he construido el siguiente código el cual realiza una tarea muy sencilla, en forma resumida el código trasmite un dato cada vez que recibe por la USART el carácter 'y', el objetivo del programa es que el micro se despierte cuando reciba algún dato por el USART y si el dato recibido es el correcto entonces trasmite el respectivo dato por el mismo canal, posteriormente el micro entra en modo sleep hasta que vuelva a recibir un nuevo dato.
#if defined(__PCM__)
#include <16f886.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock = 4000000)
#use rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)
#use standard_io(c)
int dato;
float contador,caudal;
// Función de interrupción por recepción en modo asíncrono
#INT_RDA
void recepcion()
{
// Se captura el valor del dato transmitido
dato = getch();
// Si el dato recibido es y entonces transmite el caudal
if (dato == 0x79)
{
caudal = 10*contador;
printf("%f", caudal);
contador = 0;
}
}
// Función de interrupción por cambio de flanco en RB0
#INT_EXT
void externa()
{
// Si entra a la interrupción se incrementa el contador que lleva la cuenta
// de los pulsos enviados por el medidor de caudal en respectivo tiempo de
// Muestreo
contador = contador + 1;
}
void main()
{
//float caudal;
// Puerto a y b como entradas digitales
set_tris_b(0xff);
set_tris_a(0xff);
// Se configuran las interrupciones por recepción en Rs232 y por cambio de flancon en RB0
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// Se configura el flanco de activación de la interrupción externa
ext_int_edge(H_TO_L );
// Se inicializan las variables de interés
caudal = 0;
contador = 0;
// Se actival la pull-up en el puerto B del micro
port_b_pullups(TRUE);
setup_uart(UART_WAKEUP_ON_RDA);
do
{
sleep(); // Se queda dormido hasta que ocurra la interrupción por trasmisión o recepción en la USART
}while(true);
}
El programa lo he simulado en el proteus 7.2 y funciona sin problema alguno, pero cuando lo implemento en físico no funciona, es decir, el micro se queda dormido, además, he concluido que si se queda dormido por que al eliminar la instrucción sleep() del código el programa hace lo requerido en el circuito físico.
Agradecería cualquier tipo de consejo, comentario, recomendación para sacar adelante el proyecto.