Excalibur1491:
TEMA INTERRUPCIONES:
Para que una interrupción cumpla con su cometido el código que pongas dentro de la misma tiene que ser lo más corto que puedas y que dure el menor tiempo posible.
Para ello se utilizan variables que se las llama normalmente Flags o banderas (para consultar su estado luego dentro del código princial). Si usás un código muy extenso dentro de la interrupción corrés el peligro de que por tardar mucho tiempo ocurra el evento que estás controlando nuevamente y además te quite tiempo para lo que estás haciendo en el código principal. No se si me explico.
Por ejemplo, te paso el pseudocódigo:
INTERRUPCION:
alarmaEncendida=1;
FIN INTERRUPCIÓN
DENTRO DE MAIN:
while(1)
{ // BUCLE PRINCIPAL
if (alarmaEncendida==1)
{
// hago lo que me interesa que se actualice rápido
alarmaEncendida = 0; // Asigno a la variable alarmaEncendida el valor de cero (0) para que no vuelva
// a este sector del código excepto si se ha producido la interrupción.
}
else
{
// hago otra cosa
}
} // FINAL DE BUCLE PRINCIPAL
Aquí tienes algunos ejemplos de uso de banderas.
http://todopic.mforos.com/46840/5068985-ejemplos-para-pic16f877-con-ccs/TEMA ANTIRREBOTE:
normalmente se usa una espera de x milisegundos para evitar que una pulsación mecánica se interprete digitalmente como varias pulsaciones por los motivos que ya conoces.
Pero eso no es lo óptimo. ¿Por que esperar X tiempo?
Se puede comprobar en menos tiempo que X.
Para ello debes crear un algoritmo que verifica si el botón se pulsó, y además se mantuvo pulsado durante x iteraciones.
Un ejemplo a continuación:
do {
if (input(PIN_B0) ) // controla si el botón se pulsó
arranca=arranca+1;
ELSE
IF (ARRANCA>1)
arranca=arranca-1;
}while(arranca<=100); // el valor de 100 lo podés variar en más o en menos para afinarlo a tu necesidad.
Es poco probable que tengas un ruido que dure 100 iteraciones seguidas con el estado alto de RB0.
Y así el tiempo de este algoritmo es mucho menor que esperar 1 milisegundo. Se entiende?
Sinó avisá y te amplío el concepto.
Saludos.
Jukinch