TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: picalo 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
-
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.
-
Porque no quitas los while y metes retardos para esperar a que los rebotes hayan pasado?
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
-
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
-
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.