tutorial: manejo de interrupciones en el timer 0, en lenguaje ensamblador, con el microcontrolador 18F2550

 

INTRODUCCION:

El manejo de interrupciones es una técnica de programación, basada en un mecanismo automático en el hardware del microcontrolador, que permite dar atención a algún dispositivo ó circuito interno o externo, únicamente en el momento en que ésta se requiera. Una interrupción es en realidad una llamada a una subrutina, pero iniciada por el hardware del propio periférico y no por la instrucción "CALL". La interrupción es asíncrona y puede ocurrir en cualquier instante durante la ejecución del programa principal.

El manejo de interrupciones es una alternativa al método conocido como "polling", en el cual dentro del programa principal, se está revisando el status de cada uno de los periféricos, una y otra vez en un loop permanente, para conocer si alguno de ellos necesita de atención. Para entender este proceso, podemos poner un ejemplo en la vida práctica en donde un conferencista (el microcontrolador) además de dictar su conferencia (programa principal), pregunta uno a uno y en forma constante a los asistentes (periféricos) si tienen alguna pregunta (si requieren atención del microcontrolador). Evidentemente dicho método conduce a una pérdida de tiempo del conferencista ( tiempo de procesamiento del microcontrolador) que podría ser utilizado en forma más eficiente.

En cambio, si los asistentes realizan su pregunta levantando la mano únicamente cada vez que necesiten atención, solo en ese momento se genera una "interrupción" al programa principal (la conferencia). El conferencista tiene el tiempo suficiente de responder la pregunta (dar atención al periférico) para después continuar con su conferencia.

El manejo de interrupciones permite operar el manejo del "multitasking" o multitareas, es decir, una técnica de programación en la cual es posible dar atención a multitud de periféricos, reduciendo al mínimo el tiempo de procesamiento. Un caso muy ilustrativo es el de las computadoras PC, en donde el teclado, el mouse, el disco duro, el reloj de tiempo real, la impresora, el módem y en fin, todos los periféricos son controlados y atendidos a través del sistema operativo, por medio de un esquema de interrupciones.

SUBRUTINA DE ATENCIÓN A LA INTERRUPCIÓN

Con base en la figura mostrada arriba, al generarse la señal de interrupción, el microcontrolador termina primero la ejecución de la instrucción que se esté procesando en ese momento, guarda en el STACK ó PILA la dirección de memoria de código de la siguiente instrucción y posteriormente hace un llamado a la "subrutina de atención de interrupciones", cuyo inicio siempre se encuentra en la dirección 0x008H de la memoria de código, en el caso del microcontrolador 18F2550.

Al final de la subrutina de atención de interrupciones, mediante la instrucción "RETFIE"(Return From Interrupt), el flujo del programa regresa al programa principal mediante el mismo mecanismo utilizado por las subrutinas "CALL" convencionales, es decir recuperando la dirección de retorno previamente almacenada en el STACK.

MANEJO DE INTERRUPCIONES EN LENGUAJE ENSAMBLADOR EN EL SISTEMA BOLT 18F2550

El sistema Bolt 18F2550 utiliza los primeros 2K de su memoria de código para almacenar su programa Bootloader. En este programa, hay un vector para redireccionar la interrupción a la dirección 0x808, de tal forma que el usuario tenga espacio de memoria suficiente para programar sus subrutinas de atención de interrupciones. En seguida se muestran un ejemplo del manejo de las interrupciones en el sistema Bolt, utilizando la interrupción del temporizador 0.

En el ejemplo se combinan 2 tareas: en la tarea 1, el procesador enciende y apaga el led RB7 con un período de 1 segundo. Esta tarea está realizada por medio de la interrupción del TIMER 0. En la tarea 2, que está a cargo del programa principal, el microcontrolador realiza una cuenta binaria en los bits RB0...RB3. El período de la cuenta en este caso es de 200 ms.

 

BOLT-INTERRUPCIONES-18F2550-2.ASM EJEMPLO DE INTERRUPCIONES TIMER 0
BOLT-INTERRUPCIONES-18F2550-2.HEX  
KEYBOLT.inc ARCHIVO AUXILIAR

NO OLVIDE GUARDAR EN MEMORIA EL REGISTRO W Y EL REGISTRO STATUS AL ENTRAR A LA SUBRUTINA DE INTERRUPCIÓN

Una vez dentro de la subrutina de interrupción, el programador debe inmediatamente guardar los registros W y STATUS, para evitar que se pierda su contenido al regresar de la subrutina. La instrucción SWAPF, que realiza un intercambio entre los bits más significativos y menos significativos de una localidad de memoria, se utiliza porque su ejecución no modifica el registro de STATUS. En los siguientes ejemplos, se usa la localidad "SALVAW" para almacenar el registro W y "SALVASTATUS" para guardar el registro STATUS:


    MOVWF       SALVAW                ;GUARDAMOS W EN MEMORIA.
    SWAPF        STATUS,w              ;GUARDAMOS EL REGISTRO DE STATUS EN W
    MOVWF      SALVASTATUS      ;GUARDAMOS EL REGISTRO DE STATUS EN MEMORIA

Posteriormente escribimos aquí la subrutina de atención a la interrupción, el cual realiza una determinada tarea.

Al final de la subrutina, antes de regresar al programa principal, debemos recuperar los valores de los registros W y STATUS.

    SWAPF       SALVASTATUS,w         ;guardamos el registro STATUS en W
    MOVWF     STATUS                         ;recuperamos el valor de STATUS   
    SWAPF       SALVAW,F                    ;realizamos SWAP de registro SALVAW, no se afecta STATUS

    SWAPF       SALVAW,W                   ;recuperamos el valor de W, no se afecta el STATUS
    RETFIE                                             ; REGRESA DE LA INTERRUPCIÓN