UTNianos

Versión completa: [Informatica II] Explicacion de la funcion Antirebote
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola gente como andan? Fer me pidió que le explique la función de anti-rebote. Hay miles funciones distintas de antirebote. Pero esta es la funcion mas sensilla para mi. Lo dio el año pasado Fresno. No se si siguen usando la misma funcion. pero si entienden esta funcion, pueden entender cualquier otra funcion de antirebote ya que es el mismo objetivo.

Espero no equivocarme en alguna parte. Si encuentran algún error me pueden avisar. No es para compilar ya que es una función nada mas.

Breve explicacion:
La idea del antirebote es basicamente estar seguro que realmente esta presionando/sensando alguna entrada que no sea por ruido.
Generalmente el ruido cambia el estado de un bit y vuelve muy rapido. En cambio en el caso de presionando y sensando, es mucho mayor el tiempo.
Por eso comparamos el Estado_Actual y el Estado_Anterior, si son iguales se suma el contador. Para saber si es ruido o esta realmente Sensando/Presionando, el contador tiene que llegar a 10. (puede ser 5 o 20 o cualquier numero que estes seguro de que el ruido no llega a esa cantidad).

Codigo paso a paso:


Void Antirebote_sensores (void)
{
Estado_Actual= P_Sensores; //copia el estado del puerto donde recibe todas las señales de los sensores.
for(i=0; i< Cant_Sensores; i++)
{
if((Estado_Actual&(0x01<<i))==(Estado_Anterior&(0x01<<i)) //Compara bit por bit de cada variable si son iguales
{
/* (Estado_Actual&(0x01<<i)) si no lo tenes muy en claro, hay que estudiar las mascaras (AND (&), OR (|) y NOT (~)). (INFO 1). Basicamente lo que hace es poner todo en cero todos los bits menos el que esta en la posicion i (que puede estar en cero o en uno)*/
Contador [i]++; // si el bit de cada variable (en la misma posicion) son iguales suma el contador.
if(Contador[i]> Cant_Max_Antirebote) //Cant_Max_Antirebote = 10 por #define, que si el contador llega a 10 es por que realmente estas presionando/sensando. En caso de ruido no llega a contar 10 ciclos del for de la igualdad
{
if(Estado_Actual&(0x01<<i)) //comprueba si el bit de la posicion i del Estado_Actual esta en uno.
{
Estado_Final |=(0x01<<i); //pone en el bit de la posicion i del Estado_Final, en uno.
}
else Estado_Final &=(~(0x01<<i));//pone en el bit de la posicion i del Estado_Final, en cero.
}
else
{
Contador[i]= 0; // pone el contador en cero por que no llego a ser 10, que puede ser ruido.
if(Estado_Actual&(0x01<<i)) //comprueba si el bit de la posicion i del Estado_Actual esta en uno. como el bit de la posicion i de Estado_Actual y anterior no son iguales, lo copia, asi se va actualizando el estado anterior para poder. verificar en la proximo ciclo y a su vez sumar el contador en el caso de que sean iguales. Se repite el proceso.
{
Estado_Anterior |=(0x01<<i); //pone en el bit de la posicion i del Estado_Anterior, en uno.
}
else Estado_Anterior &=(~(0x01<<i)); //pone en el bit de la posicion i del Estado_Anterior, en cero.
}




Ojo: en el primer parcial que yo había subido, me di cuenta que hay algunos errores =P que paso por alto Fresno (Por suerte! jaja).

Saludos!
Increiiible!
Muchísimas gracias!
Muy bueno chee!
Pffff, CLARÍSIMO... sino hago bien el antirebote de ahora en más soy un completo boludo!!!
Mil gracias, ahora me quea sentar culo JAJA
Esta buena porque son 10 reglones de código es reee chiquita! Y encima esta re portable.. al lado de la que tenemos nosotros jaja.
URLs de referencia