El TIMER0 - UMHcoolab.umh.es/sea/microcontroladores_old_0809/tema11...; Como el PIC trabaja a una...

26
1 Tema 11 El TIMER0

Transcript of El TIMER0 - UMHcoolab.umh.es/sea/microcontroladores_old_0809/tema11...; Como el PIC trabaja a una...

1

Tema 11

El TIMER0

2

Tema 11. TIMER 0

Un timer se implementa por medio de un contador que determina un tiempo preciso entre el momento en que el valor es cargado y el instante en el que se produce su desbordamiento.

Básicamente, un temporizador consiste en un contador ascendente (tb podría ser descendente) que, una vez inicializado con un valor, su contenido se incrementa con cada impulso de entrada hasta llegar a su valor máximo b’11111111’, desbordando y volviendo a comenzar desde cero

EL TIMER o TEMPORIZADOR

3

Tema 11. TIMER 0

ESQUEMA SIMPLIFICADO DEL TIMER

Contador Ascendente

Carga inicial del contador

Fin del contaje

(T0IF)

Impulsos de entrada

4

Tema 11. TIMER 0

El PIC16F84 dispone de un timer principal denominado Timer0o TMR0 que es un contador ascendente de 8 bits.

El TMR0 se inicializa con un valor, que se incrementa con cada impulso de entrada hasta su valor máximo b’11111111’, con el siguiente impulso de entrada el contador se desborda pasando a valer b’00000000’, circunstancia que se se advierte mediante la activación del flag de fin de contaje T0IF localizado en el registro INTCON.

EL TIMER 0

5

Tema 11. TIMER 0Registro especial INTCON

flag de fin de contaje T0IF

6

Tema 11. TIMER 0

Los impulsos aplicados al TMR0, pueden provenir de los pulsos aplicados al pin T0CKI o de la señal de reloj interna (Fosc/4), lo que le permite actuar de dos formas diferentes:

• Como contador de los impulsos externos que le llegan por el pin RA4/T0CKI

• Como temporizador de tiempos

El actuar de una u otra forma depende del bit T0CS del registro OPTION:

• Si T0CS=1, el TMR0 actúa como contador.• Si T0CS=0, el TMR0 actúa como temporizador.

EL TIMER 0

7

Tema 11. TIMER 0Registro especial OPTION

Selecciona contador/temporizador

8

Tema 11. TIMER 0

Cuando el TMR0 trabaja como contador se le introducen los impulsos desde el exterior por el pin RA4/T0CKI (TMR0 External Clock Input). Su misión es “contar” el número de acontecimientos externos representados por los impulsos que se aplican al pin T0CKI.

El tipo de flanco activo se elige mediante el bit T0SE del registro OPTION:

• Si T0SE=1, el flanco activo es descendente• Si T0SE=0, el flanco activo es ascendente

TMR0 como CONTADOR

9

Tema 11. TIMER 0

Cuando el TMR0 funciona como temporizador cuenta los impulsos de FOSC/4. Se usa para determinar intervalos de tiempo concretos.

Para una frecuencia de reloj igual a 4 MHz el TMR0 se incrementa cada 1 microsegundo.

Para una frecuencia de reloj igual a 8 MHz el TMR0 se incrementa cada medio microsegundo.

TMR0 como TEMPORIZADOR

10

Tema 11. TIMER 0

Como se trata de un contador ascendente el TMR0 debe ser cargado con el valor de los impulsos que se desean contar restados de 256 que es el valor de desbordamiento. Por ejemplo, para contar 4 impulsos, se carga el TMR0 con 256-4=252.

TMR0 como TEMPORIZADOR

11

Tema 11. TIMER 0

TMR0 es un registro del SFR

TMR0 es un registro ubicado en la posición 1 del área SFR de la RAM de datos. Puede ser leído y escrito al estar conectado directamente al bus de datos.

12

Tema 11. TIMER 0

TMR0 es un registro del SFR

13

Tema 11. TIMER 0

DIVISOR DE FRECUENCIA (PRESCALER)

A veces es necesario controlar tiempos largos y aumentar la duración de los impulsos que incrementan el TMR0. Para cubrir esta necesidad se dispone de un circuito programable llamado Divisor de frecuencia o Prescaler que divide la frecuencia utilizada por diversos rangos para poder conseguir temporizaciones más largas.

El Prescaler puede aplicarse al TMR0 o al Watchdog.

Cuando se asigna al TMR0 los impulsos pasan primero por el divisor de frecuencia y una vez aumentada su duración se aplican al TMR0.

14

Tema 11. TIMER 0

BITS DE CONFIGURACIÓN DEL TMR0

Para controlar el comportamiento del TMR0 se utilizan algunos bits de los registros OPTION e INTCON.

15

Tema 11. TIMER 0

BITS DE CONFIGURACIÓN DEL TMR0

flag de fin de contaje T0IF

16

Tema 11. TIMER 0

BITS DE CONFIGURACIÓN DEL TMR0

17

Tema 11. TIMER 0

BITS DE CONFIGURACIÓN DEL TMR0

18

Ejemplo de TMR0 como CONTADOR: Timer0_01.asm

;************************************ Timer0_01.asm *************************************;

;; Este programa comprueba el funcionamiento del Timer 0 como contador de los impulsos; aplicados a la línea RA4/T0CKI, donde se ha conectado un pulsador. Cada vez que presiona; el pulsadar se incrementa un contador visualizado en el display LCD.;; Como es un incremento por cada impulso aplicado al pin TOCKI no es necesario asignarle; divisor de frecuencia al TMR0, por tanto, el Prescaler se asigna al Watchdog.;; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>

CBLOCK 0x0CENDC

; ZONA DE CÓDIGOS ********************************************************************

ORG 0Inicio

call LCD_Inicializabsf STATUS,RP0 ; Acceso al Banco 1.movlw b'00111000' ; TMR0 como contador por flanco descendente de movwf OPTION_REG ; RA4/T0CKI. Prescaler asignado al Watchdog.bcf STATUS,RP0 ; Acceso al Banco 0.clrf TMR0 ; Inicializa el contador.

; La sección "Principal" es de mantenimiento. Sólo se dedica a visualizar el Timer 0.

Principalcall LCD_Linea1 ; Se pone al principio de la línea 1.movf TMR0,W ; Lee el Timer 0.call BIN_a_BCD ; Se debe visualizar en BCD.call LCD_Byte ; Visualiza apagando las decenas en caso de que sean 0.goto Principal

INCLUDE <RETARDOS.INC>INCLUDE <BIN_BCD.INC>INCLUDE <LCD_4BIT.INC>END

19

Tema 11. TIMER 0

TMR0 como TEMPORIZADOR

El principal problema cuando se configura el TMR0 como temporizador es el cálculo de los tiempos de temporización.

Se puede utilizar la siguiente fórmula:

Temporización=TCM · Prescaler · (256-Carga TMR0)

donde

•Temporización es el tiempo deseado.

•TCM es el período de un ciclo máquina. Para 4 MHZ, TCM=1µs.

•Prescaler es el rango de divisor de frecuencia elegido.

•(256-Carga TMR0) es el número total de impulsos a contar por el TMR0 antes de desbordarse en la cuenta ascendente.

20

Tema 11. TIMER 0

TMR0 como TEMPORIZADOR

¿Qué valor hay que cargar en el TMR0 para lograr un tiempo de 500 microsegundos si se utiliza un Prescaler de 2?

Sustituyendo en la ecuación anterior queda:Temporización = TCM · Prescaler · (256-Carga TMR0)

500 = 1 x 2 x (256 -Carga TMR0)..

Carga TMR0 = 6

21

Tema 11. TIMER 0

TMR0 como TEMPORIZADOR

TMR0_Carga500us EQU d’6’

TMR0_Carga500us EQU d’256’-d’250’

TMR0_Carga500us EQU -d’250’

22

Tema 11. TIMER 0

EJEMPLO DEL TMR0 como TEMPORIZADOR

Timer0_02.asm

;************************************** Timer0_02.asm ***********************************; Por la línea 3 del puerto B se genera una onda cuadrada de 1 kHz, por tanto, cada; semiperiodo dura 500 µs. Los tiempos de temporización se consiguen mediante la; utilización del Timer 0 del PIC.; El cálculo de la carga del TMR0 se hará de forma simple despreciando el tiempo que ; tardan en ejecutarse las instrucciones.; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>

CBLOCK 0x0CENDC

#DEFINE Salida PORTB,3

; ZONA DE CÓDIGOS ********************************************************************

ORG 0Inicio

bsf STATUS,RP0 ; Acceso al Banco 1.bcf Salida ; Esta línea se configura como salida.movlw b'00000000'movwf OPTION_REG ; Prescaler de 2 asignado al TMR0bcf STATUS,RP0 ; Acceso al Banco 0.

Principalbsf Salida ; La salida pasa a nivel altocall Timer0_500us ; durante este tiempo.bcf Salida ; La salida pasa a nivel bajocall Timer0_500us ; durante este tiempo.goto Principal

;

23

Tema 11. TIMER 0

EJEMPLO DEL TMR0 como TEMPORIZADOR Timer0_02.asm

; Subrutina "Timer0_500us" -------------------------------------------------------;; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada microsegundo.; Para conseguir un retardo de 500 µs con un prescaler de 2 el TMR0 debe contar 250; impulsos. Efectivamente: 1 µs x 250 x 2 = 500 µs.;; Comprobando con la ventana Stopwatch" del simulador se obtienen unos tiempos para la onda; cuadrada de 511 µs para el nivel alto y 513 µs para el bajo.;TMR0_Carga500us EQU d'256'-d'250'

Timer0_500usmovlw TMR0_Carga500us ; Carga el Timer 0.movwf TMR0bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Timer0_Rebosamientobtfss INTCON,T0IF ; ¿Se ha producido desbordamiento?goto Timer0_Rebosamiento ; Todavía no. Repite.return

; Comprobando con la ventana Stopwatch del simulador se obtienen unos tiempos para la onda; cuadrada de 511 µs para el nivel alto y 513 µs para el bajo.

END

24

Tema 11. TIMER 0EJEMPLO DEL TMR0 como TEMPORIZADOR

Timer0_03.asm; Por la línea 3 del puerto B se genera una onda cuadrada de 1 kHz, por tanto, cada; semiperiodo dura 500 µs. Los tiempos de temporización se consiguen mediante la; utilización del Timer 0 del PIC.;; A esta línea de salida se puede conectar un altavoz, tal como se indica en el esquema; correspondiente, con lo que se escuchará un pitido.;; El cálculo de la carga del TMR0 se hará de forma que se tenga en cuenta los tiempos de; las instrucciones para conseguir tiempos exactos. Para calcular los valores de carga ; del TMR0 hay que ayudarse del simulador del MPLAB y de la ventana de reloj Stopwatch.;; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>

CBLOCK 0x0CENDC

#DEFINE Salida PORTB,3

; ZONA DE CÓDIGOS ********************************************************************

ORG 0Inicio

bsf STATUS,RP0 ; Acceso al Banco 1.bcf Salida ; Esta línea se configura como salida.movlw b'00000000'movwf OPTION_REG ; Prescaler de 2 para el TMR0bcf STATUS,RP0 ; Acceso al Banco 0.

Principalbsf Salida ; La salida pasa a nivel altocall Timer0_500us ; durante este tiempo.nop ; Dos ciclos mediante "nop" para compensarnop ; la instrucción "goto Principal" del nivel bajo.bcf Salida ; La salida pasa a nivel bajocall Timer0_500us ; durante este tiempo.goto Principal

25

Tema 11. TIMER 0

EJEMPLO DEL TMR0 TMR0 como TEMPORIZADOR Timer0_03.asm

;; Subrutina "Timer0_500us" -------------------------------------------------------;; Con el simulador se comprueba que se obtienen unos tiempos para la onda cuadrada; de 1kHz exactos, 500 µs tanto para el nivel alto como para el bajo.;TMR0_Carga500us EQU -d'242' ; Este valor se ha obtenido experimentalmente

; con ayuda del simulador del MPLAB.Timer0_500us

nop ; Algunos "nop" para ajustar a 500 µs exactos.nopmovlw TMR0_Carga500us ; Carga el Timer 0.movwf TMR0bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Timer0_Rebosamientobtfss INTCON,T0IF ; ¿Se ha producido desbordamiento?goto Timer0_Rebosamiento ; Todavía no. Repite.return

END

26

BIBLIOGRAFÍA

"Microcontrolador PIC16F84, Desarrollo de proyectos" E. Palacios, F. Remiro, L.J. López. Ra-Ma, 2004

Podéis encontrar más información sobre el TMR0 en el

CAPÍTULO 15