Hay vistos varios ejemplos puntuales empleando distintas técnicas diferentes en software tratando de no mal gastar elementos físicos que sin conocimientos puede ser un dolor de cabeza.
Ahora bien de todas las soluciones propuestas para software sucede que para el principiante también es un dolor de cabeza.
Voy a dejar varias alternativas y las iremos evaluando:
#1:
En este caso el problema es que solo toma un rebote y se quedaría en ese bucle hasta tanto se presione/suelte el pulsador. Poco conveniente para interrupciones distantes.
#2:
Este caso se emplea, por ejemplo en el PIN RA0, con un retardo preguntando luego de un instante en que estado esta el pulsador.
Ejemplo: si estoy en 1, espero (aquí suceden los rebotes de alternancia entre 1/0/1..) luego de un delay pregunto de nuevo por el pulsador, si continua en 1 es porque lo estoy pulsando y con mas retardo se puede preguntar si ya esta en 0 lo que pone en evidencia que se presiono el pulsador (es como el mouse cdo espera a que soltemos el botón al hacer click para generar el evento)
En ese caso empleo un retardo lo que puede generar conflictos en tareas en tiempo real: procesos de filtrado, audio, muestreos en Conv. A/D.
Aparentemente a velocidades de 4MHz no se producen problemas con las INTERRUPCIONES debido a que estas toman el primer cambio de estado, ahora bien si lo analizamos minuciosamente podrías tomar el rebote como muchos cambios y si la interrupción se ejecutase a esas velocidades es posible que se atienda la int tantas veces como rebotes haya.
Pero no es conveniente poner delay en INT's ya que detienen el main. Habrá que recurrir a otro algoritmo.
Soy todo oídos a mejores soluciones propuestas
Ahora bien de todas las soluciones propuestas para software sucede que para el principiante también es un dolor de cabeza.
Voy a dejar varias alternativas y las iremos evaluando:
#1:
Código:
while(!input(PIN_B4));
#2:
Código:
boton[0]=input(PIN_a0);
delay_ms(250);
boton[0]=input(PIN_a0);
Ejemplo: si estoy en 1, espero (aquí suceden los rebotes de alternancia entre 1/0/1..) luego de un delay pregunto de nuevo por el pulsador, si continua en 1 es porque lo estoy pulsando y con mas retardo se puede preguntar si ya esta en 0 lo que pone en evidencia que se presiono el pulsador (es como el mouse cdo espera a que soltemos el botón al hacer click para generar el evento)
En ese caso empleo un retardo lo que puede generar conflictos en tareas en tiempo real: procesos de filtrado, audio, muestreos en Conv. A/D.
Aparentemente a velocidades de 4MHz no se producen problemas con las INTERRUPCIONES debido a que estas toman el primer cambio de estado, ahora bien si lo analizamos minuciosamente podrías tomar el rebote como muchos cambios y si la interrupción se ejecutase a esas velocidades es posible que se atienda la int tantas veces como rebotes haya.
Pero no es conveniente poner delay en INT's ya que detienen el main. Habrá que recurrir a otro algoritmo.
Soy todo oídos a mejores soluciones propuestas
Última edición por un moderador: