PROGRAMACIÓN DE MICRO-CONTROLADORES PIC
MANEJO DE TIMER Y LAS INTERRUPCIONES
1. Objetivos:
2. Materiales:
- Conocer el funcionamiento y la configuración de las Interrupciones
- Conocer el funcionamiento y la configuración del Timer cero
- Aplicar estos conocimientos en la realización de un cronómetro.
2. Materiales:
- CCS Compiler instalado.
- Entrenador de PICS
- Pantalla LCD
- PIC16F877A
- Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
- PC con Software de simulación
3. MARCO TEÓRICO:
3.1 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.2 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.
4. VÍDEO EVIDENCIA:
- Explicación del programa:
- Implementación en el entrenador:
5. 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.
- Se empleó el Timer0 para crear una base de tiempo de fracción de segundo que gradualmente iba incrementando una variable equivalente a la centena de un segundo, para así terminar formando un temporizador que trabaja con una precisión muy cercana al segundo real.
- Debido a la declaración "%02u" separamos los espacios necesarios para escribir los datos de minutos y segundos en valores enteros ya que trabajamos con tiempos.
6. CONCLUSIONES:
- Se concluye que los micro-controladores pueden también emplear interrupciones de diversas prioridades, siendo que las de más alta prioridad pueden interrumpir a las menores, pero, las menores no pueden terminar la ejecución de una mayor puesto a que la bandera que permite la ejecución de estas es puesta a "0" lógico después de la ejecución de una interrupción de mayor prioridad.
- Se empleó el TIMER0 tanto como temporizador y como contador, debido a que realiza un conteo el cual es un registro de 8 bits y trabaja directamente con el clock del PIC, aveces siendo necesario solamente ciertas configuraciones para obtener valores muy cercanos al tiempo real.
- Concluimos que las interrupciones sirven para llamar la desviar la atención del micro-controlador PIC mientras este se encuentra realizando un proceso o una serie de sentencias, y estas son necesarias para realizar una tarea que es de mayor prioridad que el resto 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.
- Se concluye que 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.

No hay comentarios:
Publicar un comentario