Autor Tema: Lectura de entradas entre flancos  (Leído 2146 veces)

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

Desconectado picalo

  • PIC10
  • *
  • Mensajes: 20
Lectura de entradas entre flancos
« en: 20 de Febrero de 2011, 03:04:07 »
Hola amigos de todopic !!!

Necesitaria su ayuda ya que:
Estoy realizando un proyecto en el cual por una de las patas del pic 16f876 leo el tren de pulsos de un sensor inductivo y por otra pata el estado de un pulsador (este lo utilizo para incrementar una variable).

Mediante la siguiente porcion del programa leo las entradas anteriores:

while(true)                     

if (input(pin_a4)==0)                   PULSADOR
     {
     while(input(pin_a4)==0)
     {}
     f2+=1;
     }
if (input(pin_a1)==0)                  SENSOR
     {
     while(input(pin_a1)==0)
     {}
     contreal=contreal+0.86;
     }
}

El problema es que para evitar el rebote del sensor utilice el while anterior con este cuando el sensor detecta (=0), queda dentro del while hasta que no detecte mas (=1), por este motivo si el sensor esta detectando y toco el pulsador el pic no incrementara la variable f2.

¿ Que puedo hacer para evitar esta situacion ?

Lo que se me ocurrio es leer solo el flanco de subida o bajada del tren de pulsos pero COMO LO HAGO! 

MUCHA GRACIAS POR SU AYUDA




Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Lectura de entradas entre flancos
« Respuesta #1 en: 20 de Febrero de 2011, 03:50:48 »
Puedes chequear el estado de ambas entradas en un bucle. Por cada vez que te encuentres una activada, incrementas un contador; si te encuentras la otra, incrementas otro contador.
Si alguna vez te encuentras una entrada desactivada, reinicias su contador a cero.
Y así, sólo te queda poner un "if" para cuando el contador llegue a la cantidad que consideres suficiente para antirrebotes.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Lectura de entradas entre flancos
« Respuesta #2 en: 20 de Febrero de 2011, 04:03:24 »
Porque no quitas los while y metes retardos para esperar a que los rebotes hayan pasado?

Código: [Seleccionar]
while(true)                    
{
if (!input(pin_a4))                   PULSADOR
     {
     delay_ms(20);
     f2+=1;
     }
if (!input(pin_a1))                  SENSOR
     {
     delay_ms(20);
     contreal=contreal+0.86;
     }
}


Esto es para que no se te quede permanentemente en el while cuando el pulsador ó sensor este a 1, pero claro las variables f2 y contreal se incrementan a lo loco.

Si lo que deseas (que sería lo lógico) es que se incrementen una sola vez cada vez que pulsador o sensor pasen a 1 deberas hacer actuar a estos por flanco. Para hacer esto leete la interrupción en RB0 y las interrupciones por cambio de estado en RB4..RB7

También se puede hacer usando variables auxiliares de flanco, pero eso es más complicado, lo normal es mediante interrupciones.

Un saludo

PD. Manolo me has ganado por un pelo

Desconectado picalo

  • PIC10
  • *
  • Mensajes: 20
Re: Lectura de entradas entre flancos
« Respuesta #3 en: 24 de Febrero de 2011, 20:37:19 »
Amigos como ustedes lo han dicho, lo solucione utilizando la interrupcion INT_EXT, por lo cual mientras estoy dentro del WHILE del pulsador dicha interrupcion incrementa un contador que luego es evaluado y me permite las lecturas del pulsador y el sensor casi al mismo tiempo...

PERO: tuve otro problemita que quisiera saber que piensan ustedes ...

al compilar el programa me aparecio la siguiente advertencia

warning 216 "interrupts disabled during call to prevent re-entrancy" (@ADDFF)

MUCHISIMAS GRACIAS POR SU AYUDA

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Lectura de entradas entre flancos
« Respuesta #4 en: 24 de Febrero de 2011, 23:48:34 »
Amigos como ustedes lo han dicho, lo solucione utilizando la interrupcion INT_EXT, por lo cual mientras estoy dentro del WHILE del pulsador dicha interrupcion incrementa un contador que luego es evaluado y me permite las lecturas del pulsador y el sensor casi al mismo tiempo...

PERO: tuve otro problemita que quisiera saber que piensan ustedes ...

al compilar el programa me aparecio la siguiente advertencia

warning 216 "interrupts disabled during call to prevent re-entrancy" (@ADDFF)

MUCHISIMAS GRACIAS POR SU AYUDA

  Hasta donde entiendo, es simplemente un aviso el cual indica que durante la rutina de atención a la interrupción se están deshabilitando las mismas para evitar y reeingreso a la propia rutina de interrupción.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas