Interrupción externa ejecute función el tiempo que yo quiera

Iniciado por AjarDeNauer, 16 Marzo 2012, 19:04 PM

0 Miembros y 1 Visitante están viendo este tema.

AjarDeNauer

Buenas tardes!

Para el código de mí reloj, uso el pic c compiler y uso el puerto B de mi pic como interrupción externa para unos pulsadores. Quiero conseguir que si pulso uno de los pulsadores y me salta a la función de interrupción que tendrá un switch case, no me vuelva automáticamente a la función principal cuando termina de ejecutarse la función de interrupción, quiero que se quede un tiempo mientras se está manipulando esa función...  es decir: mi función de interrupción recibe señales de los pulsadores para ir siendo modificada (tendrá un switch case también )y mientras se les dé a los pulsadores, el tiempo en la interrupción se vuelve a poner a 0... y cuando llevo un tiempo sin pulsar nada, quiero que salga de la función de interrupción automáticamente y me vuelva a la principal donde se había quedado.

La cuestión es que no sé que instrucción serviría para poder estar sin salir de esa función de interrupción al mismo tiempo que está el programa a la espera de recibir información de los pulsadores mientras dura un tiempo, un tiempo que he pensado con un delay pero tengo la duda de si con un delay, la función se queda ahí estancada simplemente... (kbhit(), getchar) ?? pero es para teclado no?)

Espero haber sido lo suficientemente explícito !

Gracias y saludos a todos.  :D

Tokes

Tienes que hacer un ciclo dentro de la rutina de interrupción. Te pondré como ejemplo un pseudocódigo:

RB_isr() // Rutina de interrupción por el puerto B.
{
   conta_teclsinact=0;

   while(1) // Ciclo infinito.
   {
      tecla=leer_teclado(); // Lee el teclado.
      if(tecla) // Si hay tecla pulsada...
      {
         conta_teclsinact=0;

         // Aquí se procesa la tecla pulsada.
         switch(tecla)
         {
            case 'A': ...
            case 'B': ...
         }
         esperar_se_libere_teclado();
      }
      else // Si no hay tecla pulsada...
      {
         conta_teclsinact++;
         if(conta_teclsinact>=valor_maximo) break; // Si ya ha pasado un determinado tiempo sin pulsarse tecla, sale del ciclo.
      }
      delay_elquequieras(); // Retardo para examinar las teclas.
   }
} //Termina la rutina de interrupción.


La variable conta_teclsinact se utiliza para contar las veces consecutivas que no se detecta tecla pulsada. Esta cantidad está determinada por un valor máximo. Cuando la variable conta_teclsinact llega al valor máximo, se rompe el ciclo infinito y se termina la interrupción.