sábado, 15 de agosto de 2020

lab 9

 
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:

diagrama LCD.png

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