LAB 9 - Funcionamiento de los Timer en el PIC
CURSO DE PROGRAMACIÓN DE MICROCONTROLADORES PIC
PARTE A: Programación de Microcontroladores PIC de MICROCHIP.
FUNCIONAMIENTO DE LOS TIMER EN EL PIC
CAPACIDAD TERMINAL
Utilizar al microcontrolador en aplicaciones de control electrónico.
Desarrollar y ejecutar programas en un microcontrolador PIC
Programar y configurar interfaces básicas del microcontrolador.
COMPETENCIA ESPECIFICA DE LA SESION
Conocer el funcionamiento y la configuración del Timer cero
Aplicar estos conocimientos en la realización de un cronómetro.
CONTENIDOS A TRATAR
Funcionamiento de los Timer en un PIC
Programa de aplicación con Timer 0.
RESULTADOS
Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.
MATERIALES Y EQUIPO
CCS Compiler instalado.
Entrenador de PICS
PIC16F877A
Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
PC con Software de simulación.
MARCO TEÓRICO:
Según la hoja técnica del PIC 16F877A, este tiene 3 TIMERS o temporizadores. (https://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf (Enlaces a un sitio externo.)) .
El microcontrolador PIC16F887 tiene 3 temporizadores:
Timer 0 (8 bits)
Timer 1(16 bits)
Timer 2(8 bits)
A pesar del Timer 0 ser de 8 bits es el temporizador principal. Un Timer es básicamente un registro conectado a un contador de tal manera que funciona como un CRONÓMETRO, cuya velocidad de cuenta depende de la frecuencia del cristal del PIC y de los divisores de frecuencia configurados, llamados PREESCALER y POSTESCALER.
pero….¿Que es un preescalador?
Un preescalador o preescaler como lo pudimos observar en los valores anteriores predefinidos en el PIC C Compiler, es simplemente la velocidad del microcontrolador dividido por algún número de potencia 2 (2, 4, 8, 16, 32, 64, 128, 256)
El Timer0 pic también llamado RTCC se puede cargar con un valor cualquiera entre 0 y 255 y puede ser incrementado a través del Reloj interno y dividido por un valor que se puede escoger entre los que se indican a continuación. Esto se conoce como el valor del preescalador (Valor de Preescaler):
1
2
3
4
RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8,
RTCC_DIV_16, RTCC_DIV_32,
RTCC_DIV_64, RTCC_DIV_128,
RTCC_DIV_256.
Desborde del TIMER PIC
La interrupción RTCC o timer PIC se produce cada vez que el contador TIMER0 pasa de 255 para 0.
Si se trabaja el Microcontrolador con un cristal de 4 Mhz, esta frecuencia se divide internamente por 4, es decir realmente trabaja a 1Mhz, o sea que cada ciclo de reloj dura aproximadamente 1 microsegundo.
Para entender el funcionamiento del Timer 0, como ejemplo se supone que se necesita generar una interrupción cada 20 ms. (20.000 microsegundos).
Para entender el funcionamiento de forma práctica, realizar el siguiente proyecto:
DIAGRAMA ESQUEMÁTICO:
CÓDIGO DE PROGRAMACIÓN EN PIC C COMPILER:
// TIMER 0
#include <16f877a.h> // Incluimos archivo con PIC a utilizar
#device adc=8 // Utilizamos 8 bits de RESOLUCION de lectura
#use delay (clock=20M) // Indicamos al compilador que trabajaremos a 20Mhz
#fuses HS, NOPROTECT, NOWDT // Configuración básica de los fusibles
#include <lcd.c> // Incluimos librería para manejar Pantalla LCD
int centesimas=0,segundos=0,minutos=2;
#int_TIMER0 // FUNCION DE INTERRUPCION POR
void TIMER(VOID) // DESBORDAMIENTO DEL TIMER 0
{
++centesimas; // incrementar una centésima
if (centesimas>99)
{
++segundos; // si llegamos a 100, incrementar un segundo
centesimas=0;
}
if (segundos>59)
{
++minutos; // si llegamos a 60, incrementar un minuto
segundos=0;
}
if (minutos==3) // si llegamos a 3 minutos, hacer alguna acción
{
minutos=0;
disable_interrupts (INT_TIMER0); //habilita interrupcion de timer0
// agregar cualquier otra acción necesaria.
}
set_timer0 (61); //reinicar cuenta desde 61
}
void main ()
{
lcd_init () ; // Inicializamos pantalla LCD
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //configuracion del timer0
set_timer0 (61); // interrupción cada centésima
enable_interrupts (INT_TIMER0); //habilita interrupcion de timer0
enable_interrupts (GLOBAL); //todas las interrupciones activadas
printf (lcd_putc, "\f***CRONOMETRO***") ; // Mandamos mensaje por única vez
WHILE (true)
{
lcd_gotoxy(2,2);
Printf(lcd_putc,"Tiempo %02u:%02u",minutos, segundos);
}
}
VIDEO EXPLICATIVO:
No hay comentarios:
Publicar un comentario