Autor Tema: BLOQUEO PROGRAMA EN CCS  (Leído 1262 veces)

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

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
BLOQUEO PROGRAMA EN CCS
« en: 09 de Julio de 2007, 17:07:27 »
Hola Compañeros,

A continuacion expongo un problema que he detectado en una aplicacion que lleva ya varios meses en funcionamiento, pero que hace unos dias le detecte el siguiente problema:

Resulta que se trata de un reloj implementado con un pic, el cual ejecuta algunas acciones dependiendo de la tecla oprimida, las cuales son simples pulsadores normalmente abiertos conectados a los pines A0:A2 con susu respectivas resistencias de 10K pullup.

El PIC tiene implementado el reloj por interrupcion, y muestra la hora en una LCD, pues sucede que cuando le switcheo los pulsadores en forma aleatoria y muy rápida, el programa deja de funcionar, no se en que parte del programa se queda el PIC, pero las interrupciones siguen ejecutandose de manera correcta. Esto lo puedo corroborar por que al generar las pulsaciones y llegar al estado de bloqueo el reloj deja de actualizarse en pantalla, pero si continuo aplicando el switcheo en los pines del teclado, el programa vuelve a su curso normal y muestra la actualizacion de la hora normalmente y sin retrasos.

Inicialmente pense que podia ser la pantalla que se bloqueaba, pero le he implementado rutinas en el ciclo principal del pic que me cambie el estado de un led y al llegar al estado de bloqueo todo lo que esta en el ciclo main() deja de funcionar.

La verdad ya he tratado de solucionar el problema de muchas formas, pero no he podido solucionarlo, lo mas extraño es que las interrupciones no tienen problema. :?  :?  :?

Espero me puedan colaborar con la solucion de este detalle, adjunto la funcion el CCS para la lectura de los pulsadores:


int lee_teclado(int1 kbd_mode)
{
   int key,key_c;
   
   key=( 0x07 ^ (input_a()&0x07) );   
   if(key)
   {
      delay_ms(10);
      key_c=( 0x07 ^ (input_a()&0x07) );
     
      if(key==key_c)
      {
         output_low(CNTRL_BACKLIGHT);
         delay_ms(150);
         
         if(kbd_mode)
            while(0x07 ^ (input_a()&0x07)); //Espero que se suelte la tecla       
           
         tempo_b=0;   
         switch(key)
         {           
            case 0x01:
               return 1;
            break;
            case 0x02:
               return 2;
            break;
            case 0x04:
               return 3;
            break; 
            default:
               return 0;
            break;
         }   
      }   
   }
   return 0;
}
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!