HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   

tutorial: manejo de rutinas de interrupción en C

 

mini_c2.jpg (64880 bytes)

 

Antecedentes:

en un tutorial de la sección correspondiente a programación en lenguaje ensamblador, se explica el mecanismo de interrupciones realizado por el 16F84/F628/F88 para el manejo de varios de sus dispositivos internos. En particular, en el proyecto Reloj de Tiempo Real, se desarrolló un programa escrito en lenguaje ensamblador, para mostrar la hora en un LCD, empleando la interrupción del TIMER0.

Descripción: en este tutorial, se explican las capacidades que tiene el lenguaje C  (compilador CCS), para el manejo de interrupciones y el uso de las mismas en el caso particular del microcontrolador 16F88.

Si se le compara con el desarrollo en lenguaje ensamblador, el uso de interrupciones desde C representa un ahorro considerable en tiempo, debido a la gran simplificación en el manejo de bits, registros y variables.

 

LISTA DE INTERRUPCIONES DISPONIBLES EN EL 16F88, UTILIZANDO EL COMPILADOR CCS. EXISTEN 12 POSIBLES FUENTES DE INTERRUPCION:

DIRECTIVA DE INTERRUPCION

CONDICION QUE GENERA LA INTERRUPCION

#INT_AD Dato resultado de la Conversión Analógica- digital, listo
#INT_COMP Dato proveniente del comparador analógico, listo
#INT_CCP1 Dato de captura ó comparación, listo
#INT_EEPROM Escritura de dato en EEPROM, completa
#INT_EXT Señal de interrupción externa, activa
#INT_RB Cambio de nivel en entradas digitales RB4...RB7
#INT_RDA Dato en buffer de recepción en UART, listo para leerse
#INT_ SSP Líneas de SPI ó I2C, activas
#INT_TBE Buffer de trasmisión de UART, listo para recibir dato
#INT_ TIMER0 Overflow en temporizador 0
#INT_TIMER1 Overflow en temporizador 1
#INT_TIMER2 Overflow en temporizador 2

El programa que se usará para ejemplificar el uso de interrupciones en C es el mostrado en la ventana de abajo. Usando el TIMER1, se genera una base de tiempo de 1 segundo, a través del mecanismo de interrupciones. En este ejemplo, el programa principal "main" enciende y apaga el led RB0 cada segundo.

Los mismos bloques señalados con las llaves azules en el programa son indispensables incluirlos en caso de manejar rutinas de interrupción para cualquier otro dispositivo.

El TIMER1 es un registro que tiene 16 bits. Su carga inicial es de 0x0000 e incrementa cada vez que se genera 1 pulso en su clock. El TIMER genera una interrupción cada vez que existe un "overflow", es decir que la cuenta alcance 0xFFFF y pase a 0x0000. Si se usa el oscilador interno de 4 Mhz, el clock del TIMER1 tiene una frecuencia de FOSC/4, y un período de 1 us. Esto significa que se genera una interrupción cada 65536 us.

Observe los 3 comandos de CCS que permiten fácilmente operar el TIMER1. Estos mismos comandos se utilizan también con el resto de los dispositivos mostrados en la tabla de arriba:

"setup_timer_1(TI_INTERNAL|TI_DIV_BY_1)" permite configurar bits particulares en el registro de control de 8 bits del temporizador 1. En este caso, se elije el funcionamiento del temporizador con el oscilador interno del 16F88 (T1_INTERNAL)  y un preescalador de la frecuencia del temporizador que divide entre 1 (T1_DIV_BY_1). El operador " | " realiza el "OR" de ambos datos de 8 bits, realizando una suma booleana.

"enable_interrupts(INT_TIMER1)", habilita la interrupción del temporizador 1.

"enable_interrupts(GLOBAL)", habilita las interrupciones en el 16F88 en forma global.

La directiva #int_TIMER1 debe escribirse antes de la función de interrupción. La función de interrupción puede llevar cualquier nombre. En este caso se le nombró "TIMER1_isr( )" (isr significa: interrupt subrutine)

Cargue el archivo CCSINTSEGUNDOTINY.hex en el sistema EVOLUPIC Bootloader 16F88, usando el software TINY, y compruebe que el programa funciona correctamente. Vea una aplicación de esta rutina en el proyecto Reloj de Tiempo Real de alta precisión para 16F88

PROGRAMA DE PRUEBA INTERRUPCION TIMER 1

 

INTTIMER1.jpg (106525 bytes)