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.
FUNDAMENTO TEÓRICOS
A. TIMER0 PIC
El timer0 Pic es un temporizador contador de 8 bits, el registro TMR0 es el temporizador contador timer0 PIC, cuando es utilizado como temporizador sus valores aumentaran de uno en uno entre 0 y 255 con cada 4 ciclos del reloj, cabe destacar que cada ciclo de instrucción del microcontrolador PIC es realizado en 4 ciclos de reloj.
El registro TMR0 del timer' PIC puede ser leido 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 en la programación.
B. TIMER0 AVR: CONTADOR
Para el PIC 16F877A el registro TMR0 del timer0 PIC esta formador por 8 bits por lo que se puede contar desde 0 hasta 255, al utilizar timer0 PIC como contador este no aumentara sus valores o su cuenta con cada ciclo de instrucción, en este caso el timer0 estará conectado al pin TOCKI por donde se le hara llegar una señal, la cual al cambiar de estado hara que el timer0 PIC se incremente en una unidad, estos incrementos en su cuenta pueden ser por cada flanco de subida o cada por flanco de bajada de la señal, el flanco a utilizar se elige por programa, por ejemplo se elige el flanco de subida, quere decir que cada vez que la señal que llega al pin T0CKI pase de un bajo a un alto o de 0 a 1, el registro TMR0 aumentara en una unidad, de esta manera se le puede utilizar como contador , cuando la señal pase de un alto a un bajo o de 1 a 0 el registro TMR0 no aumentara su valor o no se incrementara.
FUENTE: MRELBERNI
¿QUÉ BITS SE UTILIZAN?
-> Bit 7: al poner este bit a ' se activan unas resistencia pull up internas que el micrcontrolador tiene en el puerto B.
-> Bit 6: es para cuando se utilice una interrupción externa por el pin INT, con este bit se elige si se quiere que la interrupción sea por flanco de subida o por flanco de bajada.
-> Bit5 TOCS este es el bit que en este caso interesa, al poner este bit a 1 se elige utilizar el timer0 PIC como contador, si se le pone a ' se elige utilizar el timer0 PIC como temporizador
-> Bit4 T0SE con este bit se elige si se quiere que el timer0 PIC cuente por flanco de subida, esto es cuando la señal que llega por el pi T0CKI pase de 0 a 1, o que cuente por flanco de bajada
-> Bit 3: es para utilización del prescaler para el timer 0, el prescaler se le puede asignar al timer0 o al WDT mediante este bit
-> Bit 2,1,0 son para elegir el prescaler a utilizar mediante las combinaciones de esots bits se tienen diferentes valores para el prescaler, el que a su vez dependerá de a quien se la ha asignado el prescaler mediante el bit3, como se puede observar en la imagen.
C. TIMER0 AVR: TEMPORIZADOR
El timer0 Pic como temporizador normalmente se utilizar el TMR0 del timer0 PIC ira 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 sera de 0.25us, luego cada ciclo de instrucción tardara 4 veces este valor, es decir 4*(0.25us) lo que viene a ser 1us, a esto se le conoce como ciclo máquina Tcm= 4/Fosc, entonces el registro TMR0 aumentará en una unidad cada microsegundo cuando el oscilador es de 4Mhz.
Entonces como el registro TMR0 es de 8 bits este aumentara 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 a 1us mas, por lo que en ir de 0 a 255 y volver a 0 transcurren 256us.
El temporizador contador PIC TMR0 cuenta con 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 timer0 PIC para el PIC16F877A puede tomar el valor 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
FUENTE: MRELBERNI
¿QUÉ BITS SE UTILIZAN?
-> Bit 7: al poner este bit a ' se activan unas resistencia pull up internas que el micrcontrolador tiene en el puerto B.
-> Bit 6: es para cuando se utilice una interrupción externa por el pin INT, con este bit se elige si se quiere que la interrupción sea por flanco de subida o por flanco de bajada.
-> Bit5 TOCS este es el bit que en este caso interesa, al poner este bit a 1 se elige utilizar el timer0 PIC como contador, si se le pone a ' se elige utilizar el timer0 PIC como temporizador
-> Bit4 T0SE con este bit se elige si se quiere que el timer0 PIC cuente por flanco de subida, esto es cuando la señal que llega por el pi T0CKI pase de 0 a 1, o que cuente por flanco de bajada
-> Bit 3: es para utilización del prescaler para el timer 0, el prescaler se le puede asignar al timer0 o al WDT mediante este bit
-> Bit 2,1,0 son para elegir el prescaler a utilizar mediante las combinaciones de esots bits se tienen diferentes valores para el prescaler, el que a su vez dependerá de a quien se la ha asignado el prescaler mediante el bit3, como se puede observar en la imagen.
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
https://youtu.be/0hTHlXRm3AI
Comentarios
Publicar un comentario