Autor Tema: Ayuda con pulsadores para gestión de menús  (Leído 2640 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Ayuda con pulsadores para gestión de menús
« en: 20 de Diciembre de 2011, 16:04:03 »
Hola a todos, resulta que estoy desarrollando un proyecto en ccs en el cual recorro un menú con dos pulsadores, pulsadormas que se supone que va de 0 a 5 y cuando llega a 5 se pone en 0 para repetir el proceso y pulsadormenos que va desde el 5 hasta el 0 y cuando llega a 0 pasa al 5.

Pues el pulsadormas no tengo problemas me funciona bien, el algoritmo es este:

Código: [Seleccionar]
int limitemas=5;
 
 
    if(input(selectmas)==0){
    delay_ms(20);           //Un retraso para evitar rebotes del pulsador
    swicht++;                 //Se incrementa la variable swicht
      if(swicht > (limitemas-1)){   //Si la variable swicht es mayor que límitemas -1
    swicht = 0;                // se pone la variable swicht a 0
    }
   }
y el pulsadormenos es:

Código: [Seleccionar]
int limitemenos=0;
        if(input(selectmenos)==0){
        delay_ms(20);
        swicht--;
         if(swicht < (limitemenos )){
             swicht=5;
          }
        } 


pero en el pulsadormenos es donde me viene los problemas, no consigo que me funcione bien, he probado muchas maneras sin éxito.
 la variable int va de 0 a 255 y creo pensar que cuando la decremento y llega al 0, el siguiente decremento será 255 y por eso es por lo que no me funciona correctamente, a parte de eso, cuando la cuenta de pulsadormas va por 4 e intento pulsar pulsadormenos para bajar de 4 a 3 y así sucesivamente me da saltos raros no baja secuencialmente si no que pone el número que de la gana a veces.

¿Que estoy haciendo mal?.
¿se puede hacer esto de otra manera más eficiente y menos complicada?
saludos
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado vier

  • PIC10
  • *
  • Mensajes: 1
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #1 en: 20 de Diciembre de 2011, 16:50:12 »
No se si tendrá nada que ver, pero si se pulsa menos y switch es 0, después pasa a ser 255, lo raro es que después pulsando más, si por ejemplo tienes 253, marque el valor correcto.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #2 en: 20 de Diciembre de 2011, 17:04:46 »
hola
Pienso que podrias mejorar el antirrebote, porque aunque haces un delay no compruebas nuevamente el estado del pin y puede ser la causa de los valores aleatorios que dices.
Efectivamente si decrementas un int cuado esta en 0 el siguiente paso será 255
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #3 en: 20 de Diciembre de 2011, 18:45:26 »
No se si tendrá nada que ver, pero si se pulsa menos y switch es 0, después pasa a ser 255, lo raro es que después pulsando más, si por ejemplo tienes 253, marque el valor correcto.

No marca el valor correcto.
me explico, si decremento y me paso del 0 y salta a 255, el programa no hace nada se queda esperando un valor que nunca llegará, pero si empiezo a incrementar con el +, tengo que apretarlo varias veces hasta subir del valor que quedo en el negativo hasta llegar a un valor que el programa reconozca, ejemplo.

si pulso el (-) hasta llegar a 250, luego para llegar a 0 tengo que ir pulsando el (+) e ir recortando hasta llegar por ejemplo al 1 y ahí el programa empieza a funcionar de nuevo

hola
Pienso que podrias mejorar el antirrebote, porque aunque haces un delay no compruebas nuevamente el estado del pin y puede ser la causa de los valores aleatorios que dices.
Efectivamente si decrementas un int cuado esta en 0 el siguiente paso será 255

¿y cómo podría mejorarlo?, ¿tienes algún ejemplo para parcticarlo?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #4 en: 20 de Diciembre de 2011, 18:55:47 »
if(swicht < (limitemenos )){
             swicht=5;
          }


si limitemenos = 0 esa condicion nunca se cumplira, en todo caso tendrias que poner limitemenos=1

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #5 en: 20 de Diciembre de 2011, 18:57:20 »
lo he pobado como dices y nada no funciona
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #6 en: 20 de Diciembre de 2011, 19:09:02 »
quitale los parentesis de (limitemenos ), y prueba cambiando delay_ms(20) por 100, si pones valores mas grandes podras ver mejor como actua el codigo a camara lenta.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #7 en: 20 de Diciembre de 2011, 23:50:54 »
  Yo concuerdo con Jhozate, además de poner un delay, hay que volver a hacer el chequeo y si sigue estando en 0 la tecla pulsada es porque efectivamente se está presionando y allí es donde hay que actuar.

  Sería algo así....

Código: C
  1. si pulsador == 0
  2. {
  3.    retardo;
  4.    si pulsador == 0
  5.   {
  6.     hacer todo el proceso
  7.   }
  8. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Chipcon

  • PIC12
  • **
  • Mensajes: 63
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #8 en: 21 de Diciembre de 2011, 00:16:14 »
Hola que tal pero creo que tu problema tiene que ver con la declaración de la variable recuerda una variable int son 16bits es decir que al decrementar el valor sera 65535,
no 255, a menos que un int se pueda promover a unsigned char.

cuando tu incrementas el valor o hay problema,pero si al decrementar.
Saludos

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #9 en: 21 de Diciembre de 2011, 02:08:53 »
La variable int depende de la arquitectura que estas usando si tu pic es de 8 o 16 bits, porque no intentas usar algo como esto

Código: [Seleccionar]
int limitemenos=0;
        if(input(selectmenos)==0){
        delay_ms(20);
        if(swicht == 0){
             swicht=255;
             goto end;
          }
        swicht--;
         end:
        }

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #10 en: 21 de Diciembre de 2011, 08:08:08 »
Prueba así a ver que tal.


Código: [Seleccionar]
int limitemas=5; 
 
    if(input(selectmas)==0)
    {
        delay_ms(20);                      //Un retraso para evitar rebotes del pulsador
        swicht++;                            //Se incrementa la variable swicht
        if(swicht >= limitemas)        //Si la variable swicht es mayor o igual que límitemas
        {   
           swicht = 0;                           // se pone la variable swicht a 0
        }
   }


        if(input(selectmenos)==0)
        {
             delay_ms(20);
             swicht--;
             if(swicht >= limitemas )
            {
                  swicht=4;
            }
        } 

A parte de mejorar los antirrebotes que te han comentado.

Saludos
« Última modificación: 21 de Diciembre de 2011, 08:44:58 por tannke »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con pulsadores para gestión de menús
« Respuesta #11 en: 21 de Diciembre de 2011, 17:01:31 »
  Yo concuerdo con Jhozate, además de poner un delay, hay que volver a hacer el chequeo y si sigue estando en 0 la tecla pulsada es porque efectivamente se está presionando y allí es donde hay que actuar.

  Sería algo así....

Código: C
  1. si pulsador == 0
  2. {
  3.    retardo;
  4.    si pulsador == 0
  5.   {
  6.     hacer todo el proceso
  7.   }
  8. }

Gracias, entendido el pseudocódigo

Bueno he conseguido hacerlo funcionar bien, creo que es la solución pero si a alguien que se le ocurre otra forma mejor......

Código: [Seleccionar]
// Declaraciones de Post-Procesado
      #include <16f876a.h>
   
      #FUSES xt,nowdt,noprotect
      #USE delay(clock=4000000)

      #define use_portb_lcd TRUE
      #include <FLEX_LCD.C>
     
      #use standard_io (A)
      #use standard_io (B)
      #use standard_io (C)
     
//****************************Definiciones de pines***********************
     
      #define mas PIN_B4 //Interruptor mas
      #define menos PIN_B5 //Interruptor menos
     
      int pulsador=0;
     
     
 #int_RB
 
 void Pulsadores_B4_B7(){  //Función de interrupción
   int limitepulsador=9;  //Variable límite para los pulsadores
 
   if(input(mas)==0){  //si está pulsado el puerto B4
      delay_ms(20);   //antirrebote
      if(input(mas)==0){ //se comprueba de nuevo si está pulsado B4
         pulsador++;   //Incremento
         if(pulsador > (limitepulsador-1)){ //Si la variable pulsador es mayor que (9-1)=8
            pulsador = 0; //pone la variable pulsador a 0
      }
     }
    }
     if(input(menos)==0){ //Si se pulsa B5
        delay_ms(20);    //Retraso antirrebote
        if(input(menos)==0){ //Se comprueba que todavía sigue pulsado el B5
           pulsador--;   //si es así se decrementa la variable pulsador
             if(pulsador > limitepulsador ){ //hasta que la variable pulsador supere el límite de 9
               pulsador=8; //y pone la variable a 8
         }
        }
      } 
    }

La manera de que he llegado es lo siguiente:
Int,  va de 0 a 255, entonces si bajo de 0 me salta a 255 con lo cual éste número es mayor que el límite de 9, si lo incremento pues lo mismo llega un momento que supera el límite de 9
Con lo cual si la variable es mayor que el límite, hago que se cargue el límite máximo y listo
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...