Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos

¿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.

La familia a la que pertenece el PIC18F4550 incluye los timers:

Timer Número de bits


Temporizador/contador 0 8 ó 16
Temporizador/contador 1 16
Timer2 8
Temporizador/contador 3 16

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).

Este periférico puede funcionar en dos modalidades: 8 y 16 bits

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

TOSE Flanco activo para incrementar TMR0L


0 Ascendente
1 Descendente

18 Diagrama de bloques del Timer contador 0 en modo de 8 bits

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:

T0PS2 T0PS1 T0PS0 Valor del


Prescaler
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32

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:

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

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

En la siguiente figura se muestra el diagrama de bloques del temporizador/ contador 0, en


modalidad de 16 bits. Como podemos apreciar en la figura, la diferencia es que se tienen dos
registros de 8 bits, TMR0L y TMR0H, para formar un temporizador/ contador de 16 bits.

39
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

19 Diagrama de bloques del temporizador/contador 0 en modo 16 bits

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

De tal manera que:

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).

De tal manera que:

Valor_precarga=máximo valor del timer-valor_del_timer (3)

40
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

O equivalentemente:

Valor_precarga= máximo valor del timer-Temporización/(4.Tosc.valor_prescaler) (4)


El máximo valor para un timer de 8 bits es 0xFF +1, ya que se desborda al iniciar nuevamente en
cero, en decimal este valor es 256.

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:

Valor_del_timer=500 ms/(4*0.25 µs*64)

=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

Ahora debemos configurar los registros necesarios para activar el timer:

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:

 GIE/GIEH=1, bit de habitación global de interrupciones


 TMR0IE=1, bit de habilitación de interrupción del timer 0

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

Por lo que el valor de configuración para INTCON es 1010 0000, 0xA0

Ejercicios E4.2
Escriba el valor necesario para el registro T0CON para los requerimientos de los ejercicios E4.1

El programa siguiente, es la versión mejorada del contador ascendente, descendente, aquí la


duración de cada número exhibido es de exactamente 500 ms. La rutina repite ahora es más
eficiente y controlada por el timer 0. Nótese que ahora se configuró el oscilador interno del µc a 4
MHz, de acuerdo a los cálculos realizados. Los cambios con respecto al programa anterior están en
rojo.

;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador


#include <P18F4550.INC> ;definiciones de variables especificas del procesador

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

También podría gustarte