EL TIMER o DEL PIC16F84A LOS REGISTROS RELACIONADOS

Anuncio
EL TIMER o DEL PIC16F84A
£1 prescaler (divisor de frecuencia)
,1 PIC16F84A cuenta con un temporizador/contador denominado Timer O, q
s básicamente un contador binario ascendente de 8 bits, que se incrementa
bs formas posibles: una de ellas depende del oscilador del sistema y la otra de;
mal entrante en el pin RA4/T0CKI. Precisamente de alií el nombre T O C K I , qgnifica Timer O Clock In. Cuando se usa con la señal externa se puede incf'
tentar ya sea con flanco de bajada o subida, según lo decida el usuario.
g,l T i m e r O sirve como contador o ternporizador, aunque ya hemos visto que podernos medir o lograr tiempos específicos si usamos retardos. También podemos
emplear el TMRO para esta tarea. La ventaja de hacerlo es que el timer está contando automáticamente, mientras el PIC puede aprovechar para realizar otras tareas, cosa que con los retardos no es posible, o al menos no siempre. El TMRO
cuenta con un divisor de frecuencia o prescaler programable para dividir la frecuencia con la que es incrementado, y así logra:r tiempos de conteo más largos.
Carga/Lectura
Reloj
Desbordamiento
Reloj
Reloj/2
Reloj/4
Gontador ascendente
Figura 1. Estructura general de un temporizador/contador
de 8 bits.
uando el Timer O es incrementado con un flanco, ya sea de bajada o de subida!;',
]. el pin RA4/T0CKI se usa típicamente como contador de eventos externos, 4
lando se incrementa con la señal de reloj, se usa como temporizador. Se puedy
cribir o leer en él en cualquier momento que lo necesitemos. Como el Timer O e!.',
I simple contador de 8 bits, tiene un límite de cuenta y cuando llega a él y se invi;
ementa una vez más, se desborda y comienza a. contar desde O nuevamente.
BUS de datos
MUX
Fosc/4
RA4/T0CKI
O
Prescaler
programable
|TOCS|TOSE| PSA | PS2 i PSl I PSO
OPTON_REG C81H)
Sincronía
(2 ciclos
de retardo)
GIE
Figura 3. El prescaler divide la frecuencia
del reloj en 2 cada vez, para lograr tiempos mayores.
El P I C 16F84A realmente tiene otro temporizador llamado W D T o Watch dog timer,
aunque éste tiene un. propósito diferenteal Timer O, por lo que hablaremos de él más
adelante. £1 prescaler puede ser asignado a alguno de estos dos temporizadores. Luego, en la Tabla 2, veremos los rangos en que puede ser dividida la frecuencia.
LOS REGISTROS RELACIONADOS CON EL TMRO
. TMRO(01hj
TOIE
Reloj/8
TOIF
INTCON (OBh)
Figura 2. La estructura interna del Timer O
del PIC16F84A, se puede abreviar como TMRO.
bien nos puede pai-ecer que el Timer O es una función muy sencilla, pronto des3riremos que puede sernos de gran utilidad en muchos proyectos.
El uso del TMRO y su control se realiza mediante algunos registros del área SFR en
la memoria de datos. Para comprender mejor su funcionamiento, a continuación
veremos cuáles son los registros relacionados con el Timer O del PIC16F84A.
El registro TIVIRO
El registro llamado TMRO es el registro perteneciente al Timer 0. En él se reflejará
en todo momento la cuenta, es decir, el Valor, que tenga todo el tiempo el Timer 0.
Como pudimos apreciar en la Figura 2, el registro TMRO está conectado al bus de datos, por lo que podemos escribir en él o leerlo cuando necesitemos.
i registro llamado TMRO está ubicado en la dirección Olli del 'banco O del á'r^
FR de la memoria de datos. Cuando usamos elTimer O'como temporizador y caf
irnos un nuevo valor en él, elsigulente incremento se retrasará dos-ciclos'dé rélol
l registro.OPTION que se enciíentra ubicado en Ja dirección • 8 l l i en el bancof
s la memoria, de datos tiene varios bits que §irvén,de coiifiguración y control;d^
MRO. En la'Tabla 1 tenemosia estructura de este registro.
'
;
Bit 6
Bit 5
PSA=1 El prescaler se asigna al '^WDT
, ;
.,
•
'
,
TOSE (TMRO Soixrce Edge bit),: si estamos usando él TMRO como contador, es
decir, controlado por la señal en,el pin RA4/T0CKI, con,este bit se,elige si el i n cremento e n é f se hará con flanco descendente o ascendente: ,
'
, •
I registro OPTION
B|t 7
PSA=0 El prescaler se asigna al TMRO
Bit4
Bit3
Bit 2
.. í
Bit 1
Tabla 1. Estructura del registro OPTION.
TOSE=0 El TMRO se increrheñta con cada flanco de subida de la señal en T.OCKI
T0SE=1 ;Ei TMRO se incrementa'con cada flanco de!bajada de la señal eriTOCKI
Bit O
'
TOSE-O
,RA4/T0CK1,
T0SE=1'
RA4/T0CKI
1 Rmción de los bits de esté registro es;
S2, PSI3 PSÓ (Prescaler rateáiselect bits): estos bits sirven'^ara definir el rarl
) del prescaler o divisor de frecuencia. Enla-Tabla 2 vemos enldetaíledos rango!
pl prescaler para no'cometer efrojces.i•" \
-
Figura 4. Con el bit TOSE se elige
el flanco para el. incremento del TMRO.
/ ;
T O t S (TMRO ,CÍock source seleet bit): con este iDit se elige lafotma con la que el.
TMRO se incrementará:
^ „,-•": ,,^!,'v,. • ;,v '
i
'V^
T0.CS=Ó,E1 TMRO sé incrementa con la,señal de reloj intér^^
T O C S = r É l T M R p se incrementa con cada flanco de'la señal enel p i n RA4/T0CKI
Tabla 2. Asignación dé rangos del prescaler.
t o s bits 6 y 7 del registro' ÓPTIÓ]>LREG son nSados para otras tareas que no
SA (Prescaler assigninent bit): d,étermina.a quién'se lé asignará el prescaler:
U SIN PREátALER EN TMRO
viene al caso detaUar ahora, ya qiie la^ analizaremos posteriotmente,
TÍMERS EN OTROS Pies
registro INTCON
i:e registro se usa principalmente para las interrupciones, de las cuales no nos
layaremos aquí ya que le dedicaremos el Capítulo 10 para su desarrollo. Por
ora sólo nos interesa conocer u n bit de este registro que está en la dirección^
|h del banco O y se repite en la 8Bh del banco 1 .
Bit4
Bita
Bit 2
Bit 1
Bit O
oitr)'*incor--ooa5
Tabla 3. El registro INTCON.
lOk
;e registro, en realidad, tiene dos bits asociados al TMRO, pero por aliora sólo es-|
liaremos uno de ellos: ' ,
I F (TMRO Overflow Intertupt flag bit): este bit nos indica el estado de des-'L-dainiento del TMRO:
0 T H < N r O ' ^
Vdd Ó
Vdd
O
22pF
16
RAO
RAI
OSCl/CLKJN
'17
18
lOk
RA2
F=0 Indica que el TMRO,no se lia desbordado
F = l Indica que el TMRO se ha desbordado
RAS
4MHz
RA4/T0CKI
15
ando el TMRO se desborda, entonces que se activa el bit TOIF, este bit debe sérj
.'rado por software, es decir, no se borra automáticamente, sino que habrá qud
lerlo a O mediante la instrucción bcf cuando sea necesario."Es importante tene¿
cuenta esto para que nuestros programas fimcionen correctamente.
0SC2/CLK0UT
RBO/INT
22pF
RBl
, RB2
•RB3
,
Vdd. O-
,
,
RB4
RB5
IVICLR
. TIMER O COMO CONTADOR
míos el uso del Timer O como contador. Para ello utilizaremos el circuito mos-^;:
do en la Figura 5, de modo que al presionar un pulsador conectado al piil-4/TOCKI un contador se incrernentará C O A cada pulso y estaremos comproban^
cómo el TMRO aumenta con cada flanco de bajada en la entrada.'
lOuF
RB6
RB7
Figura 5. Circuito de ejemplo para el programa TMRO contador.asm.
Lo que estamos haciendo, en verdad, es contar los pulsos aplicados en RA4/T0CKI.
El código del programa será el siguiente:
"1
_CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON"& _XT_OSC
EL PRESCALER
PROCESSOR 16F84A
prescaler o divisor de frecuencia esnorma'tmente un contad.qr binario.'CoiriQsaben^
xador binario divide la frecuencia en dos en cada Una desús salidas al funcipnar. Sí lleva
#INCLUDE <P16F84A.INC>
CBLOCK OXOC
ENDC
•
ORG
0x00
cali
LCD i n i c i a l i z a
bsf
STATUS,RPO
movlw
b'00111000'
movwf
OPTION_REG
bcf
STATUS,RPO
movf
BCDdecenas, W
;No^ pasa l a s decenas a W
addlw
'O'
;Suma "cero" para obtener e l
v a l o r ASCII
goto
jAcceso a l Banco 1
LCDdecenas
NOdecenas
movlw
;Coloca un espacio s i l a s decenas
valen cero
jAcceso a l Banco O
LCDdecenas
cali
LCD_caracter
;Envíalo a l LCD
BCDunidades, W
;Pasa l a s unidíides a W
unidade.s
cirf
TMRO
;Borra e l TimerO
movf
addlw
inicio
'O'
,'Sumá "cero" para obtener e l
v a l o r ASCII
movf "
TMRO, W
;Lee
cali
BINaBCO
;Lo c o n v i e r t e en BCD
cali
LCD_decimal
j S u b r u t i n a para mostrar e l v a l o r '
e l v a l o r d e l TMRO
en decimal
gotó
inicio
j'Genera un bucle que l e e e l TMRO
cali
LCD carácter
; Envíalo a l LCD
return
#INCLUDE
<BINABCD.INC>
#INCLUDE
<LCD4BÍTS.INC>
constantemente
END
LCD_decifflal
cáll
LCD_origen1
;Envía e l cursor d e l LCD a l
i n i c i o de l a línea 1
movf
BCDcentenas, W
,'Pasa l a s centenas a W
bt^sc
STATUS, Z
;¿Centenas = O?
goto
NOcentenas
,-Si,
addlw
'O'
;No, suma "cero" para obtener e l
,-Coloca un espacio s i l a s
Obsérvenlos cómo, se cOri£gura el,TMRO de^^^m
la fuente de pulsos para su
incrementó-sea exteríia^ és decir, con la señal ..del pin TOCÍECI colocando un 1 en. el bit
TO,CS. Gon éí bit TOSE, a l se indica qué el incremento se liai-á con ün flanco de bajada; El prescaler se le asigna al„"WDT, por lo qtie no tendrá ningiui: efecto en el TMRO,
ni los bits de asignación PS2, 'PSl y PSO, por'lo que no importa su valor. El W D T
está desactivado, como lo, liéniosiEeclio,. siempre lias ta aliora. El bloque, principal
;Envíalo a l LCD
im ; POR gUE^PTION REG?
salta
v a l o r ASCII
goto
LCDcentenas
NOcentenas
movlw
Ppdemos descargar el código fuente TMRO contador.asm, donde hay más cónientarips ,dei ftiricionamiento y, él código máquiria TMRO contador.héXj desde,, www;
redusers.com para poder grabarlo' en el PIC16F84A y comprobarlo..
centenas valen cero
LCDcentenas
cali
^
LCD_caracter
decenas
movlw
d'10'
subwf
TMRO, W
btfss
STATUS, C
;¿Valor d e l TMRO < 10?
goto
NOdecenas
;Si,
salta
del programa es muy sencillo, sólo envía constantemente el valor contenido'
TMRO al display para que sea visualizado. La subrutina LCD_decimal convierte el
or de TMRO a decimal, de tal forma que en. el display podamos observarlo. Re^^
inendamps estudiar bien el funcionamiento de esta subrutina en el código fuenti
•C
Retardo I s
Inicializa
contadores
Frecuencímetro
FRECUENCIMETRO
Si usamos el TMRO como contador, lo primero que se nos ocurriría contar es p'
lisamente el número de pulsos de una señal. Si hacemos esto durante un según'
labremos iñedido la frecuencia de dicha señal y con esto podremos escribir un p|
yrama que funcione como un frecuencímetro digital. '
c
Frecuencímetro
>
Inicializa LCD
inicializa TIVIRO
Inicializa LCD
Inicializa TMRO
TMRO = O
Incrementa
Registro auxiliar
Retardo I s
Borra TOIF
BINaBCDie
Decrementa
contadores
Envía valor
obtenido al LCD
No.
TMRO = O
Durante el retardo
de, un segundo, el •
TMRO se incrementa,
con la señal
de entrada
Retardo I s
Figura 7. El segundo método básico para medir frecuencias más allá de 255 Hz.
Envía valor del
TMRO al LCD
Una librería más para convertir de binario a BCD
Figura 6. El método base para medir frecuencia con un
microcontrolador
PIC. Simplemente lee,el valor del TMRO después de un segundo.
1 método es ^sumamente sencillo, pero lá .desventaja es que el TMRO d<
ÍIC16F84A es de sólo 8 bits, con lo cual únicamente podríamos medir frecuencia;
,e hasta 255 Hz ya que si el TMRO se desborda (cuenta más de 255) iniciará de.
uevamente. Para resolver este inconveniente podemos usar un registro auxihar p£
í que cada vez que el TMRO se desborde, éste registro auxihar se incremente y d
sta forma podamos contar ,más allá de los 255 que limitan un registro de 8 bit
"eamos un ejemplo de un frecuencímetro que mida señales de hasta 10 K H z .
Para medir frecuencias más altas no sólo debemos poder contar, los piüsos en el pin
RA4/T0CKI, sino que debemos poder representar también esa cuenta en el display.
Recordemos que la LbreríaBINABCD.INC que estudiamos antes sólo puede convertir
números de tres dígitos y hasta 255, ya que ese es el límite para un registro. Ahora
necesitaremos convertir tm número de más de 8 bits. Para ello utilizaremos doS' registros, para poder tener un número de 16 bits con el cual podremos contar hasta
65535^0 y de. esa forma representar núriieros en B C D mucho más allá de,255.' Podemos descai-gar la Lbrería BINABCD16.INC, de www.redusers.com para utilizarla en
nuestro frecuencímetro. Es conveniente que la abramos en MPLAB para estudiar
su uso, el cual se indica con todo detalle en los comentai'ios de la misma librería.
cont_1, corit_2j cont_3, LCDaux
ENDC
ORG
0x00
cali
L C D _ i n i c i a l i z a ; I n i c i a l i z a e l LCD
bsf
STATUS,RPO
moylw
b'00101000'
movwf
bpTION_REG
jTMRO como contador, s i n p r e s c a l e
bcf
STATUS,RPO
jAcceso a l Banco O
;Acceso a l Banco 1
;Programa p r i n c i p a l :
movlw
b'10000101'
- • 'Call".
LCD_comando
'H'
movlw
[
cali
LCD_caracter
: movlw .
•
;Envía e l c u r s o r a l a posición 5
cali
,'.z''
LCD carácter
; Coloca l a leyenda '^Hz" en e l L
INTCON, 2
;Borra l a bandera de
inicio
bcf
,desbordamiemto d e l TMRO
clrf
byte_alto
clrf
cali
Figutá 8. Método de conversión de binarid a BCD dé i s bits
'
;Borra e l byte a l t o
TMRO
j B o r r a e l TMRO
retardo_1s
;Retardo de 1 segundo para
e f e c t u a r l a medición
^ ^ T r i ^
cpntinuar, conn^estro feuendmetro; en
' t ^ I
l^librena pafa'converdr debmano a -BCD. de 16 Uts, también'
t aiemos klibrería dé manejo de L C D , ya'sea la cíe 8 ó'4 b i t s '
código fuente es el siguiente:
,
_C0NFIi3 ^CP_OFF & _WDT_OFF á _PWRTE_ON & _XT_OSC
PROCESSOR 16F84A
#INCLUDE <P16F84A.INC>
CBLOCK 0X00
•
/'^
movf
TMRO, W
movwf
byte_b3ijo
;Pasa e l v a l o r d e l TMRO a W
•;'
UN FRECUENCIMETRO DE MICROCHIP
Si queremos construir un frecuencínnetro muy preciso y que mida altas frecuencias, podemos des
cargar la nota de aplicación AN592 Frequency Counter Using PIC16G5x de www.microchip.conn
donde se describe un método para hacerlo. Así podremos medir frecuencias desde 50 Hz fiast
50M Hz. El método és para los PIC16C5x, pero se puede adaptar fácilmente al PIC16F84A.
I
-
1
i
-
..
cali
BINaBCD16
; Obtiene l o s dígitos de l a
dígito = O
medición en BCD
goto
LCD2
;Ve a l dígito 2
enviaLCD3
cali
LCD_origen1
;Envía e l cursor d e l LCD a l
i n i c i o de l a línea 1
movf
BCD5, F
movlw
b'00001111'
andwf
BCD4_3, W
cali
numeroaLCD
btfss
STATUS, Z
;¿Dígito 5 > 0?
goto
over_range
; S i , sobre-rango
swapf
BCD2J, W
clrf
LCDaux
;Registro a u x i l i a r para e l i m i n a r
andlw
b'00001111'
btfss
STATUS, Z
,*¿Es cero?
goto
enviaLCD2
3No, envíalo
btfss
LCDaux, 1
; S i , ¿El t e r c e r o fue cero?
goto
enviaLCD2
,'No, envíalo
btfss
LCDaux, O
j S i , e l cuarto f u e c e r o ?
,'No, envíalo
j S i , J o s dos a n t e r i o r e s y e s t e
LCD2
l o s ceros a l a i z q u i e r d a
LCD4
swapf
BCD4_3, W
andlw
b'oooomr
jObtiene e l dígito número 4
;¿Es cero?
btfss
STATUS, Z
goto
enviaLCD4
;No, envíalo a l LCD
1
goto
enviaLCD2
cali
espacioLCD
;Si,
j
cali
espacioLCD
bsf
LCDaux, 0
;Coloca una bandera de cuarto
envía un espacio
dígito = 0
i
1
ií
goto
LCD3
;Ve a l s i g u i e n t e dígito enviaLCD4^!
cali
numeroaLCD
; Envía e l dígito a l LCD
LCD3
son cero, envía espacio
goto
LCD1
swapf
BCD2_1, W
'•i
andlw
b'oooomr
í
cali
numeroaLCD
b'oooomv
andwf
BCD4_3, W
btfss
STATUS, Z
j¿Es cero?
§
enviaLCD3
;No, envíalo
1
movlw
b'00001111'
/}:.
andwf
BCD2_1, W
;,,goto
;Ve a l dígito 1
enviaLCD2
movlw
;Obtiene e l dígito número 3
,'Obtiene e l dígito número 2
1
LCD1
jObtiene e l dígito número 1
btfss
LCDaux, 0
; S i , ¿El a n t e r i o r fue cero?
goto
enviaLCD3
;No, envíalo
|
cali
numeroaLCD
;Envíalo a l LCD ,
cali
espacioLCD
;Si,
|
goto
inicio
; I n i c i a o t r a medición
bsf
LCDaux, 1
jColoca l a bandera de t e r c e r
envía un espacio
;|
;Envía un dígito a l LCD
numeroaLCD
jSuma "cero" para obtener e l
addlw
DOS MÉTODOS PARA MEDIR FRECUENCIA
Para medir frecuencia con un PIC podemos utilizar dos métodos. Uno es el que ya vimos, contar e;'.
numero de pulsos durante un segundo, lo que nos da la frecuencia directamente. El otro es medi;'
el tiempo de un solo pulso de la señal de entrada y calcular su frecuencia con la fórmula f=l/T. í
v a l o r ASCII
cali
LCD carácter
;Envíalo a l LCD
return
;Envía un espacio a l LCD
espacioLCD
movlw
cali
LCD carácter
return
decfsz
cont_2, F
goto
;Muestra una indicación de sobre-ranao s i i« ™nH
"u>e rango s i l a medición es mayor a 9999Hz:
loop2
decfsz
, over_range
fcont_1,
goto
loop!
movlw
dM*
movwf
ret_aux
cont_1
tiempo a ün segundo exacto
cali
LCD_origen1
loop_ov
;Envía cuatro,símbolos > para
i n d i c a r sobre-rango
movlw
j r e t a r d o a u x i l i a r para a j u s t a r e
movlw
d'25'
movwf
contj
nop'
LCD_caracter
btfsc
,;.
INTCON, 2
decfsz
cont_1j F
goto
$+2
goto
loop_ov
goto
$+3
goto
inicio
íncf
byte_alto, F
bcf
:S
un 3e,„„.„ para . f e o t ó n U . e d i o ^ n .
,e„tPo«
'
loop_aux
'>'
cali
F
decfsz
.tardos
INTCON, 2
cont_1, F
goto
loopaux
nop ••„••'
;poder contar más
alia
return
de 255:
•/
.
#INCLUDE
' <BINABCD16.INC>
#INCLUDE
<LCD4BITS.INC>
retardo_ls
movlw
d'3'
movwf
cont_1
movlw
dM90'
loopi
movwf
loop2
d'250'
movwf
cont_3
btfsc
INTCON, 2
goto
$+2
goto
$+3
incf
bcf
byte_alto, p
INTCON, 2
desbordamiento
decfsz
goto
cont_3, F
loops
END •
•
"
• ' V •
Si •analizarnos él código anterior,, podernos apreciar qué se dispone dc'varias r
tinas, ^^eamosen detalle cómo actúa cada una de ellas para comprender mej
su funcionamiento: en primer lugar se,inicializa el L C D , luego se debe config
rar el TMRO como contador, és decir,,para que sé incremente con la señal €
TOCKL y se asigna elp^escaler al W D T , para que no tenga efecto en é l . T M R
cont_2
movlw
loop3
•• '
;¿Se ha desbordado e l TMRO?
;Si,
Incrementa b y t e _ a l t o y
;borra l a bandera de
;No,
continúa
A continuación, se envía la leyenda Hz al display, la cual quedará fija en él. P
último, simplemente se borra, el TMRO y sé lanza él retardo de 1 segundo pa
contar los pulsos de la señal,de entrada.
Es irnportante notar que él retardo usado es un, tanto especial, ya que déña-o de él sé -v
rifica constantemente si el TMRO se ha desbordado, y de esta forma se incrementa el
gisti'o auxiliar para contar los pulsos con 16 bits. En este cásoi el registro arudiiar es
regisü-o byte_alto, que,está definido en la subrutina BINaBCD16. La sección de verific
ción de desbordamiento está diseñada de manera que los dos caminos que puede ton
en la verificación toman el mismo dempo, y así no ,sé altera el tiempo del retardo.
ELTIMER O COMO TEMPORIZADOR
LCD
00
05
O
CN
CO
lOk
Si usamos el TMRO de tal forma que se incremente con la señal interna de reloj,
entonces lo hará a intervalos de tiempo regulares, por lo que en este modo el uso típico es como temporizador, es decir, para contar tiempo. Cuando el TMRO está
configurado para incrementái-se con la señal interna, si tenemos un oscilador de 4
M H z , el TMRO se incrementará con cada ciclo de máquina y, como ya. sabemos,
es de 1 microsegundo. De esta forma podemos calcular el tiempo que le tomará desbordarse, según el valor que le carguemos al inicio, con la ecuación:
Vdd
Tiempo = prescaler (256 - carga) + 2
22pF
16
RAO
OSCI/CLKIN
17
RAI
Donde:
RA2
RA3
4MHz
RA4/T0CKI
Señal TTL
Prescaler: es el valor asignado al prescaler
Carga: el valor que coloquemos en el TMRO
15
0SC2/CLK0UT
Vdd O-
'
• RBO/INT
22pF
he
Bus de 4 o de 8 bits
MCLR
PIC16F84A
F/¿fiira 9. f/ c/Vca/fo usado para el frecuencímetro
de 10 KHz con PIC16F84A.
|Podemos usar una conexión con el L C D de 4 ó de 8 bits, a,elección. Es importanite notar que el frecuencímetro sólo puede aceptar señales T T L . De modo que si necesitamos medir señales diferentes, debemos colocar algún circuito que acondicione laseñal para poder, introducirla al PIC. El programa sólo permite medir señales
de O H z hasta 9999 Hz. Más allá de eso, nos indicará un sobrerango colocando signos » » en el display. Desde el sitio web de la editorial (www.redusers.com)
podemos descargar los archivos Frecuencimetro.asm y Frecuencimetro.hex para su
sstudio y puesta en práctica.
El tiempo en esta fórmula está dado en ciclos de máquina, por lo que debemos multiplicar por el tiempo del ciclo de máquina que usaremos. Para el caso de un oscilador de 4 M H z ya sabemos que el ciclo de máquina es de 1 microsegundo. Si el
prescaler es asignado al W D T , entonces tomará el valor de 1 en la ecuación. Se suman dos para ajustar, ya que cuando cargamos un valor en ei TMRO el siguiente
incremento se retarda 2 ciclos de máquina. Veamos un ejemplo. Vamos a calcular
el tiempo que le tomará desbordarse al TMRO si se le carga un valor inicial de 150
sin usar prescaler.'De la ecuación anterior calculamos:
Tiempo
= 1 (256 - 150) + 2= 108 ciclos
Así, para un oscilador de 4 M H z , el tiempo medido con este ejemplo será de 108
microsegundbs. El tiempo máximo que podemos obtener es cuando asignamos el
prescaler en 1:256 y cargamos un O al TMRO, como vemos en la siguiente ecuación:
Tiempo = [256 (256 - 0) + 2] Ips = 65-538 ps = 65-538 ms
Como ejemplo del uso del TMRO como temporizador podemos hacer ahora lo contrario al frecuencímetro que ya estudiamos- Aliora generaremos una señal cuadrada
en alguna salida de nuestro mÍGrocontrolador. De la ecuación para calculir podemos
despejar carga, de modo que la fórmula quedará expresada de'la siguiente forma: •
Caiga = 256-íÍ5fI?P2_:l
• prescaler
Supongamos quemecesitamos generar una señal de 800
a la saJida del pin RA3,
Y con un, ciclo activo del 50%, entonces el período de la señal será: •
bsf
STATUS,RPO
clrf
TRISA
;Acceso a l Banco 1
movlw
b'10000001,'
movwf.
OPTI0N_REG
;Prescaler=1:4i TMRO cómo
STATUS,RPO
j A c c e s o a l Banco O
bsf
PORTA, 3
;Coloca RAO en a l t o
cali
temporiza
;Llama á subrutina para temporiza
bcf
PORTA, 3
jColoca RAO en estado bajo
cáll
temporiza
jTemporiza de nuevo
inicio
j i n i c i a de nuevo
temporizador
bcf
inició
goto
H
temporiza
Si el ciclo activo es del 50%, entonces cada semiciclo debe durar la mitad, es decir, 625 ini,crosegundos. Debemos generar una señal que se mantenga en altó 625
microsegundds y en bajo otros 625 microsegundos. Lo primero que debemos observar es el valor adecuado del prescaler que debemos usar. Si empleamos un prescaler de. 1:, el tiempo máximo que podemos lograr es ,de 258 microsegundos, lo
cual es insLificiente; con un prescaler de 2 será de 514 microsegundos, lo cual
también quedará corto, así que debemos usar un prescaler de 4. Con esto calculai-emos el valor de carga para el.TMRO:
.
. .
carga - 256 -
625 - 2
= 100.25
.4 •
No podemos usar valores, fraccionarios, p o r i o tanto usamos el valor más cercano siempre hacia arriba, que en este caso es 101 decimal. Aliora escribimos nuestro programa, que es el siguiente:
"
, '
_CONF.IG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
PROCESSOR 16F:84A
#INCLUDE <P16F84A.INC>
ORG
0X00
,;E1 v a l o r c a l c u l a d o
movlw
d'101'
movwf
TMRO
;Se carga' e l TMRO con él
bcf
INTCON, TOIF
j B o r r a l a bandera de
btfss
INTCON, TOIF
;¿Se ha desbordado
goto
loop
;No,
desbordamiento
loop
return
e l JMRO?
continua en e l loop
;Si,,regresa
END
Para poner a prueba nuestro programa, podemos txsar el circuito que desarroUarno
en la Figura 10. Además, podemos utilízai- MPLAJ3 S M para comprobar los tiempo
obtenidos con el Stopwatch, tal cpmodiemos estudiado antes. Recordenios que pa
ra eso debenios ir al punto .donde se invierte ei valor de salida.'
MIDIENDO CON EL STOPWÁTCH
22pF
16
O
RAO
bSCl/CLKlN
RAI
•
RA3
temporizador
STATUS,RPO
;Acceso a l Banco O
bsf
PORTA, 3
;Coloca RAO en a l t o
cali
temporiza
;Llama a s u b r u t i n a para temporizar
goto
$+1
;(Retardo de a j u s t e )
bcf
PORTA, 3
;Coloca RAO en estado bajo
RB3
cali
temporiza
;Temporiza de nuevo
RB4
RA2
4MHz
1
1
bcf
Sohms
RA4/T0CKI
inicio
lOk
49 —
0SC2/CLK0UT
RBO/INT
22pF
BD135
RBl
RB2
Vdd O
MCLR
1
movwf
goto
inicio
; I n i c i a de nuevo temporiza
RB5
goto
$+1
;(Retardo de a j u s t e )
RB6
goto
$+1
,' (Retardo de a j u s t e )
movlw
d'104'
;(Valor a j u s t a d o )
movwf
TMRO
;Se carga e l TMRO con él
bcf
INTCON, TOIF
;Borra l a bandera de
RB7
PIC16F84A
Figura 10. Tenemos la posibilidad de escuchar la señal
generada mediante un altavoz conectado a la salida RA3.
Si medimos los tiempos en M P L A B S I M observaremos que no coinciden con lo esperado, realmente en alto nos da un, tiempo de 631 microsegundos, y en bajo de
633 microsegundos. Esto se debe a que no hemos tenido en cuenta las instrucciones del programa que agregan un poco de tiempo antes de poder,cambiar el valor
de salida. Y además, el número de instrucciones para cada cambio no es el mismo.
Si no hay problema con', el tíempo podemos dejarlo así, pero si queremos lograr
tiempos exactos debemos ajustarlos. Para eso podemos utilizar M P L A B SIM, si aumentamos el valor de carga del TMRO hasta obtener tiempos menores al deseado.
Ltiego podemos ajustar mediante instrucciones nop o goto $+1 para lograr los tiempos exactos, tal como lo hemos hecho en el siguiente código ya ajustado':
_CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
desbordamiento
loop
nop
btfss
INTCON, TOIF
;¿Sé ha desbordado e l TMRO?
goto
loop
;No, continua en e l loop
return
;Si,
regresa
I
i
En este caso los tiempos en alto y bajo son exactamente de 625 microsegundos, cada
uno para lograr una frecuencia exacta de 800 Hz. De esta forma es como usai-emos el
TMRO como temporizador cuando así lo necesitemos. Hay una caracterísdca muy
importante que acompaña al TMRO, y es la interrupción por desbordamiento, lo cual
le da aun mayor uüLdad, pero de esto hablaremos en un capítulo posterior.
PROCESSOR 16F84A
#INCLUDE <P16F84A.INC>
ORG
m
RESUMEN
^
En este capítulo hemos estudiado qué es y cónno se utiliza el temporizador/contador llamado
0x00
Timer O del PiCI 6F84A, y sus aplicaciones típicas, como contador de eventos externos, o como
temporizador para lograr medir tiempo. Además, construimos un frecuencímetro basado en
bsf
STATUS,RPO
clrf
TRISA
el Timer O como contador. Aún nos falta estudiar la interrupción asociada a l desbordamiento
movlw
b'10000001'
del TMRO, pero esto lo haremos más adelante
j"Acceso a l Banco 1
Descargar