Laboratorio 12: Timer e interrupciones
LABORATORIO 12
PROGRAMACIÓN DE TIMER E INTERRUPCIONES
1. OBJETIVOS
- Conocer el funcionamiento y la configuración de las interrupciones.
- Conocer el funcionamiento y la configuración del TIMER0.
- Aplicar estos conocimientos en la realización de un cronómetro.
2. MARCO TEÓRICO
2.1 Interrupciones
La interrupción, como su nombre lo indica, es la forma que tienen los periféricos de llamar la atención del micro para realizar una tarea urgente o prioritaria.
De esta manera es más práctico trabajar con interrupciones que sólo llaman cuando un evento ocurre, en vez de polling, en donde tenemos que verificar si el evento ocurrió, esto gasta tiempo y recursos de la máquina. La familia PIC16F87XA PIC16F87XA PIC16F87XA PIC16F87XA tiene 15 fuentes de interrupción. Hay un habilitador global GPIE habilitador global GPIE habilitador global GPIE habilitador global GPIE y un habilitador de habilitador de habilitador de habilitador de periféricos PEIE periféricos PEIE periféricos PEIE periféricos PEIE, cada módulo periférico tiene 2 bits asociados, el de habilitación y el de bandera (por ejemplo, módulo TMR0):
- TMR0IF TTMMRR00IIFF TMR0IF TMR0 Interrupt Flag (bandera de interrupción). Se genera (1) cuando ocurre un evento.
- TMR0IE TTMMRR00IIEE TMR0IE TMR0 Interrupt Enable. Habilita la interrupción, se habilita con (1) y, si no está habilitada (0), no genera interrupción aunque haya bandera de interrupción.
2.2 Temporizadores
El timer0 PIC es un temporizador contador de 8 bits, el registro TMR0 es el temporizador contador timer0 en si, es donde se guardan los valores del timer0 PIC, cuando es utilizado como temporizador sus valores aumentaran de uno en uno entre 0 y 255 con cada 4 ciclos de reloj, no olvidar que cada ciclo de instrucción del microcontrolador PIC es realizado en 4 ciclos de reloj, por ejemplo si el oscilador con el que está funcionando el microcontrolador PIC es de 4MHz, entonces el registro TMR0 aumentará una unidad en cada 1us, si el registro TMR0 se incrementa en 100 unidades habrán transcurrido 100us; cuando el timer0 PIC es utilizado como contador el registro TMR0 ya no aumenta su valor de uno en uno en cada 4 ciclos de reloj, sino que lo hará mediante el flanco de subida o el flanco de bajada de alguna señal que llegue a un pin especial del PIC conectado al timer0 PIC, este pin es identificado como T0CKI que en el PIC16F877A es el pin6 o RA4, esto puede variar de acuerdo al microcontrolador PIC utilizado, pero siempre se llamará T0CKI.
El registro TMR0 del timer0 PIC puede ser leído y escrito, puede ser prescalado para que el tiempo en su incremento de valor en una unidad sea mayor, el timer0 PIC cuando alcanza su valor máximo de 255 se reinicia, volviendo a incrementar sus valores de 0 a 255, además cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo que se decide por programa.
Se verá en este caso el uso del timer0 PIC como temporizador, normalmente el registro TMR0 del timer0 PIC irá aumentando sus valores con cada ciclo de instrucción del microcontrolador PIC, y para estos microcontroladores a cada ciclo de instrucción le toma 4 ciclos del oscilador que se esté utilizando, si se usa por ejemplo un cristal de Fosc=4Mhz entonces cada ciclo del oscilador será de 0,25us, luego cada ciclo de instrucción tardará 4 veces este valor, es decir 4*(0,25us) lo que viene a ser 1us, a esto se se conoce como ciclo máquina TCM=4/Fosc, entonces el registro TMR0 aumentará en una unidad cada microsegundo cuando el oscilador es de 4Mhz.
Como el registro TMR0 es de 8 bits este aumentará desde 0 o desde algún valor que se le ponga como valor inicial hasta un máximo de 255, por ejemplo si va desde 0 hasta 255 habrán transcurrido 255us luego volverá a 0 pero en esa vuelta a 0 transcurre 1us mas, por lo que en ir de 0 a 255 y volver a 0 transcurren 256us; no siempre se utiliza una FOSC de 4Mhz esto puede variar, por lo que como consecuencia variará el tiempo que trascurre para que el registro TMR0 aumente su valor en una unidad.
El temporizador contador pic TMR0 cuenta con lo que se conoce como prescaler esto hace que la frecuencia de trabajo FOSC se divida por este prescaler, con lo que se logra que el temporizador contador pic tarde un poco mas en aumentar su valor en una unidad; el prescaler del time0 PIC para el PIC16F877A puede tomar el valor de 1, 2, 4, 8, 16, 32, 64, 128 o 256; estos valores se eligen mediante las combinaciones de los bits 0, 1 y 2 del registro OPTION_REG.
En la siguiente tabla se ve los valores que hay que dar a estos bits para obtener los diferentes valores de los prescaler para el timer0 PIC.
3. VIDEO
4. OBSERVACIONES
- Algunos módulos de entrenamiento al finalizar la cuenta, automáticamente iniciaban una cuenta regresiva desde el valor 258:00. Asi que se optó por subir el programa a un módulo sin este inconveniente.
5. CONCLUSIONES
- El TIMER0 puede ser empleado tanto como temporizador como contador, debido a que cuenta a que es un registro de 8 bits y trabaja directamente con el clock del PIC, así que para emplear tiempos en una programación basta con configurar los valores a contar en el registro y así obtener valores muy aproximados a los tiempos.
- Las interrupciones sirven para llamar la atención del microcontrolador PIC mientras este se encuentra realizando un proceso o una serie de sentencias, y estas son necesarias para realizar una tarea que es de suma prioridad en ese momento.
- Para obtener un valor de centésima, se empleo la cuenta desde el valor 61 hasta el 255 del registro propio del TIMER0.
- La diferencia en el código entre un cronómetro ascendente y uno descendente se basa en que al llegar las centésimas a 100 los segundos deben aumentar en 1 para ascendente mientras que este debe reducirse en 1 para el descendente. Para el valor de minutos, si los segundos llegan a 59 este aumenta en ascendente, y si llegan a 00 este disminuye para cronómetro descendente.


Comentarios
Publicar un comentario