Hola amigos:
Ya estoy por aqui de nuevo despues de un poco de trabajo y medio recuperarme de un catarro.
En primer lugar paso a describirte Sergio un poco lo que es una interrupcion, espero saber hacerme entender si no es asi pregunta. Despues me descargare lo ultimo realizado y mas tarde comento algo al respecto. Vayamos con la interrupcion:
Una interrupción es un mecanismo por el cual un evento interno o externo puede interrumpir la ejecución de un programa. A partir de eses momento se produce un salto a una subrutina de atención a la interrupción, Es decir se atiende inmediatamente dejando de realizar lo que se realiza hasta ese momento, se ejecuta o indicado en la rutina de interrupción después al finalizar esta se retorna al programa en el sitio donde se dejó en el momento de producirse la interrupción.
Pueden existir distintas interrupciones dependiendo del pic utilizado y algunas de las más usuales son: desborde de temporizadores internos (TMR0, TMR1, TMR2,…); fin de conversión de conversores analógicos/digitales; cambio de estado en las líneas RB4 a RB7; por flanco en algún pin (RB0);….
Paso a comentar un poco la interrupción por el desborde por TMR0:
A partir de la frecuencia tomada del cristal externo, si así se configura el hardware, el pic internamente trabaja con una frecuencia de oscilación que suele ser la 4 parte de la frecuencia de oscilación. Esta frecuencia se utiliza para sincronizar el conjunto de instrucciones de programa.
Por su parte el TMR0, es un timer (registro interno) que puede ser leído y escrito su valor en cualquier momento, que puede ser configurado como contado ascendente r o como temporizador. Ahora nos centraremos en su funcionamiento como temporizador. Para ello va contando internamente los impulsos (frecuencia del cristal) divididos por 4. Estos impulsos tienen una duración conocida de un “ciclo maquina” que es 4 veces el periodo de la señal de reloj. Como ejemplo para una frecuencia de 4MHz el TMR0 se incrementa en una unidad cada 1micro segundo.
Para que se pueda trabajar con una interrupción por desborde del TMR0, se debe de configurar una serie de bits/registros internos del pic. En concreto hay que permitir las configuraciones GIE (general interrupt enable que se corresponde con el bit7 de registro INTCO; y después hay que comprobar periódicamente el estado del bit que indica si se ha producido la interrupción T0IF ( Oweflow interrupt flag que se corresponde con el bit 2 del mismo registro).
Como el tiempo que tardaría en recorrer todo el valor del registro del timer TMR0, sería muy poco, el TMR0 dispone de “PREESCALER” que no es más que otra división interna de la frecuencia que leería el TMR0 para incrementar de ese modo el tiempo en recorrer todo el valor desde “00000000 hasta FFFFFFFF”.
Este predivisor se configuraría adecuadamente en el registro “OPTION” con los bits 0 a 5 de dicho registro. La división puede hacerse por 2, 4, 8, 16, 32, 64,128 y 256. Como ejemplo el valor de una temporización se calcularía con la siguiente formula:
Temporización = (Toscilación/4) x Valor de preescaler x (256- valor cargado en TMR0)
X= (4/4) x 2 x (256-0=1 x 2 x 256= 512microsegunds.
Una vez realizada la configuración, si tenemos programada una interrupción, el pic está realizando el trabajo que le hayamos programado y cuando el timer TMR0, que está trabajando en segundo plano, se activa el bit F0IF y automáticamente tu programa deja de realizar la secuencia normal y pasa a realizar lo que tengamos pensado realizar cuando se produzca ese desborde. Al finalizar se retoma de nuevo el programa principal donde se dejó.
Como puedes ver esto es útil para realizar temporizaciones, digamos bajo cuerda, sin enterarnos que se está temporizando cuando llega al tiempo programado el pic nos avisa. Esto nos permite realizar unos trabajos independientemente de las temporizaciones (el pic está realizando 2 programas, digamos lo así). Si te fijas si la temporización s se realiza por bucles cuando el pic llega a este punto, el micro se para y no realiza nada hasta que no se termina el bucle. Por tanto la mejora del uso de las interrupciones aumenta la potencia y prestaciones del pic.
Las fases de una interrupción son:
1 Habilitación general de interrupciones
2 Señalización por medio del flag correspondiente cuando se activa
3 Para evitar otras interrupciones cuando se está en la primera hay que deshabilitar las interrupciones
4 El valor del contador de programa se guarda (para saber el regreso al finalizar).
5 Salto a la rutina de interrupción
6 Comprobar que tipo de interrupción ha sido disparada: TMR0, TMR1,….
7 Realizar lo que queramos en la rutina de interrupción.
8 Recuperar el valor de regreso
9 Borrar el flag de indicación de interrupción
10 Habilitar nuevas interrupciones.
Pero no te abrumes que NIple ya te realiza bastantes cosas como los pasos: 2, 3, 4, 5,6 y 8
Espero que esto te sirva para empezar o entender, y luego ya puedes preguntar las dudas.
F.