problema con conteo de pulsos en un pic

j0k53r

Bovino maduro
#1
Que tal buenas tardes, queriero solicitar la ayuda del corral ya que tengo un proyecto atorado y no he podido avanzar. Se trata de un contador de pulsos por medio de un pulsador, el problema es que si el pulsador sigue en uno, sigue el conteo en vez de solo contar una vez hasta que este buelva a cambiar de estado.
Espero que alguien pueda ayudarme con este problemita que tengo, estoy programando en pic c compiler.

int aux;
void main()
{
aux=0;

While (true) {
delay_ms(100);

if(input(pin_c0)
{
aux=aux+1;
}

if(aux==1)
{
output_high(pin_d0);
output_low(pin_d1);
}

if(aux==2)
{
output_high(pin_d1);
output_low(pin_d0);
aux=0;
}
}
 

VBmaniaco

Bovino maduro
#2
necesitas hacer algo como que una variable cambie de estado cuando se presiona el botón (dogamos se pone a 1) y cuando se libera (digamos se pone a 0), una vez que logras eso con una variable, ahora sí haces una comparación si variable estado =0 y boton =1 entonces aux=aux+1, así que cuando estado y botón estén ámbos en 1 no hay incremento.

espero que la orientación te sirva y que puedas resolver tu problema, creo también que estás usando mikroC, deberías de revisarlo por que tiene una librería que se llama button que te puede servir, esa librería tiene un ejemplo en la ayuda y hace más o menos lo que necesitas. Saludos y excelente inicio de semana
 

j0k53r

Bovino maduro
#5
if(input(pin_c0)
{
aux=aux+1;
}

Un pequeño retardo estaria bien dentro de este if.
buena idea pero aun asi me sigue reproduciendo el conteo, sigo sin comprender lo que me planteo el amigo del primer comentario :( enserio aprenderia mejor con un ejemplo e buscado por la red y no encuentro nada
 

micro430

Bovino adolescente
#6
Mmmmm ya entendi tu problema ( jejeje eso espero), tu solucion seria

if(input(pin_c0)
{
aux=aux+1;
delay_ms(20);
if (aux>=3)
{
aux=0;
}
}
 

VBmaniaco

Bovino maduro
#7
perdón, acabo de ver tu comentario, permiteme de favor al fin de semana para hacerte un ejemplo, lo haría en pic simulator ide, en mikrobasic, o arduino y tú te encargarías de pasarlo al lenguaje que uses.




Tenía el arduino a mano y de una vez lo hice, ya que estos días tengo bastante carga de trabajo y no sé si tenga tiempo libre o no, espero que te sirva esta parte de código, y como te comentaba ya tú te encargarás de pasarlo al lenguaje que estés usando.



if (boton == HIGH && estado==0) // si la variable estado=1 y botón = activado, no se ha liberado el botón por tanto no se cumple la condición, cosa que sí se cumple la primera vez ya que inicias estado = 0
{
estado=1; //variable que controla si se libera o no el botón
digitalWrite(ledPin,HIGH); //enciende un led para saber que está presionado el botón
aux ++; // tu incremento
Serial.println (contador); // mostrado en la computadora
}

if (buttonState == LOW) // cuando el botón se suelta estado es 0 indicando la liberación del botón y
estado=0; // listo para el siguiente incremento
digitalWrite(ledPin,LOW); //apaga el led para indicar que se liberó el botón

y como verás es lo mismo que te comenté en mi intervención anterior, tengo una variable que se llama estado que es la que se encarga de ver cuando se libera el botón; Éste sólo es un ejemplo, ya que hay otras formas de hacerlo, más o menos eficientes pero las hay.

sólo debes de tener cuidado con lo que se conoce como "rebote" o debounce/debousing que siempre tienen los botones por ser elementos mecánicos e incrementará el contador en algunos cuantos puntos pero cuando encuentres un circuito que corrija eso no tendrás problemas de incrementos indebidos, así que a buscar algo para solucionar el debounce; yo lo estoy ejecutando y me incrementa fenomenal y cuando existe el problema del rebote sólo me lo aumenta en 3 o 4 y se detiene (vuelvo a lo mismo, sólo conecté el push sin circuitería anti-rebotes) Saludos y buenas madrugadas.
 
Última edición:

j0k53r

Bovino maduro
#8
perdón, acabo de ver tu comentario, permiteme de favor al fin de semana para hacerte un ejemplo, lo haría en pic simulator ide, en mikrobasic, o arduino y tú te encargarías de pasarlo al lenguaje que uses.




Tenía el arduino a mano y de una vez lo hice, ya que estos días tengo bastante carga de trabajo y no sé si tenga tiempo libre o no, espero que te sirva esta parte de código, y como te comentaba ya tú te encargarás de pasarlo al lenguaje que estés usando.



if (boton == HIGH && estado==0) // si la variable estado=1 y botón = activado, no se ha liberado el botón por tanto no se cumple la condición, cosa que sí se cumple la primera vez ya que inicias estado = 0
{
estado=1; //variable que controla si se libera o no el botón
digitalWrite(ledPin,HIGH); //enciende un led para saber que está presionado el botón
aux ++; // tu incremento
Serial.println (contador); // mostrado en la computadora
}

if (buttonState == LOW) // cuando el botón se suelta estado es 0 indicando la liberación del botón y
estado=0; // listo para el siguiente incremento
digitalWrite(ledPin,LOW); //apaga el led para indicar que se liberó el botón

y como verás es lo mismo que te comenté en mi intervención anterior, tengo una variable que se llama estado que es la que se encarga de ver cuando se libera el botón; Éste sólo es un ejemplo, ya que hay otras formas de hacerlo, más o menos eficientes pero las hay.

sólo debes de tener cuidado con lo que se conoce como "rebote" o debounce/debousing que siempre tienen los botones por ser elementos mecánicos e incrementará el contador en algunos cuantos puntos pero cuando encuentres un circuito que corrija eso no tendrás problemas de incrementos indebidos, así que a buscar algo para solucionar el debounce; yo lo estoy ejecutando y me incrementa fenomenal y cuando existe el problema del rebote sólo me lo aumenta en 3 o 4 y se detiene (vuelvo a lo mismo, sólo conecté el push sin circuitería anti-rebotes) Saludos y buenas madrugadas.
Ok, gracias como que ahora si ya me quedo un poco mas claro gracias por tomarte tu tiempo y darme una mano, creo que lo de los rebotes se solucionaria con un capasitor vere que pasa .
 
Arriba