9 Timer0 - Borxo/Programming-PIC-Microcontrollers-Tutorial GitHub Wiki

TIMER0

Se trata del temporizador/contador, más sencillo que tienen los microcontroladores PIC. Su configuración es muy sencilla y fácil de usar, una de las ventajas que tiene este Timer0, es la variedad de utilidades que tienen.

Características Timer0

Temporizador/contador de 8 bits (255).

  • Prescaler de 8bit independiente (PIC16f1936), en algunos PIC es compartido con Watch Dog.
  • Fuente de reloj interna o externa programable.
  • Selección de flanco de reloj externo programable.
  • Salta la interrupción por desbordamiento del Timer0.
  • Se puede usar como reloj del Timer1.

Dependiendo de la gama del microcontrolador puede tener mas o menos utilidades.

Registro de Configuración

En el registro OPTION_REG se encuentran los bit’s necesarios para la configuración del Timer0. Donde se podrá configurar el tipo de flanco, el reloj que va utilizar, el prescaler..etc . Por medio del registro TMR0 de 8 bit, realizara la cuenta haciendo que ha cada ciclo de reloj se incremente el resultado de tal registro.

Registro Option_REG

WPUEN (Bit Habilitación de las resistencias de Pull-Up del puerto B)

  • 1 -Deshabilitadas las resistencias Pull-Up.
  • 0 -Habilitación de las resistencias de Pull-Up, según la configuración del registro WPUB.

INTEDG (Bit selección de flanco en la interrupción externa)

  • 1 -Interrupción por flaco de subida en el pin INT.
  • 0 -Interrupción por flanco de bajada en el pint INT.

TMR0CS (Bit Selección de reloj para Timer0)

  • 1 -Reloj externo conectado por el pin T0CKL.
  • 0 -Reloj de instrucciones (FOSC/4).

TMR0SE(Bit Selección de flanco para T0CKL)

  • 1 -Flanco ascendente.
  • 0 -Flanco descendente.

PSA (Bit Asignación del prescaler)

  • 1 -El prescaler no se asigna a Timer0.
  • 0 -El Prescaler se le asigna al Timer0.

PS<2:0> (Bits Selección del valor del prescaler)

¡IMPORTANTE!. Se debe configurar el bit T0XCS del registro CPSCON0 a 1, cuando se utiliza en MODO CONTADOR.

Cálculo del Timer0

En muchos casos será necesario saber el tiempo que va a tardar en desbordarse el Timer0, para ello se debe utiliza una sencilla formula:

El tiempo del Timer0 se obtiene multiplicando el prescaler por la diferencia entre el valor máximo del TMR0 y el valor inicial del contador y se suma el delay 2 dos ciclos de trabajo, este resultado se suma por el reloj de instrucciones.

Hay que recordar que el reloj de instrucciones es dividiendo la frecuencia del oscilador que se utilice por 4.

Para hallar el 2TCY, se debe calcular la frecuencia del reloj de instrucciones (FOSC/4), después pasarlo a una unidad de tiempo y multiplicarlo por dos.

Cuando se utiliza el Timer0 en modo contador, el calculo se puede realizar de la misma manera, pero cambiando el valor del reloj de instrucciones por el valor de la señal de reloj externa. Ha esta señal, no se divide por 4, ya que es totalmente ajena al reloj de instrucciones.

Modos

Modo Contador

Explicación

El Timer0 puede funcionar como contador, utilizando la entrada T0CKI, donde se introduce una señal de reloj y cuando llega un flanco de subida o de bajada, incrementa el Timer0.

Para ello se debe configurar en el registro OPTION_REG el TMR0CS a 1, se configura si se desea incluir prescaler o no al contador, aunque en el esquema anterior no está señalado, en este modo tambien se puede utilizar el prescaler. Para la configuración del prescaler se utiliza el bit PSA, si se pone a 0 el prescaler esta desactivado y si se pone a cero recoge el prescaler configurado con los bit’s PS.

El siguiente bloque Sync 2TCY, sirve para sincronizar el reloj externo con el interno,es decir se crea un delay de 2 ciclos de instrucciones.

El registro TMR0, es la parte fundamental del Timer0, es donde se incrementa y almacena la cuenta que lleva, al ser de 8 bits cuando llega a la cuenta de 255, vuelve a 0 y salta el flag TMR0IF. Este flag permite saber cuando se ha desbordado el Timer0 o activar interrupciones que se explicaran en próximos apartados.

Modo Temporizador

Explicación

El Timer0 se puede configurar como temporizador, haciendo que incremente su valor a cada ciclo del reloj de instrucciones, para ello se configura el bit TM0CS en el registro OPTION_REG a 0 y al igual que en el modo anterior se puede utilizar prescaler o no el cual se asigna con el bit PSA.

Despues pasa por el bloque Sync 2TCY, del mismo modo que en apartado anterior, crea un retardo de 2 ciclos de instrucción y por ultimo incrementa el registro TMR0.

Al igual que el caso del modo temporizador cuando el registro TMR0 llega a 255, el registro vuelve a 0 y hace saltar el flag por desbordamiento.

⚠️ **GitHub.com Fallback** ⚠️