2. GENERALIDADES
Las interrupciones son desviaciones del flujo de
control del programa originadas asíncronamente por
diversos sucesos que no se hallan bajo la supervisión
de las instrucciones.
Dichos sucesos pueden ser externos al sistema,
como la generación de un flanco o nivel activo en un
pin del microcontrolador, o bien internos, como el
desbordamiento de un contador.
3. GENERALIDADES
Se detiene la ejecución del programa en curso, se
salva la dirección actual del PC en la Pila y se carga
el PC con una dirección, en el caso de una
interrupción es una dirección “reservada” de la
memoria de código, llamada Vector de
interrupción, 0x04 para los microcontroladores de
la gama baja y media; mientras que en la gama alta
existen dos direcciones: 0x08 prioridad alta y 0x18
prioridad baja.
9. DESCRIPCIÓN
Esta fuente de interrupción es sumamente importante
para atender acontecimientos externos en tiempo real.
Cuando ocurre alguno de ellos activa el pin RB0/INT y
se hace una petición de interrupción, en forma
automática.
Este método es más eficaz que la técnica de sondeo ya
que el microcontrolador no perderá tiempo preguntando
a la línea de entrada para leer su estado, sino que
únicamente atenderá al periférico cuando éste se lo pida
mediante la solicitud de interrupción.
10. RB0/INT - PICC
En el caso de la interrupción externa RB0/INT de los
PIC18FXXX se tiene la siguiente directiva.
#INT_EXT – flanco en el pin RB0. Se activa la bandera INTF.
La directiva #INT_Global indica que la función que va a
continuación sustituye todas las acciones que inserta el
compilador al aceptarse una interrupción. Sólo se ejecuta lo
que vaya en dicha función.
11. RB0/INT - PICC
Si se utilizan las directivas de interrupción, el
compilador genera el código necesario para saltar a la
función que va tras esta directiva en el momento de
la interrupción.
Además, genera el código para salvar al principio y
restituir al final el contexto, y también borrará la
bandera que se activó con la interrupción. El
programador, solo debe encargarse de habilitar
las interrupciones.
12. RB0/INT - PICC
Existe también otra función adicional destinada a
configurar el flanco activo que genera la interrupción
externa (en RB0).
ext_int_edge (0, H_TO_L); - equivale a INTEDG=0.
Selecciona el flanco de bajada para activar la bandera
INTF.
ext_int_edge (0, L_TO_H); - equivale a INTEDG=1.
Selecciona el flanco de subida para activar la bandera
INTF.
13. PRÁCTICA
Enunciado: Realizar un programa que indique en
tiempo real la recepción de una señal externa recibida
por el pin INT0, INT1, INT2 del microcontrolador. La
recepción de dicha señal se lo hará a través de tres
LEDs indicadores, los cuales se apagarán mientras se
presione el pulsador correspondiente.
16. RETO
Enunciado: Realizar un contador autónomo de 0 a
9999 en cuatro displays de 7 segmentos, el
incremento se realizará con una temporización de 500
ms. Un pulsador sin interrupción (PIN_B3) posibilitará
el conteo de 1 en 1. La INT0 para un conteo de 10 en
10, la INT1 para un conteo de 100 en 100, la INT2
para un conteo de 1000 en 1000.
18. DESCRIPCIÓN
Los pines <RB7:RB4> del PORTB producen una sola
interrupción por cambio de su estado.
Para activar la interrupción por cambio de estado en los
pines <RB7:RB4> los bits RBIE y GIE del registro
INTCON deben estar a “1”, en estas condiciones
cuando se produce un cambio de nivel en cualquiera de
las líneas RB7 a RB4 se activa la bandera RBIF del
registro INTCON.
19. RBI – CCS COMPILER
Entonces en la subrutina de interrupción se deberá hacer
el tratamiento respectivo para identificar cual de los
pines se activó.
En Lenguaje C, la interrupción se activa con
enable_interrupts(INT_RB) y la subrutina de
tratamiento de la interrupción se llama con INT_RB.
20. RBI – CCS COMPILER
En caso que se estén atendiendo varias interrupciones,
el compilador C, también tiene la directiva #priority que
sirve para fijar la prioridad de las interrupciones, así, las
interrupciones más importantes están son listadas al
principio.
Por ejemplo:
#priority ext, rbi; //la interrupción RB0/INT será
atendida antes de RBI.
21. PRÁCTICA
Enunciado: Se conectan 4 pulsadores a RB4, RB5,
RB6 y RB7 y una LCD al puerto D. Se realiza un
contador automática que dependa de la detección de
cambio de estado en cada pin RBI, de acuerdo al
siguiente detalle: +1, -1, -10, +10.
24. TIMER 0 - RTCC
Luis David Narváez
Una de las labores más habituales en los programas
de control de dispositivos suele ser determinar
intervalos concretos de tiempo, y recibe el nombre
de temporizador (timer) el elemento encargado de
realizar esta función.
También suele ser frecuente contar los impulsos que
se producen en el exterior del sistema, y el elemento
destinado a este fin se llama contador.
25. TIMER 0 - RTCC
Luis David Narváez
TMR0 es un contador/temporizador de 8/16 bits.
Se puede leer y escribir.
Puede trabajar con reloj interno o con señal de reloj
externa.
Selección del flanco en el reloj externo.
Predivisor de frecuencia de reloj programable por
software de 8 bits.
Interrupción opcional en el desbordamiento.
26. TEMPORIZACIÓN TIMER 0
El tiempo empleado en una temporización se puede
calcular a partir de un ciclo de instrucción (es decir una
instrucción por cada ½ microsegundo, si se trabaja con
un cristal HS de 8 MHz), también necesitamos el valor del
Divisor de Frecuencia (el que seleccionamos con los
bits PS2, PS1 y PS0), y finalmente con el complemento
del valor cargado en TMR0 (es decir 65536-TMR0), la
ecuación que nos permite realizar el cálculo es la que
sigue:
Temporización = Ciclo de instrucción * (65536 -
TMR0) * Divisor de Frecuencia
27. TEMPORIZACIÓN TIMER 0
Se desea una temporización de 100 ms (100 milisegundos), con un
HS de 8 MHz., y que además seleccionamos como Divisor de
frecuencia 256 (es decir PS2,PS1,PS0 = 1,1,1). La pregunta, sería
¿Cuál es el valor que se debe cargar enTMR0?
Despejando
65536-TMR0 =Temporización(en microsegundos)/(1 us/cm* Div. de Frec.)
(cm ciclos máquina) y reemplazando tendremos
65536-TMR0 = 100000 us/(0,5 us/cm * 256)
65536-TMR0 ~ 781 cm
28. TEMPORIZACIÓN TIMER 0
Eso significa que en TMR0 deberemos cargar es:
65536-781=64755
A partir de allí el TMR0 contará los 781 ciclos que
faltan para desbordarse y producir la interrupción, y
el tiempo que tardará en hacerlo es 100ms
aproximadamente.
30. TIMER 0 – PIC C
Luis David Narváez
Escritura en el módulo TMR0
Set_timer0(valor);
Valor: Entero de 8/16 bits
Lectura en el módulo TMR0
Valor=get_timer0();
Valor: Entero de 8/16 bits
31. TIMER 0 – PIC C
Los distintos modos se pueden agrupar mediante el
empleo del símbolo |. Por ejemplo:
Setup_timer_0(RTCC_Div_256|RTCC_Ext_L_to_H);
Nota!!! En ocasiones se emplea RTCC en lugar de
timer0, es decir, set_RTCC es lo mismo que
set_timer0.
32. PRÁCTICA
Enunciado:
Desarrollar un programa que encienda y
apague secuencialmente un LED cada 300ms.
Para la temporización se empleará la
interrupción del TMR0.
33. DESARROLLO
Calcular la carga del TMR0 para 10 ms con un
divisor de frecuencia de 256 (Prescaler de 256)
Entonces usaremos un registro auxiliar con un
contenido de 30 para obtener los 300ms.
Carga Registro Auxiliar con 30 para obtener los
300ms de temporización.
Bucle infinito en el programa principal.
34. DESARROLLO
Para la subrutina de interrupción, tenemos:
Recarga del TMR0 con su valor correspondiente para
obtener una temporización de 10ms.
Disminuir (aumentar) el Contador Auxiliar hasta
obtener los 300ms.
Verificar el estado del LED. Si está apagado lo enciende y
viceversa.
Mantener en ese estado (prendido o pagado) durante
300ms.
Regresar al programa principal.
38. PRÁCTICA
Enunciado:
Desarrollar un programa que encienda y
apague secuencialmente tres LEDs cada
500ms, 1 seg. y 1,5 seg. Para la temporización
se empleará la interrupción del TMR0, TMR1,
TMR3
40. EL TMR0 COMO CONTADOR DE
EVENTOS EXTERNOS
Práctica:
Enunciado:
Se desea realizar un programa que cuente los pulsos
provenientes por el pin RA4 mediante el TMR0 configurado
como contador, y el TMR1 como base de tiempo de 1s.
(Frecuencímetro)
De esta manera se visualizará la frecuencia en una LCD.