Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Temporizador 0
Temporizador 0
¿Cuál será el valor de precarga necesario para que este sistema nos indique que ha transcurrido
un tiempo de 6 minutos? Seria depositar en la cubeta 4/10 de su capacidad. Si se ha entendido el
funcionamiento de este sistema, se entenderá fácilmente el funcionamiento típico de los timers.
Temporizador/Contador 0
Este periférico puede funcionar como timer, teniendo como base de tiempo, el ciclo interno de
ejecución de instrucciones Fosc/4, pero también puede funcionar como contador, contando los
impulsos que le llegan por el pin RA4 en su función alterna T0CKI (Timer 0 Clock Input).
En la figura siguiente, se muestra el diagrama de bloques del timer 0 en modo de 8 bits. Como se
puede observar, existen multiplexores para seleccionar mediante sus bits de selección (los cuales
37
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
son bits de control del timer) su funcionamiento, esto se logra con el bit TOCS (Timer 0 Clock
Select) de tal manera que:
TOCS Configuración
0 Selecciona como señal de sincronía el ciclo interno de instrucción Fosc/4 es decir,
funciona como timer
1 Selecciona como señal de sincronía los flancos provenientes del pin RA4/T0CK1,
funcionando entonces como contador externo
El bit TOSE (Timer 0 Select Edge) selecciona el flanco con el que se incrementará el registro TMR0L
Como podemos observar en la figura se puede seleccionar un pre divisor (prescaler) programable,
la selección de este pre divisor se selecciona con el bit PSA
PSA Prescaler
0 Asignado
1 No asignado
El pre divisor sirve para incrementar la capacidad del timer, si no está asignado, el timer se
incrementará cada vez que reciba un flanco, ó con cada ciclo de instrucción, según se halla
programado como contador o temporizador, respectivamente. Este divisor se puede programar
con los bits T0PS (Timer 0 Preescaler Select) de acuerdo a como lo indica la siguiente tabla:
38
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
1 0 1 64
1 1 0 128
1 1 1 256
Estos bits de configuración que hemos descrito, están en el registro de control del timer0, llamado
T0CON:
Como podemos ver en la tabla anterior, el renglón superior indica el valor de los bits después de
un reset, R/W indica que los bits son de lectura/escritura, el renglón inferior indica el número de
bit.
Ya explicamos el funcionamiento de cada bit, solamente faltaron los bits 7 y 6, los cuales tienen la
función:
TMR0ON Función
0 Timer 0 Apagado
1 Timer 0 Encendido
T08BIT Función
0 Timer/Contador 0 de 16 bits
1 Timer/Contador 0 de 8 bits
39
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
Ahora, recordando nuestro sistema de la cubeta, mostrado en las figuras 5 y 6, podemos hacer
una analogía entre él y el timer:
El prescaler viene siendo la llave, ya que con ella se regula el chorro de agua, y
consecuentemente el tiempo en que tardará en desparramarse
El registro del timer, es equivalente a la capacidad del recipiente, por ejemplo para el
modo de 16 bits, ya no hablaríamos de una cubeta, sino tal vez de un tonel
La cantidad de agua que se deposita previamente en la cubeta, para generar intervalos de
tiempo más pequeños, funciona exactamente de la misma manera que el valor de
precarga del timer
La interrupción se genera al desbordarse el timer, de la misma manera que nosotros
tenemos que suspender lo que hacemos, cuando escuchamos que se empieza a
desparramar el agua, y corremos a cerrar la llave de agua.
Para los PICS, podemos usar una expresión para calcular el valor de precarga necesario:
Temporización=4.Tosc.valor_prescaler.valor_del_timer (1)
En donde Tosc es el valor del periodo del oscilador principal del microcontrolador
Valor_del_timer=Temporización/(4.Tosc.valor_prescaler) (2)
Debemos de tomar en cuenta, que este valor obtenido en la expresión 2, tenemos que restarlo del
máximo valor del timer (de la misma manera que restábamos la cantidad de agua de la capacidad
total de la cubeta).
40
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
O equivalentemente:
Para un timer de 16 bits el máximo valor al que puede llegar es 0xFFFF y se desborda en 0xFFFF+1,
es decir 65536 en decimal.
Para saber más, se recomienda revisar en las hojas de datos del fabricante DS39632C:
Módulo timer 0
Módulo timer 1
Módulo timer 2
Módulo timer 3
Ejemplo 4
Ahora estamos listos para nuestro siguiente ejemplo, usando el timer 0. Se quiere generar un
tiempo de 500 ms, considerando que el oscilador principal funciona a una frecuencia de 4 MHz y
un prescaler de 64, sustituyendo estos valores en la ecuación 3 tenemos:
=500 ms/64 µs
=7812.5
Debido a que solo podemos usar valores enteros, el valor del timer es 7812, y notamos también
que debemos de usar el timer de 16 bits, pero recordemos que este valor tenemos que restarlo
del valor máximo. Por lo que:
Valor_precarga=65536-7812=57724
Este valor tenemos que cargarlo en los registros TMR0H y TMR0L, por lo que debemos de
convertir el valor a hexadecimal, que es 0xE17C. Esto se hará con las instrucciones:
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
Ejercicios E4.1
a. Considerando un pre divisor de 32 y una frecuencia del oscilador principal de 1 MHz,
calcule el valor necesario de precarga del timer 0, para generar un intervalo de tiempo de
100 ms.
b. Use el timer 0, para generar una frecuencia de 440 Hz, proponga los valores necesarios
del oscilador principal, así como del pre divisor
41
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
T0CON
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TMR0ON T08BIT TOCS TOSE PSA T0PS2 T0PS1 T0PS0
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 0 1 0 1 0 1
Este valor binario 1001 0101 equivale a 0x95, que debemos cargar en el registro T0CON
El valor de precarga 0xE17C se cargará en los registros del timer, por lo tanto 0xE1 debe cargarse
en TMR0H y 0x7C en TMR0L
Para el funcionamiento óptimo del timer debemos configurar su interrupción, esto se hace en el
registro INTCON, habilitando los bits:
INTCON
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 1 0 0 0 0 0
Ejercicios E4.2
Escriba el valor necesario para el registro T0CON para los requerimientos de los ejercicios E4.1
;******************************************************************************
42
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
;******************************************************************************
;Bits de configuración
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definición de variables en RAM de acceso
flags ;definimos la dirección 0 como registro de banderas
ENDC ;fin del bloque de constantes
;******************************************************************************
ORG 0x0000 ; vector de reset
bra inicio
org 0x08 ;vector de interrupción
bra RST0 ;ramifica servicio interrupción T0
org 0x0020
inicio bsf OSCCON,IRCF2,0 ;Inicio del programa principal
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XA0
movwf INTCON,0 ;interrupcion TMR0 habilitada
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
cero movlw 0xC0 ;código del cero
movwf PORTD,0
call repite
btfss PORTB,0,0
bra nueve
uno movlw 0xF9 ;código del uno
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cero
dos movlw 0xA4 ;código del dos
movwf PORTD,0
call repite
btfss PORTB,0,0
bra uno
tres movlw 0xB0 ;código del tres
movwf PORTD,0
43
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González
call repite
btfss PORTB,0,0
bra dos
cuatro movlw 0x99 ;código del cuatro
movwf PORTD,0
call repite
btfss PORTB,0,0
bra tres
cinco movlw 0x92 ;código del cinco
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cuatro
seis movlw 0x82 ;código del seis
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cinco
siete movlw 0xB8 ;código del siete
movwf PORTD,0
call repite
btfss PORTB,0,0
bra seis
ocho movlw 0x80 ;código del ocho
movwf PORTD,0
call repite
btfss PORTB,0,0
bra siete
nueve movlw 0x98 ;código del nueve
movwf PORTD,0
call repite
btfss PORTB,0,0
bra ocho
bra cero
;******************************************************************************
repite btfss flags,0,0
bra repite
bcf flags,0,0
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
END
Programa 4: Usando el timer 0 para encender cada dígito del display durante exactamente 500 ms
44