Interrupcion por recepcion serial para modo sleep

Hi, buenas.

Acá estoy en un problema que en sí esta resuelto por vías alternativas pero no como debe ser. El problema se basa en activar al pic mediante interrupciones que estoy implementando en un proyecto, estas interrupciones son: EXT/RB0, cambio de estado RB, comparadores y por ultimo la interrupción por recepción de datos seriales. Esta ultima es la que me genera un problema por el cual tengo que re diseñar el código fuente a tal extremo de excluir el modo sleep, de esta manera funciona pero no como yo lo necesito; la razón radica en que el PIC al recibir un dato serial no "despierta" a diferencia de las demás interrupciones que si lo despiertan.

El programa esta realizado en CCs y el pic es un 16F628A
Código:
#INT_RDA //INTERRUPCION POR RECEPCION       
void D_IN_RS()  //INTERRUPCION QUE INDICA RECIVO DE CARACTERES POR RX
{
REV_COM_BACK(); //ME ENVÍA A ESTA FUNCIÓN LA CUAL CAPTURA Y COMPARA 
}                           //LOS COMANDOS SERIALES QUE RECIBE, ADEMAS

void main()
{
......
...
......
} 

#INT_RDA //INTERRUPCION POR RECEPCION OTRA MANERA    
void D_IN_RS()  //INTERRUPCION QUE INDICA RECIVO DE CARACTERES POR RX
{
TAREA=3; //SELECCIONA LA TAREA 3 A REALIZAR 
}  

void main() 
{
........
.....
SWITCH(TAREA)
{
CASE 0:
SLEEP;
BREAK;
......
...
CASE 3:
REV_COM_BACK(); 
TAREA=0,
BREAK;
}
} 

void REV_COM_BACK()    //ESTA ES LA FUNCIÓN RESUMIDA EN LA CUAL SE MUESTRA     
{                                   //LA CAPTURA DEL TREN DE DATOS SERIALES
int8 i;     
if(kbhit())      
{                                                                                   
for(i=0;i<4;i++)  
{                  
COM_BACK[i]=getc();      
}                           
COM_BACK[4]=0; 
}  
}


//ESTE ES EL CÓDIGO QUE FUNCIONA PERO ELIMINANDO EL MODO SLEEP
void main()
{
do
{
int i=0;     
while(i<5) 
{                      
if(KBHIT()) //revisa si a recibido un dato por el puerto serial
{ 
COMANDO[i]=GETC(); Posiciona el dato en una casilla del arreglo COMANDO
i++;
}         
} //una vez lleno el arreglo sale del bucle while(i<5)         
i=0;
REV_COM_BACK();
....
.......
....
}while(true);
}

void CONFIG()                                 
{
SET_TRIS_A(0b11100111);
SET_TRIS_B(0b11100011);
.....
...
.......
enable_interrupts(INT_RDA);

GIE=1; //esto solo lo realicé para verificar si la 
PEIE=1;//rutina enable_interrupts(global) funcionaba          
//enable_interrupts(GLOBAL); 
}

Lo extraño es que en proteus si funciona pero en la practica no
E buscado la manera de implementar en mi programa esta interrupción con rutinas en asm pero aun así no funciona como yo lo necesito.

Si alguien ha tenido experiencias con este tipo de interrupción para reactivar al pic después del modo sleep favor de explicar la solución y de antemano agradecer por el aporte.
 
Última edición:
Atrás
Arriba