La interrupcion es algo que corta el flujo normal del programa..
Suponete esta situacion, vos estas encendiendo un led, 5 segundos apagado y 5 segundos encendido.
Pero ademas queres que apenas se presione 1 boton encienda/apague otro led, Sin interrupciones lo mas simple seria hacer esto:
(Las funciones no son correctas es solo para dar el ejemplo)
while(1)
{
led = 1;
delay(5s);
led=0;
delay(5s);
if ( boton=1 ) {otroled = !otroled;}
}
Pero si por ejemplo presionas el boton cuando esta en la instruccion led=1; vas a tener que tener presionado el boton 10s para que recien llegue al if y entre.. Solucion mas simple y mas rapida? Preguntar mas veces,, le agrego el mismo if del final despues del primer delay
led = 1;
delay(5s);
if ( boton=1 ) {otroled = !otroled;}
led=0;
delay(5s);
if ( boton=1 ) {otroled = !otroled;}
Bien pero ahora tengo que esperar 5s.. es menos pero todavia no es exacto, y asi puedo dividir mi delay en 5 delays de 1 segundo y preguntar en cada uno de ellos, pero aun asi no es lo suficientemente rapido
Ahora si usas una interrupcion ( por ejemplo el puerto B suele tener interrupcion y conectas el boton a uno de esos pines) no importa tu programa principal, ya que apenas ocurre la interrupcion este deja el programa que estaba corriendo, ejecuta el programa de interrupcion y vuelve a donde habia dejado, esto casi inmediatamente
interrupt()
{
if ( boton=1 ) {otroled = !otroled;}
}
main()
{
led = 1;
delay(5s);
led=0;
delay(5s);
}
Entonces esta ves, por mas que este en el delay o lo que sea, va a entrar rapidamente a mi interrupcion, es decir rompo con el flujo del programa y luego vuelvo.
Ahora que aplicacion puede tener esto en tu programa ?
Podes usar un timer, el timer usa un registro de tamaño fijo, algunos de 8 y otros de 16 bits. el de 8 solo puede contar hasta 255( 0xFF o 1111 1111 ), cuando suma 1 mas ocurre un overflow, y se pone a 0, ese overflow es captado y activa la bandera de interrupcion, lo que si activaste la interrupcion del timer va a hacer el codigo de la interrupcion.
El timer permite crear una medida de tiempo, ya que sabes cuanto tarda cada ciclo de reloj dentro del PIC, por ejemplo si el ciclo tarda 10us y vos contas 100 para que se produzca el overflow, eso quiere decir que paso 1ms.
Ahora imaginate la señal PWM en el tiempo. Por ejemplo el servo es de 20ms, si haces un PWM de 256 pasos ( 8 bits ) eso quiere decir que tenes que hacer algo que cada 78.12us se ejecute para cambiar las salidas. Entonces usar tu timer para que haga una interrupcion en ese tiempo. Luego contas cuantas veces entro a la interrupcion, cuando llega a 256 quiere decir que ya pasaron los 20ms, Entonces lo que falta es tener las variables de cada PWM, si necesitas 1.5ms eso quiere decir que deberia contar 19 (1.5ms / 78.12us ) entonces en tu interrupcion preguntas si el contador es mayor o menor que lo que deberia contar, si es menor que ponga a 1 la salida, si es mayor que la ponga a 0.
No se si te la compique, pero si ves un codigo estoy seguro que vas a entenderlo mejor