Temporizadores¶
Los Q10 y Q43 cuentan con tres tipos de módulos de temporización:
| Módulo | Resolución | Uso típico |
|---|---|---|
| TMR0 | 8 o 16 bits | General |
| TMR1 | 16 bits | Tiempo preciso, CCP |
| TMR2 | 8 bits | PWM, ADC |
A continuación se detalla el funcionamiento del módulo TMR0. Se mencionarán el TMR1/3/5 y TMR2/4/6 en los módulos que usan esos temporizadores.
Timer 0 (TMR0)¶
El módulo TMR0 es un temporizador/contador de 8 o 16 bits que incrementa su valor en cada flanco positivo de la fuente de reloj. Cuando llega al valor máximo ocurre un overflow (16 bits) o un match (8 bits); en ambos casos, se reinicia la cuenta.
Si un evento de overflow/match ocurre la cantidad de veces configurada en el postscaler, se levanta la bandera TMR0IF del registro PIR06 y la señal T0_out se alterna.
La cuenta actual está en los registros TMR0L y TMR0H (en 8 bits solo TMR0L).
TMR0 en el Q43
En el Q43, la bandera de interrupción TMR0IF se encuentra en el bit 7 del registro PIR3 (banco 4) en lugar de PIR0. Análogamente, TMR0IE está en PIE3 y TMR0IP en IPR3.
De este modo, la duración total de un ciclo del temporizador se puede calcular con:
Pero, lo que normalmente se calcula es el valor de TMR0L y TMR0H para obtener la cantidad de cuentas deseada. Esto se calcula de forma diferente para cada modo (8 o 16 bits), como se detalla a continuación.
Modo 8 bits¶
Como se aprecia en su diagrama de bloques, el TMR0L es comparado con TMR0H en cada cuenta. Si son iguales, se genera un match y el TMR0L se reinicia a 0. Por lo tanto, en modo de 8 bits, se puede contar hasta 254 porque al llegar a 255 se genera el match y se reinicia a 0. En este sentido, se afirma que:
Ejemplo
Si se escribe 100 en TMR0H, el TMR0L contará desde 0 hasta 99 (100 cuentas) y luego ocurrirá el match.
Modo 16 bits¶
Como se ve en el diagrama de bloques, la cuenta inicia desde lo escrito en TMR0H:TMR0L y termina en FFFF (65 535).
En este modo, para contar una cantidad específica de tiempo, se puede precargar un valor inicial en TMR0H:TMR0L.
Orden de lectura / escritura
- Leer: primero
TMR0L, luegoTMR0H. - Escribir: primero
TMR0H, luegoTMR0L.
Pasos para configurar el TMR0¶
Como guía práctica, se detallan los pasos necesarios para configurar el módulo TMR0:
-
Configurar
T0CON1: seleccionar la fuente de reloj (T0CS), sincronía (T0ASYNC) y prescaler (T0CKPS).Timer0 Control Register 1 (T0CON1)3 Bit 7:5 4 3:0 Campo T0CS[2:0] T0ASYNC T0CKPS[3:0] Permisos R/W R/W R/W Reset 000 0 0000 Fuentes de reloj del TMR0 (T0CS)4 T0CS[2:0] Fuente 000 T0CKIPPS 001 \(\overline{\text{T0CKIPPS}}\) 010 Fosc/4 011 HFINTOSC 100 LFINTOSC 101 MFINTOSC 500 kHz 110 SOSC 111 CLC1_OUT T0ASYNC = 1si la fuente es asíncrona con el reloj del sistema.T0CKPS[3:0]representa el prescaler de \(2^{\text{T0CKPS}}\). -
Configurar
T0CON0: seleccionar el modo (T016BIT) y el postscaler (T0OUTPS). No habilitar aún el timer (T0EN = 0).Timer0 Control Register 0 (T0CON0)2 Bit 7 6 5 4 3:0 Campo T0EN — T0OUT T016BIT T0OUTPS[3:0] Permisos R/W — RO R/W R/W Reset 0 — 0 0 0000 T0ENhabilita el timer. YT016BIThabilita el modo de 16 bits.T0OUTes la salida del temporizador que se alterna al ocurrir la interrupción (solo lectura).Los bits
T0OUTPS[3:0]representan el postscaler de1:T0OUTPS+1. -
Cargar la cuenta
TMR0del timer:- Escribir el valor calculado para
TMR0Hsegún el modo (8 o 16 bits). - Si el modo es 16 bits, escribir el valor calculado para
TMR0L.
Ejemplo: Carga del timer (8 bits)
Para el Q10: Con la configuración de los ejemplos anteriores (modo 8 bits, sin postscaler, prescaler de 1:16 y reloj \(\frac{F_{\text{osc}}}{4} = 1MHz\)), si quieres configurar la duración máxima:
\[ \text{Duracion} = \frac{1}{F_{\text{T0CS}}} \times \text{PreScaler} \times \mathtt{TMR0H} \times \text{PostScaler} = \frac {16 \times 255 \times 1}{1MHz} = 4.08\mu s \] - Escribir el valor calculado para
-
(Opcional) Interrupción: Configurar los registros de interrupción del TMR0.
- Bajar la bandera
TMR0IFdel registroPIR0. - Habilitar la interrupción
TMR0IEdel registroPIE0. - Configurar la prioridad
TMR0IPdel registroIPR0(1= alta prioridad). En todos los casos, se hace referencia al bit 5 de cada registro.
Ejemplo: Configuración de interrupción
Para el Q10: Habilitar la interrupción del TMR0 con alta prioridad:
PIR0bits.TMR0IF = 0; // Bajar bandera de interrupción PIE0bits.TMR0IE = 1; // Habilitar interrupción del TMR0 IPR0bits.TMR0IP = 1; // Alta prioridadmovlb 0Eh ; Banco 0Eh bcf PIR0, 5, b ; Bajar bandera de interrupción bsf PIE0, 5, b ; Habilitar interrupción del TMR0 bsf IPR0, 5, b ; Alta prioridadInterrupción del TMR0 en el Q43
En el Q43, los bits
TMR0IF,TMR0IEyTMR0IPse encuentran en los registrosPIR3(bit 7),PIE3(bit 7) eIPR3(bit 7) respectivamente. - Bajar la bandera
-
(Opcional) Salida PPS: Escribir en
RxyPPSel valor0x13para redirigirT0_outa un pin9. Solo disponible en puertos RB y RC. Divide ÷2 la frecuencia deT0_out.Ejemplo: Configuración PPS
Para el Q10: Redirigir
Todos los registros RBxPPS y RCxPPS del Q10 están en el bancoT0_outal pin RC0:0Eh.PPS del TMR0 en el Q43
En el Q43, el código PPS para
T0_outes0x39y solo está disponible en puertos RC y RF. -
Habilitar el timer: activar el bit
T0ENdel registroT0CON0.
Referencias¶
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 19, "TMR0 - Timer0 Module". Ver PDF (Pág. 295). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 19.6.1, "T0CON0". Ver PDF (Pág. 300). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 19.6.2, "T0CON1". Ver PDF (Pág. 301). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 19.2.1, "Clock Source Selection". Ver PDF (Pág. 296). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 19.6.3, "TMR0H". Ver PDF (Pág. 302). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 15.13.2, "PIR0". Ver PDF (Pág. 199). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 15.13.10, "PIE0". Ver PDF (Pág. 207). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 15.13.18, "IPR0". Ver PDF (Pág. 215). ↩
-
Microchip Technology Inc. (2020). PIC18F27/47Q10 Microcontroller Data Sheet. Sección 18.2, "PPS Outputs". Ver PDF (Pág. 287). ↩