Top Banner
PIC 18F45XX EL TIMER 0
15

PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

May 14, 2018

Download

Documents

duongdat
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

PIC 18F45XX

EL TIMER 0

Page 2: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

1. Hardware asociado

Page 3: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

2. Características

• Se puede configurar como temporizador o contador de 8/16 bits.

• Se puede leer o escribir en él a través del registro TMR0.

• Dispone de un preescaler de 8 bits programable por software.

• Puede trabajar con señal de reloj interna o externa (RA4/T0CKI).

• Puede generar una interrupción por desbordamiento.

• En modo contador se puede programar para que incremente su valor por flanco

ascendente o descendente por el pin (RA4/T0CKI).

• En modo temporizador el valor del registro TMR0 se incrementa a intervalos de 1Tcy,

es decir (4/Fosc segundos). (0.2us para 20Mhz / 0.0833us para 48Mhz)

• El registro T0CON (SFR:0xFD5) controla la configuración del módulo

Page 4: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

3. Registro de configuración

Page 5: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

4. Modo temporizador de 8/16 bits

Para configurar el Timer-0 en modo temporizador de 8 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON (T0CON<7>).• Seleccionar el modo temporizador de 8/16 bits poniendo a uno/cero el bit T08BIT (T0CON<6>) • Seleccionar la fuente de reloj interna poniendo a cero el bit T0CS (T0CON<5>)• Habilitar (o no) el preescaler según convenga poniendo a uno o cero el bit PSA (T0CON<3>)• En modo temporizador de 8/16 bits, el Timer 0 incrementa el valor del registro TMR0<TMR0H:TMR0L> con cada ciclo de instrucción (Tcy), sin preescaler .• Si se escribe en el registro TMR0, éste deja de incrementarse durante 2 ciclos de instrucción.• Si el registro TMR0 se desborda (0xFF->0x00) se pone a uno la bandera TMR0IF (INTCON<2>) y se produce una interrupción si está habilitado el bit TMR0IE (INTCON<5>) y el bit GIE (INTCON<7>)

Page 6: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

5. Modo contador de 8/16 bits

Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON (T0CON<7>).• Seleccionar el modo contador 8/16 bits poniendo a uno/cero el bit T08BIT (T0CON<6>)• Seleccionar la fuente de reloj externa (RA4/T0CKI) poniendo a uno el bit T0CS (T0CON<5>)• Habilitar (o no) el preescaler según convenga poniendo a cero o uno el bit PSA (T0CON<3>)• En modo contador de 8/16 bits, el Timer 0 incrementa el valor del registro TMR0 con cada flanco ascendente (bit INTCON.T0SE=1) o descendente (bit INTCON.T0SE=0) en el pin (RA4/T0CKI) sin preescaler .• Si el registro TMR0 se desborda (0xFF->0x00 para 8 bits o 0xFFFF->0x0000 para 16 bits) se pone a uno la bandera TMR0IF (INTCON<2>) • Se puede generar una interrupción si está habilitado el bit TMR0IE (INTCON<5>) y el bit GIE (INTCON<7>)

Page 7: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

6. Registros asociados

Page 8: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

7. Funciones asociadas en C18

Todas las funciones asociadas al TIMER0 se encuentran en el archivo <timers.h>

Ejemplo 1: Configuración como: temporizador 16bits, interrrupción habilitada, sin preescaler:

OpenTimer0(TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_1 );INTCONbits.GIE=1; // Habilitación general de interrupcionesINTCONbits.PEIE=1; // Habilitada interrupción de periféricos

Para controlar el Timer0 se utilizan además las funciones:void CloseTimer0 (void); // Deshabilita el Timer0unsigned int ReadTimer0 (void); // Leer valorvoid WriteTimer0 ( unsigned int timer0); // Escribir valor

Cuando el Timer0 se desborda pone a uno la bandera <INTCONbits.TMR0IF>. Se puede chequear este bit para conseguir retardos precisos, recargando el TIMER0 y esperando a que se desborde.Ejemplo de uso: while(INTCONbits.TMR0IF==0); // Esperar desbordamiento

Para ver todas las posibilidades de configuración leer el documento:“PIC18F Peripheral Library Help Document.chm” situado en ..\mplabc18\v3.4\doc

Page 9: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

7.1 Ejemplo de configuración (modo contador)

Ejemplo 2: Configuración como: contador 8bits, sin interrupción, flanco de bajada, sin preescaler: OpenTimer0(TIMER_INT_OFF & T0_SOURCE_EXT & TO_EDGE_FALL & T0_8BIT & T0_PS_1_1 );

Ejemplo 3: Configuración como: contador 16bits, sin interrupción, flanco subida, preescaler 1:4: OpenTimer0(TIMER_INT_OFF & T0_SOURCE_EXT & TO_EDGE_RISE & T0_16BIT & T0_PS_1_4 );

En modo contador si ponemos a cero el registro (WriteTimer0(0x00);), cada vez que se produce un flanco de subida/bajada en el pin RA4 se incrementa en una unidad el registro asociado.

Si tenemos fijado un preescaler “1:PR” el registro se incrementará en una unidad cada “PR” flancos recibidos en RA4. Por ejemplo, para un preescaler de 1:4 cada cuatro flancos de subida/bajada se incrementa en una unidad el registro del Timer0. Cuando el Timer0 alcanza el valor de 0xFFFF (16bits) o 0xFF (8bits), un nuevo flanco provocará su desbordamiento y que la bandera <INTCONbits.TMR0IF> se ponga a uno. Cuando la bandera se pone a uno se puede producir una interrupción si éstas están habilitadas.

Para ver todas las posibilidades de configuración leer el documento:“PIC18F Peripheral Library Help Document.chm” situado en ..\mplabc18\v3.4\doc

Page 10: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

8. Ejemplos de lectura / escritura

Para leer el contenido del TIMER0 (modo 16bits) se utiliza la función: ReadTimer0(); Ejemplo:unsigned int valor; // Declarar una variable de 16 bitsvalor=ReadTimer0(); // Asignamos el valor leído a la variable

Para escribir un valor en el registro TMR0 se utiliza la función:void WriteTimer0 ( unsigned int timer0);Ejemplo:unsigned int valor=1500; // Declarar una variable de 16 bitsWriteTimer0 (valor); // Asignamos el valor 1500 al timer

Como regla general para conseguir un retardo de “RET” micro segundos:WriteTimer0 (0-Valor_recarga); Donde: Valor_recarga= [RET / (TCY * PREESCALER)]

Ejemplo: Para conseguir un retardo de 30ms con un preescaler de 1:4 (Xtal:20Mhz)Valor_recarga = (30.000/(0.2*4)) = 37500

Page 11: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

9. Procedimiento general (I)

Para conseguir un retardo determinado utilizando el Timer 0 como temporizador de 16 bits hay que determinar primero el valor del preescaler (en caso de necesitarlo)

PREESCALER RETARDO MAXIMO(F=20Mhz)

1:1 (Sin preescaler) 65536*0,2=13,1ms

1:2 65536*0,2*2=26,21ms

1:4 65536*0,2*4=52,42ms

1:8 65536*0,2*8=104,86ms

1:16 65536*0,2*16=209,72ms

1:32 65536*0,2*32=419,44ms

1:64 65536*0,2*64=838,86ms

1:128 65536*0,2*128=1677,72ms

1:256 65536*0,2*256=3355,44ms (*)

(*) Valor del retardo máximo ~ 3,35 segundos para preescaler de 256

Page 12: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

10. Procedimiento general (II)

Para conseguir un retardo de RET microsegundos con el Timer 0 como temporizador de 16 bits

1º. Fijar el valor del preescaler, según la tabla anterior, para que (RETARDO MÁXIMO > RET)

2º. Calcular el valor de recarga usando la expresión: Valor_recarga=(RET / (0.2000*PRESCALER)) → 20Mhz Valor_recarga=(RET / (0.0833*PRESCALER)) → 48Mhz

3º. Programar el código siguiendo los tres pasos básicos:• Reset bandera TIMER0 => INTCONbits.TMR0IF=0; • Recargar TIMER0 => WriteTimer0(0-Valor_recarga);• Esperar desbordamiento => while(INTCONbits.TMR0IF==0);

Page 13: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

9. Programa de ejemplo

Utilizar el módulo Timer0 como temporizador de 16bits con preescaler para generar un retardo de 640ms y realizar un programa que muestre un contador binario en los cuatro bits de menor peso del PORTB. Mostrar en el lcd el texto que aparece en la figura.

Page 14: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

Solución

No olvidar añadir después de la cabecera: #include <timers.h>

Page 15: PIC 18F45XX - IES LUIS DE LUCENA. Modo contador de 8/16 bits Para configurar el Timer 0 en modo contador de 8/16 bits hay que: • Habilitar el módulo poniendo a uno el bit TMR0ON

Simulación