2. 2 Interrupciones
Programación en C para electrónica
Interrupciones y temporizadores- Programación en C para
electrónica
3. Interrupciones del PIC 16F876A
Las interrupciones permiten la interrupción del
programa a cualquier suceso (interno o
externo).
Al producirse una interrupción el PIC salta a la
dirección del vector (0004h) de interrupción y
ejecuta la rutina.
Cuando la rutina de manejo de la interrupción
finaliza (RETFIE) el programa retorna al punto
donde se interrumpió el programa.
3
Interrupciones y temporizadores- Programación en C para
electrónica
4. Interrupciones del PIC 16F876A
El PIC 16F876A tiene un único vector de
interrupción y todas las interrupciones
provocan un salto a ese vector. (0004h)
La rutina de manejo de la interrupción debe
identificar qué evento interrumpió el programa
para ejecutar la rutina correspondiente.
El PIC posee registros con “flags” de
interrupción que permiten identificar el evento.
4
Interrupciones y temporizadores- Programación en C para
electrónica
8. Interrupciones en CCS
CCS dispone de
directivas para el
manejo de
interrupciones.
#int_XXXX.
La directiva
especifica que la
función que la sigue
es la función de
interrupción
correspondiente.
Ejemplo:
//interrupción timer 1
#int_TIMER1
void TIMER1_isr (void)
{
switch (ciclo)
{
case 0:
....
8
Interrupciones y temporizadores- Programación en C para
electrónica
9. Interrupciones en CCS
9
Interrupciones y temporizadores- Programación en C para
electrónica
10. Funciones para interrupciones
El compilador incluye funciones para facilitar
el manejo de interrupciones en C.
enable_interrupts(level)
Activa las interrupciones indicadas por
level.
disable_interrupts(level)
desactiva las interrupciones indicadas por
level.
clear_interrupts(level)
Borra el flag de interrupción indicado.
10
Interrupciones y temporizadores- Programación en C para
electrónica
11. level
Level es una constante definida en el fichero
de cabecera (#include <16F876A.h>).
Genera el código necesario para activar las
interrupciones correspondientes modificando
los registros ITCON, PIE1 y PIE2.
Cuando se activa alguna interrupción es
necesario activar “globalmente” las
interrupciones.
11
Interrupciones y temporizadores- Programación en C para
electrónica
13. Ejemplos:
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
disable_interrupts(GLOBAL);
clear_interrupts(INT_RTCC);
enable_interrupts(GLOBAL | INT_RTCC);
Nota: Esta ultima solo se puede hacer con interrupciones del mismo registro.
13
Interrupciones y temporizadores- Programación en C para
electrónica
14. 14 Temporizadores
Programación en C para electrónica
Interrupciones y temporizadores- Programación en C para
electrónica
15. Temporizadores:
El PIC 16F876A dispone de tres
temporizadores/contadores:
Timer 0: 8 bits.
Timer 1: 16 bits.
Timer 2: 16 bits.
Pueden funcionar como contadores de
flancos externos o como temporizador
(contador de ciclos máquina).
Disponen de “prescaler” para ampliar el
tamaño de la cuenta (hasta x256).
15
Interrupciones y temporizadores- Programación en C para
electrónica
16. Timer 1:
Cuenta de 16 bits en dos registros de 8 bits: TMR1H
(parte alta) y TMR1L (parte baja)
Los registros de cuenta se pueden leer y escribir.
Interrupción por desboradmiento de FFFFh a 0000h.
Controlado por el registro T1CON.
Funcionamiento como:
Temporizador (incrementa cada ciclo máquina).
Contador síncrono.
Contador asíncrono.
16
Interrupciones y temporizadores- Programación en C para
electrónica
17. Timer 1: 17
Interrupciones y temporizadores- Programación en C para
electrónica
19. Timer 1 en C:
CCS provee funciones de configuración de los
teporizadores:
setup_timer_X (modo)
Programa el modo de funcionamiento del
timer X
get_timerX ()
Lee el valor de la cuenta.
set_timerX (valor)
Escribe “valor” en los registros de cuenta.
19
Interrupciones y temporizadores- Programación en C para
electrónica
20. setup_timer_1(mode)
Configura el timer 1.
El modo de funcionamiento (mode)es una
constante definida en el archivo de cabecera.
Los modos se pueden agrupar con |.
20
Interrupciones y temporizadores- Programación en C para
electrónica
21. set_timer1(value) y get_timer1
set_timer1 escribe “value” (entero de 16 bits)
en los registros de cuenta del timer 1 (TMR1H
yTMR1L).
get_timer1() devuelve (16 bits) el valor de
los registros TMR1H yTMR1L.
value=get_timer1();
21
Interrupciones y temporizadores- Programación en C para
electrónica