⚡ Descuentos en cursos en video - Lleva tu aprendizaje técnico al siguiente nivel y aprovecha precios especiales antes de que termine la oferta. 🔥 Aprovechar oferta ahora 🔥
Microcontroladores y sistemas digitales

rutina de interrupcion modo sleep pic 12f675

Carlos A Navarrete B
hace 6 años
hace 6 años
Buenos dias, estoy haciendo una rutina de interrupcion para el pic 12f675 con CCS , pero no logro hacer trabajar la funcion sleep, despues de que el micro entra en modo sleep no lo puedo despertar alguien puede ayudarme a mejorar mi rutina y hacer que funcione correctamente #include <12f675.h> #define GP0 PIN_A0  #define GP1 PIN_A1  #define GP2 PIN_A2  #define GP3 PIN_A3  #define GP4 PIN_A4  #define GP5 PIN_A5 #define PULSE PIN_A2 #define LDR   PIN_A4   VOID MAIN () { //*********************************************************************** //*****************CONFIG*************************************** SET_TRIS_A(0B00010100); SETUP_ADC_PORTS(NO_ANALOGS); SETUP_COMPARATOR(NC_NC_NC_NC); setup_adc( ADC_OFF ); // disable A2D  enable_interrupts(GLOBAL);  enable_interrupts(INT_RA2);    while (TRUE)   {     IF (input(PULSE) == 1)       {         if (input(LDR) == 1)          {                        //interrupcion por cambio de estado en pines                            output_high (PIN_A5);              delay_ms(2000);              output_low (PIN_A5);              delay_ms(2000);                                                                         output_high (PIN_A1);              delay_ms(200);              output_low (PIN_A1);              delay_ms(400);              output_high (PIN_A1);               delay_ms(200);                       output_low (PIN_A1);              delay_ms(200);              output_high (PIN_A1);              delay_ms(200);              output_low (PIN_A1);              delay_ms(400);              output_high (PIN_A1);               delay_ms(200);                       output_low (PIN_A1);              delay_ms(200);              SLEEP();          }                            ELSE            {                                output_low (PIN_A0);                output_low (PIN_A5);                 output_low (PIN_A1);                                               }                        }              }       }        // ******************************************************************* #INT_RA     despierta() { input(PULSE); IF (input(PULSE) == 1)       {         if (input(LDR) == 1)          {                        //interrupcion por cambio de estado en pin                       output_high (PIN_A5);              delay_ms(3000);              output_low (PIN_A5);              delay_ms(5000);                                             output_high (PIN_A1);              delay_ms(200);              output_low (PIN_A1);              delay_ms(400);              output_high (PIN_A1);               delay_ms(200);                       output_low (PIN_A1);              delay_ms(200);              output_high (PIN_A1);              delay_ms(200);              output_low (PIN_A1);              delay_ms(400);              output_high (PIN_A1);               delay_ms(200);                       output_low (PIN_A1);              delay_ms(200);             sleep();           return(0);          }     }  }
Jorgeal
Jorgeal
399
hace 6 años

porque no pruebas primero la rutina sin sleep a ver si anda y hace lo que tu quieres que haga, y luego una vez que el resto del codigo funciona como deseas, agregas el sleep y vas viendo.
Segundo, veo que tienes un sleep dentro de la interrupcion. Asi el micro nunca sale de la interrupcion una vez que entra. Nunca ejecuta el RETURN.
si eres nuevo en la programacion, empieza con el minimo de codigo inicial y a medida que va funcionado vas modificando y agregando.

Responder
circuitero
hace 6 años

¿tantas cosas haces adentro de un método de interrupción? ¿Por que no implementas primero un led parpadeante y el sleep pero con maquinas de estado? Pasa que se ve medio "spaguetti" tu código. Yo no soy especialista, pero he leido bastante de gente dedicada y siempre comentan lo mismo... JAMAS hacer tantas cosas en la rutina de interrupción, de hecho esa rutina debiera quedar solo para cambiar estados o hacer no mas de 4 lineas de codigo. El sistema no debiera estar tanto tiempo metido en una interrupción.

Responder
Reparaciones similares solucionadas

¿Conoces una solución?

¡Aprende a reparar con estos cursos YoReparo!

4.84
(25)

Curso Práctico de Reparación y Bobinado de Motores Eléctricos

Héctor Castiñeira
$ 60 USD
$ 20 USD
4.73
(22)

Curso Reparación de Fuentes Conmutadas de PC y Equipos Electrónicos

Maximiliano Resch
$ 40 USD
$ 20 USD
4.64
(11)

Curso Electrónica para Reparación de Placas

Santiago Cediel
$ 29 USD
$ 11 USD
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos?
Regístrate gratis