La combinación de estos dos conceptos permite la generación de una interrupción a partir de uno de los relojes internos del micro.
Aunque el concepto es sencillo, para su implementación hay que ser muy cuidadoso y tomar en cuenta varios puntos fundamentales.
Vamos a analizar un programa muy sencillo en PICBASIC Pro (basado en otros aportes de la web) utilizando el micro 16F630. El objetivo del programa es encender y apagar un led conectado al pin 0 del puerto A (se utiliza un led colocado en el pin 1 del mismo puerto para validar cada vez que se produce una interrupción).
Puntos a considerar:
- Vamos a utilizar el oscilador interno del micro. En el caso del 16F630 ( y otros ) se necesita calibrar dicho oscilador. Para ello se utiliza la instrucción Define OSCCAL_1K 1 (ya que tenemos un micro con 1K de flash, en el caso de micros con 2K de flash la instrucción sería Define OSCCAL_2K 1 ). Esta instrucción toma un valor grabado de fábrica ubicado en las posiciones finales de la memoria flash, de ahí la importancia de indicar si el micro tiene 1K o 2K de flash.
- Como el reloj interno es de 4Mhz, debemos indicarle al compilador dicho valor mediante la instrucción DEFINE OSC 4 .
- Lo siguiente que debemos hacer es utilizar los registros internos del micro para establecer los parámetros del timer y las interrupciones. Para ello tenemos que revisar la hoja de especificaciones del micro que estemos utilizando. En nuestro caso, para el 16F630, dichos registros son OPTION_REG e INTCON.
- La instrucción OPTION_REG = %11010101 permite utilizar un divisor de 1/64 , lo que equivale a 16.384 milisegundos.
- La instrucción INTCON = %10100000 activa las interrupciones en general y la del reloj en particular.
- La instrucción On Interrupt Goto tickint permite que cada vez que ocurra una interrupción se ejecute el codigo ubicado en la etiqueta tickint.
- Revisando el código de la etiqueta tickint podemos ver los siguientes detalles:
- Antes de la etiqueta tickint tenemos la instrucción DISABLE , ya que no queremos que ocurran otras interrupciones mientras estamos procesando la presente.
- La instrucción INTCON.2 = 0 al final de la sección permite poner a cero el reloj
- La instrucción RESUME permite regresar al código donde estabamos antes de la interrupción.
- ENABLE habilita de nuevo las interrupciones
- En el lazo principal (mainloop) procesamos el valor de la variable update . Como tampoco queremos que ocurran otras interrupciones mientras ejecutamos este código, utilizamos las instrucciones INTCON = %10000000 e INTCON = %10100000 que deshabilita y habilita las interrupciones a partir del reloj interno.
También debemos considerar que la interrupción se ejecuta entre instrucciones, por lo que si estamos ejecutando una instrucción particular, como SERIN/SERIN2 , la interrupción se procesará después de ejecutarse la misma.
No hay comentarios:
Publicar un comentario