Timer1 PIC


Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

timer1 pic pic16f877aEn este caso se verá el uso del timer1 PIC como contador y como temporizador, en lo que sigue se comentará para el caso del PIC16F877A por lo que es muy importante que se tenga a mano la hoja  de datos del PIC16F877A, para el caso de utilizar algún otro microcontrolador PIC el procedimiento será muy similar a lo aquí comentado, la programación se realizará con el XC8.

El timer1 PIC es un temporizador contador de 16 bits, el registro TMR1 es el temporizador contador timer1 PIC en si, es donde se guardan los valores del timer1 PIC, cuando es utilizado como temporizador, sus valores aumentaran de uno en uno entre 0 y 65535 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 TMR1 aumentará en una unidad cada 1us, si el registro TMR1 se incrementa en 100 unidades habrán transcurrido 100us; cuando es utilizado como contador el temporizador timer1 PIC 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 timer1 PIC, este pin es identificado como T1CKI que en el PIC16F877A es el pin15 o RC0, esto puede variar de acuerdo al microcontrolador PIC utilizado, pero siempre se llamará T1CKI.

El registro TMR1 del timer1 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 timer1 PIC cuando alcanza su valor máximo de 65535 se reinicia, volviendo a incrementar sus valores de 0 a 65535, además cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo cual se decide por programa.

Timer1 AVR como contador

Para el PIC16F877A el registro TMR1 del timer1 PIC está formado por 16 bits por lo que se puede contar desde 0 hasta 65535, al utilizar timer1 PIC como contador este no aumentará sus valores o su cuenta con cada ciclo de instrucción, en este caso el timer1 estará conectado al pin T1CKI por donde se le hará llegar una señal, la cual al cambiar de estado de un bajo a un alto, esto es por flanco de subida, hará que el timer1 PIC se incremente en una unidad, estos incrementos en su cuenta serán siempre por cada flanco de subida, por ejemplo cada vez que la señal que llega al pin T1CKI pase de un bajo a un alto o de 0 a 1, el registro TMR1 aumentará 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 TMR1 no aumentará su valor o no se incrementará.

La programación del Timer1 PIC como contador se hace mediante el bit1 o el bit TMR1CS del registro T1CON.

timer1 PIC t1con

Los bits 7 y 6 no se utilizan por lo que se les pone a 0.

Los bits 5 y 4 son para elegir un prescaler, mediante las combinaciones de estos bits se pueden elegir los prescaler 1, 2, 4 u 8.

El bit3 es para cuando se quiere conectar un oscilador independiente al timer1 PIC, este ocilador se debe colocar entre el pin T1OSO (pin 15) y el pin T1OSI (pin16) para esto hay que poner este bit a 1.

El bit2 es para hacer que el timer1 PIC cuando es programado como contador trabaje en forma sincronizada con el sistema interno del pic.

El bit1 (TMR1CS), con este bit se elige si el timer1 PIC será utilizado como contador o como temporizador, al poner este bit a 1 TMR1CS=1 se elige la opción de utilizar el timer1 PIC como contador, al ponerlo a 0 se elige la opción de utilizarlo como temporizador, el aumento en las cuentas del timer1 PIC será siempre por flanco de subida de la señal en el pin T1CKI.

El bit 0 (TMR1ON) al poner este bit a 1 se habilita el uso del timer1 PIC, cuando este bit está a 0 el timer1 PIC estará desactivado.

timer1 pic t1con descripción

Timer1 PIC  como contador ejemplo

El circuito utilizado es el que se muestra en la siguiente imagen, la señal  que ingresa por el pin T1CKI se genera con la ayuda de un fotorresistor, cada vez que el fotorresistor disminuya su valor al pin T1CKI le llegará un alto, esto es un flanco de subida, lo que provocará que el registro TMR1 aumente en una unidad, la cuenta del timer1 PIC irá desde 0 hasta 65535, se verá de forma indirecta los valores del timer1, se hará que cada vez que el timer1 aumente en 8000 unidades se encienda un led del puerto b, se empezará con los leds del puerto b totalmente apagados.

Se utilizará un led mas conectado al pin RD1 se hará que este led esté en contacto con el fotorresistor para que sea este el que genere los altos y bajos que llegarán al  pin T1CKI, con lo que en cada flanco de subida se incremente el valor del registro TMR1, el led se hará parpadear cada 20ms.

La programación será hecha en el XC8 porque este permite trabajar directamente con los registros, de esta manera se puede uno familiarizar mas con el microcontrolador PIC

timer1 pic como contador circuito

Configuración del registro T1CON para el ejemplo

Los bits 7 y 6 no se utilizan por lo que se les pone a 0, el prescaler será de 1 para que los valores del registro TMR1 se incrementen en una unidad en cada flanco de subida que ocurra en el pin T1CKI, por lo que los bits5 y 4 se pondrán a 0, no se usará ningún oscilador externo por lo que el bit3 se pondrá a 0, el conteo será en forma asíncrona por lo que el bit2 se pondrá a 1, el bit1 se pondrá a 1 porque se utilizará el timer1 PIC en modo contador y el bit0 se pondrá a 1 para habilitar el timer1 PIC.

Luego el registro T1CON en el XC8 quedará así:

T1CON=0b00000111;// timer1 pic como contador asíncrono

El programa realizado en el MPLAB XC8 para el uso del timer1 pic como contador es el siguiente:

La siguiente es la imagen del circuito de prueba para el uso del timer1 PIC como contador, se puede ver el led que está en contacto con el fotorresistor.

temporizador timer1 imagen circuito

Temporizador contador PIC: Timer1 como temporizador.

Se verá en este caso el uso del temporizador contador pic timer1 como temporizador, normalmente el registro TMR1 del timer1 PIC irá aumentando su valor en una unidad 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 para el que cada ciclo del oscilador será de 0,25us, entonces cada ciclo de instrucción tardará 4 veces este valor, es decir 4*(0,25us) lo que viene a ser 1us, a esto se le llama ciclo máquina TCM=4/Fosc, entonces el registro TMR1 aumentará en una unidad en cada microsegundo cuando el oscilador es de 4Mhz.

Como el registro TMR1 es de 16 bits este aumentará desde 0 o desde algún valor que se le ponga como valor inicial hasta un máximo de 65535, por ejemplo si va desde 0 hasta 65535 habrán transcurrido 65535us luego volverá a 0 pero en esa vuelta a 0 transcurre 1us mas, por lo cual en ir de 0 a 65535 y volver a 0 transcurren 65536us; 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 TMR1 aumente su valor en una unidad.

El temporizador contador pic TMR1 cuenta con lo que se conoce como prescaler esto hace que la frecuencia del oscilador FOSC se divida por este prescaler, con lo que se logra que el timer1 pic tarde un poco mas en aumentar su valor en una unidad; el prescaler puede tomar el valor de 1, 2, 4 o 8; estos valores se eligen programando los bits 4 y 5 del registro T1CON.

timer1 registro t1con

En la siguiente tabla se puede ver las combinaciones de los bits 5 y 4 para obtener los diferentes valores de los prescaler para el timer1 PIC.

timer1 registro t1con 2

Si el prescaler elegido es por ejemplo de 8 y la FOSC=4Mhz, entonces la frecuencia de trabajo del temporizador Ftemp será de Ftemp=FOSC/(4*prescaler), el tiempo  que tardará ahora el temporizador en aumentar una unidad será la inversa de este valor lo cual se conoce como periodo del temporizador Ttemp=(4*prescaler)/(FOSC) por lo que en este caso Ttemp=(4*8)/(4Mhz) de donde Ttemp=8us, esto quiere decir que ahora el temporizador aumentará en una unidad cada 8us y en este caso entonces el registro TMR1 para ir de 0 a 65535 tardará 65535*Ttemp=65535*8us lo que es igual a 524280us=524,28ms así para los demás prescaler.

Al utilizar los prescaler se tiene la ventaja de lograr temporizar tiempos mas largos pero muchas veces se vuelven demasiado largos si el registro TMR1 se inicia a 0, por lo cual para lograr las temporizaciones que se quieren por ejemplo de 500ms se tendría que utilizar un prescaler adecuado e iniciar el registro TMR1 a un valor también adecuado.

Utilizando una regla de 3 simple se llega a la siguiente ecuación que ayudará a encontrar el valor inicial adecuado a cargar en el registro TMR1 para obtener las temporizaciones buscadas.

TMR1=216-Tretardo*(Fosc/(4*prescaler))-1

Donde TMR1 es el valor inicial a cargar en este registro para obtener la temporización buscada, 216 porque el timer1 PIC es de 16 bits, Tretardo es el tiempo que se quiere obtener con el temporizador, Fosc es la frecuencia del oscilador o del cristal utilizado, y prescaler será el prescaler elegido según la tabla anterior.

Por ejemplo si se quiere temporizar 500ms, en este caso 500ms sería el tiempo de retardo, y si el microcontrolador PIC trabaja con un oscilador de 4Mhz, habrá que elegir entre los posibles prescaler que se tienen, reemplazar en la ecuación anterior y ver si el número obtenido esta entre 0 y 65535, de ser así la elección del prescaler es correcta, de lo contrario habrá que utilizar otro, por ejemplo si se elige un prescaler de 8 se tendría:

TMR1=65535-(500ms)(1Mhz)/8 -1

TCNT1=3035

El valor obtenido está entre 0 y 65535 por lo que 3035 sería el valor inicial a cargar en el registro TMR1 para obtener una temporización de 500ms con el timer1 PIC, esto quiere decir que si se inicia el timer1 PIC con 3035 y un prescaler de 8, cuando aumente su valor de 3035 a 65535 habrán transcurrido 500ms.

Los resultados obtenidos serán usados en el ejemplo de la utilización del timer0 pic como temporizador.

Este proceso será el que se seguirá cuando se utilice el timer1 AVR como temporizador.

La programación del Timer1 PIC como temporizador se hace mediante el bit1 o el bit TMR1CS del registro T1CON.

timer1 PIC t1con

Los bits 7 y 6 no se utilizan por lo que se les pone a 0.

Los bits 5 y 4 son para elegir un prescaler, mediante las combinaciones de estos bits se pueden elegir los prescaler 1, 2, 4 u 8.

El bit3 es para cuando se quiere conectar un oscilador independiente al timer1 PIC, este ocilador se debe colocar entre el pin T1OSO (pin 15) y el pin T1OSI (pin16) para esto hay que poner este bit a 1.

El bit2 es para hacer que el timer1 PIC cuando es programado como contador trabaje en forma sincronizada con el sistema interno del pic, en el modo temporizador no se toma en cuenta.

El bit1 (TMR1CS), Al poner este bit a 0 se elige la opción de utilizar el timer1 PIC como temporizador, al ponerlo a 1 se elige la opción de utilizarlo como contador.

El bit 0 (TMR1ON) al poner este bit a 1 se habilita el uso del timer1 PIC, cuando este bit está a 0 el timer1 PIC estará desactivado.

timer1 pic t1con descripción

Timer1 PIC  como temporizador ejemplo

El circuito de ejemplo utilizado para ver el uso del timer1 PIC como temporizador es el siguiente, se hará cambiar el estado del pin RB7 cada 500ms, se utilizarán los resultados obtenidos cuando se comento sobre el prescaler del timer1 PIC, se obtuvo que para temporizar 500ms se utiliza el prescaler de 8 y el registro TMR0 se tiene que cargar en un inicio con 3035, esto es TMR0=3035.

La programación será hecha en el XC8 porque este permite trabajar directamente con los registros, de esta manera se puede uno familiarizar mas con el microcontrolador PIC

temporizador contador pic timer0 como temporizador

Configuración del registro T1CON para el ejemplo

Los bits 7 y 6 no se utilizan por lo que se les pone a 0, el prescaler será de 8 por lo que los bits5 y 4 se pondrán a 1, no se usará ningún oscilador externo por lo que el bit3 se pondrá a 0, el bit2 se pone a 0 porque en el modo temporizador no se toma en cuenta, el bit1 se pondrá a 0 porque se utilizará el timer1 PIC en modo temporizador y el bit0 se pondrá a 1 para habilitar el timer1 PIC.

Luego el registro T1CON en el XC8 quedará así:

T1CON=0b00110001;// timer1 pic como temporizador prescaler de 8

El programa realizado en el MPLAB XC8 para el uso del timer1 pic como temporizador es el siguiente:

El uso del timer1 PIC como temporizador es mucho mas eficaz si se utiliza mediante las interrupciones, este tema se ve en la sección de interrupciones con el PIC.

Si he logrado ayudarte en cuanto al uso del timer1 PIC como contador y temporizador comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0