Hola (todo el) mundo..
..como estas es la priemera vez q realizo una conslta en el foro..bueno la misma es la siguiente...
Tengo el siguiente código...:
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
#define BUFFER_SIZE 32
// global flag to send processor into sleep mode
short sleep_mode;
int ext_buffer[BUFFER_SIZE];
// external interrupt when button pushed and released
#INT_EXT
void ext_isr() {
static short button_pressed=FALSE;
if(!button_pressed) // if button action and was not pressed
{
button_pressed=TRUE; // the button is now down
sleep_mode=TRUE; // activate sleep
printf("The processor is now sleeping...
"
;
ext_int_edge(L_TO_H); // change so interrupts on release
}
else // if button action and was pressed
{
button_pressed=FALSE; // the button is now up
sleep_mode=FALSE; // reset sleep flag
ext_int_edge(H_TO_L); // change so interrupts on press
}
if(!input(PIN_B0)) // keep button action sychronized wth button flag
button_pressed=TRUE;
delay_ms(100); // debounce button
}
#INT_RDA
void rda_isr()
{
gets(ext_buffer);
printf("
El dato leido es: %s
",ext_buffer);
sleep_mode=FALSE;
}
// main program that increments counter every second unless sleeping
void main() {
long counter;
sleep_mode=FALSE; // init sleep flag
ext_int_edge(H_TO_L); // init interrupt triggering for button press
enable_interrupts(INT_EXT);// turn on interrupts
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
printf("
"
;
counter=0; // reset the counter
while(TRUE)
{
if(sleep_mode) // if sleep flag set
sleep(); // make processor sleep
printf("La cuenta es: %5ld
",counter);
counter++; // display count value and increment
delay_ms(1000); // every second
}
}
Como podrán ver es muy sencillo..cada vez que se pulse un boton este provoca una interrupción y dependiendo de si este pasa de una transición de alto-bajo o de bajo-alto este coloca al µC.. en modo sleep o no (a travéz del seteo del flag sleep_mode)...bien esto funciona perfectamente... lo he probado en una placa de desarrollo que lo he diseñado y montado... cuando tenga un poco + de tiempo lo alzo para que todos aquellos que lo deseen...(es una placa de entranamiento para el 16F877 y el 18F458...pensado para el bus CAN).
El problema surge con la otra fuente de interrupción...el del USART...de acuerdo a la documentación proveida por µchip..una interrupción provocada por el USART deberia "despertar" al micro...cosa que no hace...
Les comentos que la rutina de interrupción del USART "fuera" del modo sleep funciona a la perfección...el problema es el modo SLEEP...
Alguien tiene alguna idea que problema pueda ser esto...es algún bug del compilador...o es que la unica fuente de interrupción que logra despertar al µC es la del pin RB0??
Escucho ideas....
Salu2....