Story Transcript
PIC 18F45XX
EL TIMER 0
1. Hardware asociado
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
3. Registro de configuración
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). • Seleccionar el modo temporizador de 8/16 bits poniendo a uno/cero el bit T08BIT (T0CON) • Seleccionar la fuente de reloj interna poniendo a cero el bit T0CS (T0CON) • Habilitar (o no) el preescaler según convenga poniendo a uno o cero el bit PSA (T0CON) • En modo temporizador de 8/16 bits, el Timer 0 incrementa el valor del registro TMR0 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) y se produce una interrupción si está habilitado el bit TMR0IE (INTCON) y el bit GIE (INTCON)
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). • Seleccionar el modo contador 8/16 bits poniendo a uno/cero el bit T08BIT (T0CON) • Seleccionar la fuente de reloj externa (RA4/T0CKI) poniendo a uno el bit T0CS (T0CON) • Habilitar (o no) el preescaler según convenga poniendo a cero o uno el bit PSA (T0CON) • 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) • Se puede generar una interrupción si está habilitado el bit TMR0IE (INTCON) y el bit GIE (INTCON)
6. Registros asociados
7. Funciones asociadas en C18 Todas las funciones asociadas al TIMER0 se encuentran en el archivo 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 interrupciones INTCONbits.PEIE=1; // Habilitada interrupción de periféricos
Para controlar el Timer0 se utilizan además las funciones:
void CloseTimer0 (void); // Deshabilita el Timer0 unsigned int ReadTimer0 (void); // Leer valor void WriteTimer0 ( unsigned int timer0); // Escribir valor Cuando el Timer0 se desborda pone a uno la bandera . 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
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 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
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 bits valor=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 bits WriteTimer0 (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
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 1:1 (Sin preescaler)
RETARDO MAXIMO (F=20Mhz) 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
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);
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.
Solución No olvidar añadir después de la cabecera: #include
Simulación