Saltar al contenido
Control Automático Educación

En esta entrada entenderemos como funciona el Timer del PIC, donde veremos que realmente existen diferentes timers o temporizadores dentro de nuestro sistema embebido.

Antes de comenzar la clase, te invito para que veas el

👉👉👉 CURSO GRATIS DE MICROCONTROLADORES PIC

Y te invito a VER LA LISTA DE REPRODUCCIÓN DE YOUTUBE

Timer PIC

El microcontrolador PIC16F887 tiene 3 temporizadores:

  1. Timer 0 (8 bits)
  2. Timer 1(16 bits)
  3. Timer 2(8 bits)

A pesar del Timer 0 ser de 8 bits es el temporizador principal.

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):

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)

Desborde del TIMER PIC

La interrupción RTCC o timer PIC se produce cada vez que el contador TIMER0 pasa de 255 para 0.

Ya hemos trabajado anteriormente nuestros proyectos con cristales de cuarzo. Recordemos lo siguiente:

Todo microcontrolador requiere un circuito externo que le indique la velocidad a la que debe trabajar. Este circuito, que se conoce como oscilador o reloj, es muy simple pero de vital importancia para el buen funcionamiento del sistema. El PIC16F887 puede utilizar cuatro tipos de oscilador diferentes. Estos tipos son:

  • RC. Oscilador con resistencia y condensador.
  • XT. Cristal.
  • HS. Cristal de alta velocidad.
  • LP. Cristal para baja frecuencia y bajo consumo de potencia.

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).

¿Cuando se trabaja con el TIMER del PIC, qué fórmula usar para determinar con que valor se debe cargar inicialmente el Timer 0 y que valor de preescaler o división se debe utilizar?

La fórmula para aplicar es la siguiente recordando que primero debemos pasar el tiempo de temporización a segundos es:

CargaT=\dfrac{Tiempo(s)*F.Oscilador}{4*Valor\ Preescaler}=valor\hspace{0.2cm}del\hspace{0.2cm}timer

Sin embargo se debe tener en cuenta que la interrupción solo se genera cuando el timer pasa de 255 a 0, esto quiere decir que debemos restarle al valor total del timer (256) el valor de carga inicial que tenga el Timer 0:

256 – Valor inicial del Timer 0

Ya habiamos dicho que el valor del Timer 0 puede ser dividido (preescaler) por un valor aplicando alguna de las instrucciones citadas al comienzo del post. Cuando nosotros seleccionemos dicho preescaler o división, se debemos tratar de obtener un valor entero al dividir el tiempo del retardo sobre el preescaler. Este valor no puede ser mayor a 256. En caso de ser mayor, significa que antes de cumplir el retardo el Microcontrolador habrá generado más de una interrupción.

En este caso se combina entonces la programación del Timer 0 PIC y cada vez que el Timer0 PIC genere una interrupción se decrementa un contador tantas veces como sea necesario hasta completar el tiempo de temporización.

Finalmente el procedimiento que se debe seguir para calcular el valor inicial del timer y el valor del contador a decrementar es el siguiente, suponiendo que escogemos un preescaler de 8

CargaT=\dfrac{0.02*4000000}{4*8}=2500

Vemos entonces que se generó un valor mayor a 255, por lo tanto es necesario calcular cuantas veces debe generarse una interrupción (a través de un contador) antes de completar el retardo de 20 milisegundos.

El resultado de la división anterior debe ser igual a:

valor\hspace{0.2cm}del\hspace{0.2cm}timer=Valor\hspace{0.2cm}inicial\hspace{0.2cm}del\hspace{0.2cm}Timer0\times Valor\hspace{0.2cm}del\hspace{0.2cm}contador\hspace{0.2cm}a\hspace{0.2cm}decrementar

2500=valor inicial del timer * valor del contador a decrementar

Vemos que tenemos dos incoginitas, esas dos incognitas pueden ser valores aleatorios inferiores a 256. Por ejemplo: 10 y 250. Aqui puedo escoger cualquiera de los dos valores para que sea el Valor Inicial del Timer (10)

Posterior a esta multiplicación, se hace:

256 – Valor inicial del timer 0

256-10=246

Con esto tengo que mi timer del PIC o RTCC es 246 y que mi contador debe contar hasta 250.

Ejemplo  Timer de 1 segundo.

Para generar un retardo de un segundo usando el timer del PIC, con preescaler de 256, se procede de la siguiente manera:

CargaT=\dfrac{1*4000000}{4*RTCC\_DIV\_X}

X = Este valor puede ser cualquiera de los indicados al principio, el que se elija será con el que se seguirá trabajando en la programación. En este caso el RTCC escogido es 256.

CargaT=\dfrac{1*4000000}{4*256}=3906.25\approx 3906

El valor anterior, es decir 3906 debe ser igual a la multiplicación entre el valor inicial del timer 0
y el valor del contador a decrementar.

3906= valor inicial del timer * valor del contador a decrementar

Observación: estos dos valores son aleatorios y deben ser menores a 256.
3906 = 18 * 217

Cualquiera de estos dos valores pueden ser el valor inicial del timer 0. En este caso, se elige 18 como valor inicial del timer 0. Al obtener el valor inicial del timer 0 se debe restar el RTCC utilizado, en este caso 256 para obtener el número donde el temporizador debe iniciar para que en el momento que incremente las 18 veces llegue al valor del RTCC utilizando (256) y produzca la interrupción ó salto. Es decir:

RTCC – Valor inicial del timer
256 – 18 = 238

Ya con estos valores, tenemos el valor que debemos cargar en el Timer y el valor que debemos cargar en el contador. Quedaría de la siguiente manera:

RTCC=238

Contador=217

Así tendriamos el temporizador para 1 segundo usando el timer del pic, porque el RTCC se carga con 238, cada ciclo de reloj, va incrementando y cuando llega a 256 (Pasados 18 ciclos de reloj), decrementa el contador en 1 unidad, y vuelve y carga el RTCC con 238. Así nuevamente el RTCC va incrementando y cuando llega a 256 vuelve y decrementa en 1 unidad el contador. Cuando el contador por fin llegue a Cero (0), quiere decir que ya paso 1 segundo (1000000 micro segundos).

Timer PIC

 TIMER PIC – EJEMPLO

Realizar un temporizador de 0 a 60 segundos empleando el TIMER del PIC

Multiplexacion con display 7 segmentos

Puedes descargar los archivos de proteus 8 y de CCS C aqui:

>>>>>>>>9. Timer<<<<<<<<

No olvides compartir el contenido en Redes sociales, para que me ayudes a hacer crecer el sitio, y que la información pueda llegarle a mas personas que lo necesiten y quieran aprender sobre este interesante mundo de los microcontroladores. Hasta la próxima.

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (7)

Se puede usar el oscilador interno?

Responder

si se puede

Responder

Buenas amigo sergio muy bueno tu contenido del timer 0 pero se me genero una pregunta.

Al momento que haces el calculo de la variable contador y el valor inicial del tmr0

“””””El valor anterior, es decir 3906 debe ser igual a la multiplicación entre el valor inicial del timer 0
y el valor del contador a decrementar.

3906= valor inicial del timer * valor del contador a decrementar

Observación: estos dos valores son aleatorios y deben ser menores a 256.
3906 = 18 * 217″”””””””

Dices que esos dos valores son aleatorios y que deben ser menores de 256 cada uno y aqui es donde viene mi pregunta.
se sabe que el valor de timer si debe estar entre el valor que dices pero al crear la variable del contador ¿por que dices que debe ser menor a 256?
en el codigo se podria generar como una variable tipo long (de 16bits) y se puede salir del rango que dices.

Amigo tengo esa inquietud

Responder

Hola Luis, lo hice de esa manera solo para evitar confusiones. Pero si, el contador puede ser mayor a 256 desde que lo definas como una variable long. Eso si nunca confundir la carga del Timer0. Saludos!!

Responder

Sergio en la parte de CargaT=(tiempo(s)*Foscilador)/(prescaler*4), puede ser una forma general no crees ya que la formula que das es con respecto a un cristal de 4Mhz en mi caso trabajé con uno de 20, un saludo y gracias por compartir conocimiento.

Responder

Hola Kenso, si tienes razón. Gracias por el aporte. Saludos.

Responder

Gracias gracias gracias me gustan tus tutoriales

Responder