Autor Tema: Re: problema con funcion.........(SOLUCIONADO)  (Leído 2263 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: problema con funcion.........(SOLUCIONADO)
« en: 12 de Mayo de 2010, 21:59:16 »
hola de nuevo, les molesto ahora porque estoy teniendo un problema con una función que estoy implementando en CCS C para el pic 16f877a, el cual lo que hace es detectar todo el tiempo las pulsaciones de dos botones, donde estos pueden ir presionados a distinto tiempos, para cada botón y por X pulsaciones genera una pequeña aplicación. el punto es que el conteo de las pulsaciones de los botones me va mal, porque siempre que un botón queda a la disposición del otro. ósea que supongamos que presiono el botón 1 y 2 a distinto ritmo, lo que me pasa es que el botón 2 queda sujeto a las pulsaciones que genera el botón 1. si el botón 1 está marcando las pulsaciones más lentas y el boton2 mas rápidas, esta ultima = queda contando de forma lenta igual, y no sé por qué.
además  tengo que tener en consideración de los rebotes de estos botones por el cual le aplico el código:
Código: [Seleccionar]
if(!input(PIN_B4)){                         //contador de posición del pistón
                   while(!input(PIN_B4)){}        //elimino revotes
                   j=j-1;                                        //decremento j para saber cuando llega al 50% (1146) el pistón
                  }
bueno y esta línea es la misma para el otro botón.
el código de esta parte de mi programa, la que está en la función es:

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////////
//
// Funcion para poner lastres a piston a su 50% de su recorrido
//
////////////////////////////////////////////////////////////////////////////////////

void lastre_piston(void){            

////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
int h=0,i=0;
float g=0,j=0;

while(TRUE){

////////////////////////////////////////////////////////////////////////////////////
// Control lastre 1
////////////////////////////////////////////////////////////////////////////////////

if(input(PIN_B5) && h==0){                          //detecta que no este a su 100% el recorrido del piston
                          output_high(PIN_B6);         //activo la reversa del piston para dejarlo al 100% del recorrido (puente H)
                          output_low(PIN_B7);          //desactivo el avance del piston para que retroceda (puente H)
}
else if(!input(PIN_B5) && h==0){                    //detecta que el piston esta al 100% del recorrido...
                                g=2292;                       //pulsos que generado al 100% del recorrido por C0
                                h=1;                            //vandera para poner el piston al 50% de su recorrido
                                output_low(PIN_B6);     //desactivo la reversa del piston (puente H)
                                output_low(PIN_B7);     //desactivo el avance del piston (puente H)
                                delay_ms(100);            //tiempo de espera antes de poner el piston al 50%
}
if(h==1 && g>1146){                                   //detecta que el piston todavia es mayor al 50% de su recorrido
                   output_low(PIN_B6);                 //desactivo la reversa del piston (puente H)
                   output_high(PIN_B7);               //activo el avance del piston para dejarlo al 50% (puente H)
if(!input(PIN_C0)){                                      //contador de posicion del piston
                   while(!input(PIN_C0)){}           //elimino revotes
                   g=g-1;                                   //decremento g para saver cuando llega al 50% (1146) el piston
                  }
}
else if(h==1 && g<=1146){                       //detecta que el piston esta al 50% y desactiva el puente H
                         output_low(PIN_B6);        //desactivo la reversa del piston (puente H)
                         output_low(PIN_B7);        //desactivo el avance del piston (puente H)
                         k=1;                              //vandera que indica que el lastre esta a 50%
}
   lcd_gotoxy(1,1);
   printf(lcd_putc,"M1 %f  %i",g,h);
  
////////////////////////////////////////////////////////////////////////////////////
// Control lastre 2
////////////////////////////////////////////////////////////////////////////////////

if(input(PIN_B1) && i==0){                          //detecta que no este a su 100% el recorrido del piston
                          output_high(PIN_B2);        //activo la reversa del piston para dejarlo al 100% del recorrido (puente H)  
                          output_low(PIN_B3);         //desactivo el avance del piston para que retroceda (puente H)
}
else if(!input(PIN_B1) && i==0){                  //detecta que el piston esta al 100% del recorrido...
                                j=2256;                     //pulsos que generado al 100% del recorrido por B4
                                i=1;                          //vandera para poner el piston al 50% de su recorrido
                                output_low(PIN_B2);  //desactivo la reversa del piston (puente H)
                                output_low(PIN_B3);  //desactivo el avance del piston (puente H)
                                delay_ms(100);         //tiempo de espera antes de poner el piston al 50%
}
if(i==1 && j>1128){                                  //detecta que el piston todavia es mayor al 50% de su recorrido
                   output_low(PIN_B2);              //desactivo la reversa del piston (puente H)
                   output_high(PIN_B3);             //activo el avance del piston para dejarlo al 50% (puente H)
if(!input(PIN_B4)){                                   //contador de posicion del piston
                   while(!input(PIN_B4)){}         //elimino revotes
                   j=j-1;                                  //decremento j para saver cuando llega al 50% (1146) el piston
                  }
}
else if(i==1 && j<=1128){                       //detecta que el piston esta al 50% y desactiva el puente H
                         output_low(PIN_B2);      //desactivo la reversa del piston (puente H)
                         output_low(PIN_B3);      //desactivo el avance del piston (puente H)
                         m=1;                           //vandera que indica que el lastre esta al 50%
}
   lcd_gotoxy(1,2);
   printf(lcd_putc,"M2 %f  %i",j,i);
  
if(k==1 && m==1){
                 break;
}
}}
« Última modificación: 16 de Mayo de 2010, 15:28:19 por japifer_22 »

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Re: problema con 2 switch
« Respuesta #1 en: 13 de Mayo de 2010, 17:15:20 »
una vez que detectes la pulsacion del switch, para eliminar los rebotes, pon un delay de unos 200 o 300 ms y vuelve a comprobar el estado del mismo por si hubiera sido un ruido o similar, de esta manera te aseguras que los rebotes causados por los contactos quedan eliminados o dentro del delay sin detectarlos.

Tambien podrias hacerlo por interupciones de cambio de estado en los pines del PIC, aplicando el delay tambien.

Saludos.
Es falso eso de que el saber no ocupa lugar....


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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: problema con 2 switch
« Respuesta #2 en: 13 de Mayo de 2010, 18:43:27 »
todavía no logro que funcione bien.
(modifique el titulo del hilo)
« Última modificación: 15 de Mayo de 2010, 16:39:29 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: problema con funcion.........
« Respuesta #3 en: 16 de Mayo de 2010, 01:44:39 »
alguna idea del porque me pasa esto ??

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: problema con funcion.........
« Respuesta #4 en: 16 de Mayo de 2010, 03:16:22 »
Japifer, es normal que te ocurra lo que has descrito, porque en el tratamiento antirrebotes de una pulsación, dejas al micro en un ciclo infinito hasta que el usuario quite el dedo. Durante todo ese rato, el micro deja de atender las pulsaciones que puedan llegarle por el otro botón, precisamente porque está en ese bucle.

Te sugiero dos maneras de resolverlo:
1) mediante interrupciones: pones los dos pulsadores en sendos pines que puedan lanzar una interrupción externa, y haces el tratamiento de los pulsadores en cada rutina de interrupción
2) mediante un ciclo que distribuya el tiempo entre ambas tareas, me explico:
inicias bucle infinito  {
   ¿está pulsado P1 y antes no estaba? {
      Pongo a 0 el contador de tiempo de P1
   };
   ¿está pulsado P2 y antes no estaba? {
      Pongo a 0 el contador de tiempo de P1
   };
   ¿se mantiene pulsado P1? {
      Incrementa P1;
   }

   ¿se mantiene pulsado P2? {
      Incrementa P2;
   }
   ¿ha soltado P1? {
      ¿la duración de la pulsación es > antirrebotes?
         Procesamos pulsación válida de P1
   }
   ¿ha soltado P2? {
      ¿la duración de la pulsación es > antirrebotes?
         Procesamos pulsación válida de P2
   }
   Añadir aquí un pequeño delay de algunos milisegundos;
}

Con un algoritmo así, te aseguras que tu micro no deja nunca de escuchar a los dos pulsadores, haciendo el tratamiento de antirrebotes en una espera activa.




Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: problema con funcion.........
« Respuesta #5 en: 16 de Mayo de 2010, 13:09:46 »
hola nocturno gracias voy altiro a echar mano a lo que me suguieres. en cuanto a lo demas de mi control para el submarino me esta andando de lo mas bien. gracias apenas lo termine (el programa) lo subo a la parte de proyecto que vengpo describiendo ase algunas semanas. de como hacer mi propio submarino.
saludos!
PD:{de todas formas si me resulta lo que me mensionas, dejo aqui la solución}

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: problema con funcion.........(SOLUCIONADO)
« Respuesta #6 en: 16 de Mayo de 2010, 13:59:25 »
hola, analisando lo que me dijiste nocturno se me ocurrio 2 cosas, la primera era hacerla por interrupcion externa, que era lo mejor de esta forma, pero ley algo que m dijiste y se me ilumino la ampolleta y saque una solucion varata a lo que me pasava y ahora me funciona de lo mas bien, me elimina los revotes y no tengo problemas conque un boton se quede pulsado y el otro no, detecta ambos pulsos aunque vallan a distinto ritmo.
bueno la solucion es esta.

Código: [Seleccionar]
if(!input(PIN_B4)){                    //se a pulsado el boton de conteo??            
                                    x++;             //cuento  revotes                                        
                                   }
else{                                               //se solto el boton de conteo, SI?
if(x>0){                                           //¿se detectaron revotes? y/o se pulso el boton,SI?
            j=j-1;                                  // decremento en 1 float j
           x=0;                                    //pongo x en cero para volver a contar revotes de la siguiente pulsacion
          }
       }

con este codigo no tengo problemas en que quede
Citar
el tratamiento antirrebotes de una pulsación, dejas al micro en un ciclo infinito hasta que el usuario quite el dedo
« Última modificación: 16 de Mayo de 2010, 14:04:38 por japifer_22 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: problema con funcion.........
« Respuesta #7 en: 16 de Mayo de 2010, 14:32:50 »
Ea, pues ya lo tienes