Mar 242015
 
9. Timer
5 (100%) 1 vote

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 Timer 0 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:

 

 

La interrupción RTCC 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).

 

¿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 microsegundos es:

CargaT=\dfrac{Tiempo\hspace{0.2cm}en\hspace{0.2cm}microsegundos}{Valor\hspace{0.2cm}de\hspace{0.2cm}division}=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 y cada vez que el Timer 0 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{Tiempo\hspace{0.2cm}en\hspace{0.2cm}microsegundos}{Valor\hspace{0.2cm}de\hspace{0.2cm}division}=\dfrac{20000ms}{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 o RTCC es 246 y que mi contador debe contar hasta 250.

Ejemplo  Timer de 1 segundo.

Para un retardo de un segundo, con preescaler de 256, se procede de la siguiente manera:

Paso el tiempo a microsegundos:

1 segundo = 1000000 microsegundos

CargaT=1000000/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.

1000000/256 = 3906.25 aproximadamente 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, 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).

 EJEMPLO 1

Realizar un temporizador de 0 a 60 segundos

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.

Comparte en Redes Sociales

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




  One Response to “9. Timer”

  1. Gracias gracias gracias me gustan tus tutoriales

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

(required)

(required)