Timer 0
Timer0 es el primer temporizador del curso (Tema 8). Sirve para retardos precisos (sustituir bucles vacios), contar pulsos externos en RA4/T0CKI y generar interrupciones periodicas cuando desborda. Lo combinaras con Interrupciones en Practica 3 (frecuencimetro) y Practica 5.
Con cristal 20 MHz y FOSC = HS (config bits), el reloj interno del timer es Fosc/4 = 5 MHz — base de todas las formulas del Tema 8.
Que hace Timer0
Sección titulada «Que hace Timer0»Timer0 puede operar en dos modos principales:
| Modo | T0CON.T0CS | Entrada de reloj | Uso tipico |
|---|---|---|---|
| Temporizador | 0 | Fosc/4 (interno) | Retardos, parpadeo LED |
| Contador | 1 | Pulsos en RA4/T0CKI | Contar eventos externos |
Paso 1 — El contador incrementa solo
Sección titulada «Paso 1 — El contador incrementa solo»Escribes un valor inicial en TMR0L (y TMR0H si 16 bit). Con TMR0ON = 1, el hardware incrementa el contador cada ciclo de reloj (dividido por prescaler). Al pasar de 255 → 0 (8 bit) o 65535 → 0 (16 bit), hay overflow y TMR0IF = 1.
Paso 2 — Pre-escalador (prescaler)
Sección titulada «Paso 2 — Pre-escalador (prescaler)»El prescaler ralentiza la cuenta. Valores en T0CON.PS2:PS0: 1:2, 1:4, …, 1:256. A mayor prescaler, mas tiempo hasta overflow con el mismo valor inicial.
Paso 3 — 8 bit vs 16 bit
Sección titulada «Paso 3 — 8 bit vs 16 bit»| Modo | Registro | Rango N max | Tiempo max @ 20 MHz, PS 1:256 |
|---|---|---|---|
8 bit (T08BIT = 1) | TMR0L | 256 | ~13,1 ms |
16 bit (T08BIT = 0) | TMR0H:TMR0L | 65536 | ~3,36 s |
Para 2 segundos necesitas 16 bit + prescaler 1:256.
Paso 4 — Polling o interrupcion
Sección titulada «Paso 4 — Polling o interrupcion»| Metodo | Codigo | Cuando |
|---|---|---|
| Polling | BTFSS INTCON, TMR0IF en bucle | Retardo puntual, codigo simple |
| Interrupcion | ISR en ORG 0x0008, TMR0IE + GIE | Parpadeo en background, frecuencimetro |
Detalle ISR: Interrupciones — Timer0.
Registro T0CON
Sección titulada «Registro T0CON»| Bit | Nombre | Funcion |
|---|---|---|
| 7 | TMR0ON | 1 = Timer activo |
| 6 | T08BIT | 1 = modo 8 bit; 0 = 16 bit |
| 5 | T0CS | 0 = reloj interno Fosc/4; 1 = externo T0CKI |
| 4 | T0SE | Flanco activo en modo contador (0 = subida) |
| 3 | PSA | 0 = prescaler asignado a Timer0 |
| 2–0 | PS2:PS0 | Pre-divisor 1:2 a 1:256 |
Ejemplo MOVLW B'00000111' → 16 bit, interno, prescaler 1:256:
TMR0ON=0 (apagado al configurar) T08BIT=0 → 16 bit T0CS=0 → temporizador interno PSA=0, PS=111 → prescaler 1:256Calcular N para un retardo
Sección titulada «Calcular N para un retardo»Objetivo: 2 s con Fosc = 20 MHz, prescaler 1:256.
Tiempo = (4 / Fosc) × N × PS 2 s = (4 / 20×10⁶) × N × 256 N = 2 / [(4/20×10⁶) × 256] = 39062 cuentas
Valor inicial = 65536 − 39062 = 26474 = 0x676A TMR0H = 0x67 , TMR0L = 0x6AVerifica: N = 65536 − 26474 = 39062 ✓
Ejemplo: 2 segundos con cristal 20 MHz
Sección titulada «Ejemplo: 2 segundos con cristal 20 MHz»Polling — subrutina reutilizable:
CONFIGURAR_TIMER_0: MOVLW B'00000111' ; 16 bit, interno, PS 1:256 MOVWF T0CON MOVLW B'01100111' ; TMR0H = 0x67 MOVWF TMR0H MOVLW B'01101010' ; TMR0L = 0x6A MOVWF TMR0L RETURN
RETARDO_TMR0_2S: BCF INTCON, TMR0IF ; limpia bandera vieja BSF T0CON, TMR0ON ; arranca timerespera_overflow: BTFSS INTCON, TMR0IF ; espera overflow GOTO espera_overflow ; salto → bucle hasta TMR0IF=1 BCF T0CON, TMR0ON ; apaga timer BCF INTCON, TMR0IF ; limpia bandera RETURNUso desde programa::
CALL CONFIGURAR_TIMER_0 CALL RETARDO_TMR0_2S BSF LATB, 0 ; accion despues de 2 sModo contador — pulsos en RA4
Sección titulada «Modo contador — pulsos en RA4»Para contar pulsos externos (ej. frecuencimetro — Practica 3):
BSF TRISA, 4 ; RA4 / T0CKI entrada MOVLW B'00100000' ; T0CS=1, contador externo MOVWF T0CON CLRF TMR0H CLRF TMR0L BSF T0CON, TMR0ON ; cada pulso en T0CKI incrementa el contadorVentana de medicion: combina Timer0 como contador con Timer1 como ventana de tiempo — detalle en Practica 3.
Errores comunes
Sección titulada «Errores comunes»| Error | Sintoma |
|---|---|
| Olvidar limpiar TMR0IF antes de esperar | Retardo inmediato o impredecible |
| 8 bit para retardo largo | Overflow demasiado rapido (~13 ms max con PS 1:256) |
| Fosc incorrecta en formula | Tiempos proporcionalmente mal (revisa cristal y Proteus) |
| No apagar TMR0ON al recargar en ISR | Cuenta extra durante la recarga |
Siguiente paso
Sección titulada «Siguiente paso»- Timer 1 y Timer 2 — 16 bit, PR2, base del PWM
- Guia practica — Interrupciones — parpadeo con ISR
- Practica 3 — Frecuencimetro
Preguntas estilo parcial
Sección titulada «Preguntas estilo parcial»¿Que indica TMR0IF = 1?
Timer0 desbordo (paso de FF→00 o FFFF→0000 segun modo).
¿Cual es el tiempo maximo en 8 bit, Fosc = 20 MHz, PS = 1:256?
Tiempo = (4/20×10⁶) × 256 × 256 = 13,1072 ms
¿Donde se configura el prescaler de Timer0?
En T0CON (bits PSA y PS2:PS0).
Ejercicio · Parcial
Calcula el tiempo maximo en 8 bit con Fosc=20MHz y pre-divisor 1:256
Tiempo = (4/20MHz) × 256 × 256 = 13,1072 ms segun el Tema 8 del curso de Microcontroladores (UNEXPO).
Timer 0
Basado en: Clase Tema 8. Timer.pdf
0 de 0 respondidas
Inicia sesion en CALETAS para sincronizar este resultado entre dispositivos.
Iniciar sesion en CALETAS