Autor Tema: Problema con Pulsador  (Leído 1501 veces)

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

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
Problema con Pulsador
« en: 31 de Octubre de 2005, 12:36:00 »
Hola gente:

Tengo un problemita con los pulsadores.
Lo que me gustaria hacer es que cuando presione un pulsador cambie de numero.
Eso ya esta. Pero cuando dejo presionado el boton, me gustaria que el numero del display cambien cada 1 segundo aprox.
Lo que esta ocurriendo con el ejercicio es que cuando dejo presionado queda dentro del ciclo y frena todo el progama hasta que lo suelto.

Les dejo el codigo para ver si alguien puede ayudarme.

Muchas gracias.
Pablo

//#include <18F458.h>
#include <16F874.h>

#device ADC=10
#use delay(clock=4000000)

#fuses XT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NOWDT

#byte port_a=0x05                               //permite usar port a como variable
#byte port_b=0x06                               //permite usar port b como variable
#byte port_c=0x07                               //permite usar port c como variable
#byte port_d=0x08                               //permite usar port c como variable
#byte port_e=0x09                               //permite usar port c como variable

#use fast_io(E)

byte const DISPLAY[10] = { 0b0111111,           //array para formar los digitos
                           0b0000110,
                           0b1011011,
                           0b1001111,
                           0b1100110,
                           0b1101101,
                           0b1111101,
                           0b0000111,
                           0b1111111,
                           0b1101111,  };       //terminar con punto y coma!

byte segundos;      // A running seconds counter
byte minutos;      // A running seconds counter
byte horas;      // A running seconds counter
byte veces = 0;    // Number of interrupts left before a second has elapsed
short actualizar;
int sonda = 1;
float sonda1=0.00;//, sonda2 = 0, sonda3 = 0;
int h_digit, l_digit;
byte k1,k2,k3;
int modo;


byte const MUX[6] = { 0b000,                  //array para la activacion de port a
                      0b001,
                      0b010,
                      0b011,
                      0b100,
                      0b101,};

byte DIGITO[6];                                 //array para mostrar los digitos



/////////////////////////////////////////////////////////////////////////////////////////////////////////////

void mostrar()                                       //rutina de visualizacion en el display
{

//         port_b=(digito[3]);                    //saco por port b el digito
//         port_c = 0b1000;
//         delay_ms(3);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)
//   set_tris_b(0x00);
   if(modo==1) {
         output_bit(PIN_D3,1);        
         output_bit(PIN_C4,0);        
         output_bit(PIN_C5,0);        
         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(digito[0]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,1);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(digito[1]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,1);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(digito[2]);                    //saco por port b el digito
         output_bit(PIN_d5,1);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)
   } else if(modo == 2){
         output_bit(PIN_D3,0);        
         output_bit(PIN_C4,1);        
         output_bit(PIN_C5,0);        
         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k1]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,1);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k2]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,1);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k3]);                    //saco por port b el digito
         output_bit(PIN_d5,1);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)
   } else if(modo == 3){
         output_bit(PIN_D3,0);        
         output_bit(PIN_C4,0);        
         output_bit(PIN_C5,1);        
         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k1]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,1);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k2]);                    //saco por port b el digito
         output_bit(PIN_d5,0);
         output_bit(PIN_d6,1);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)

         output_bit(PIN_d7,0);
         output_bit(PIN_d6,0);
         output_bit(PIN_d5,0);
         port_b=(DISPLAY[k3]);                    //saco por port b el digito
         output_bit(PIN_d5,1);
         output_bit(PIN_d6,0);
         output_bit(PIN_d7,0);
         delay_ms(1);                           //espero (para evitar parpadeos, puede ser necesario incrementarla)
   }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

#int_RTCC                                     //rutina de interrupcion por overflow de TMR0
TIMER0_isr()
{
   int tiempo;
      if(!input(PIN_C7)) { // Boton del Centro (SETEOS)
            modo++;
            if (modo == 2) {
               k1 = read_eeprom(1);
               k2 = read_eeprom(2);
               k3 = read_eeprom(3);
            }else if (modo == 3) {
               k1 = read_eeprom(4);
               k2 = read_eeprom(5);
               k3 = read_eeprom(6);
            }
            if (modo == 4)
               modo = 1;
      } else if(!input(PIN_C6)) { // Boton Abajo
         k3--;
         if (k3 == -1) {
            k3 = 9;
            k2--;
            if (k2 == -1) {
               k2 = 9;
               k1--;
               if (k1 == -1) {
                  k1=9;  
               }
            }              
         }          
      } else if(!input(PIN_D4)) { // Boton Arriba
         k3++;
         if (k3 == 10) {
            k3 = 0;
            k2++;
            if (k2 == 10) {
               k2 = 0;
               k1++;
               if (k1 == 10) {
                  k1=0;  
               }
            }              
         }          
      }

      tiempo = segundos;      
      do{
          restart_wdt();      // Puesta a cero del temporizador watchdog
          if(tiempo != segundos) {
            k3++;
            if (k3 == 10) {
               k3 = 0;
               k2++;
               if (k2 == 10) {
                  k2 = 0;
                  k1++;
                  if (k1 == 10) {
                     k1=0;  
                  }
               }                
            }          
          }
      }while(!input(PIN_C7)||!input(PIN_C6)||!input(PIN_D4));
     
      delay_ms(10);         // Antirebotes


   veces++;
   if (veces==15)                               //25 int por segundo
   {  segundos++;                            //transcurrio un segundo
         actualizar=true;
         veces=0;
   }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////


#separate
char* sacadecimal(float valor)                              //rutina para convertir a BCD
{

   int h_digit, pos;

   pos = 0;

   h_digit=0;
   if (valor>=10)
   {
      do {
         valor-=10;
         h_digit++;
      }while (valor>=10);
      digito[pos++] = DISPLAY[h_digit];
   }else{
      digito[pos++] = DISPLAY[0];
   }
   h_digit=valor;

   digito[pos++] = DISPLAY[h_digit];
   valor = (valor-h_digit)*100; // Pasa a los decimales

//   numero[pos++] = ".";

   h_digit=0;
   if (valor>=10)
   {
      do {
         valor-=10;
         h_digit++;
      }while (valor>=10);
      digito[pos++] = DISPLAY[h_digit];
   }else{
      digito[pos++] = DISPLAY[0];
   }
   mostrar();
}

#INT_AD
Conversion_Ad()
{
   sonda1 = 100*(read_adc(ADC_READ_ONLY) * 0.0048828125);
   sacadecimal(sonda1);

   sonda = 1;
   set_adc_channel(sonda-1);

   read_adc(ADC_START_ONLY);
}

formatear()                                     //rutina de formateo para los datos a mostrar
{
}


void main()                                     //rutina principal
{
   write_eeprom(1,3);
   write_eeprom(2,4);
   write_eeprom(3,5);
   write_eeprom(4,9);
   write_eeprom(5,8);
   write_eeprom(6,7);

   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(RA0_RA1_RA3_ANALOG);
   set_adc_channel(0);

   enable_interrupts(INT_AD);
   read_adc(ADC_START_ONLY);

   set_timer0(0);
   setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);


   set_tris_b(0x00);

   formatear();
   modo = 1;
   while(true)
   {
   }

}


Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
RE: Problema con Pulsador
« Respuesta #1 en: 31 de Octubre de 2005, 16:17:00 »
hola compi, leyendo tu post, se me ocurre que utilizes la interrupcion externa para  saber cuando tienes un flanco de subida/bajada del pulsador y gestiones el segundo en la misma interrupcion. Un saludo.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Problema con Pulsador
« Respuesta #2 en: 01 de Noviembre de 2005, 07:02:00 »
Viendo tu main solo haces unas escrituras al eprom  y una llamada a la función formatear que no tiene contenido. Cómo miras que el boton está pulsado con una interrupcion???

si es así no lo hagas con una interrupción hazlo en el main directamente

while (boton_pulsado)
{
if (boton_pulsado)
{
incrementar_contador++;
mostrar_numeros();
delay_ms(1000);
}
reset_wd(); //por si llevas mucho tiempo con el botón pulsado.
}

así el programa podrá atender a las demás interrupciones y leerá el boton sin problemas


Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Problema con Pulsador
« Respuesta #3 en: 01 de Noviembre de 2005, 08:13:00 »
El procedimiento formatear quedo colgado de otro programa y el eeprom lo usa para probar algo.

Pregunta:
Si me quedo pulsando el boton y entro en un while dentro del main no cuelga el programa??
Cual es la diferencia con que haga esto mismo dentro de el timer?


Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Problema con Pulsador
« Respuesta #4 en: 01 de Noviembre de 2005, 08:19:00 »
El procedimiento formatear quedo colgado de otro programa y el eeprom lo usa para probar algo.

Pregunta:
Si me quedo pulsando el boton y entro en un while dentro del main no cuelga el programa??
Cual es la diferencia con que haga esto mismo dentro de el timer?



 

anything