Manejo de Temporizad T emporizador ores es Módulo Timer 0 (TMR0) Módulo Timer 1 (TMR1) Módulo Timer 2 (TMR2)
COMPETENCIA El alumno comprenderá los principales elementos que conforman la estructura interna del reloj o temporizador TMR0 TMR! " TMR# del PIC!$%&''( Analizará su principio de funcionamiento " la funci)n del preescalador( preescalador(
COMPETENCIA El alumno comprenderá los principales elementos que conforman la estructura interna del reloj o temporizador TMR0 TMR! " TMR# del PIC!$%&''( Analizará su principio de funcionamiento " la funci)n del preescalador( preescalador(
*+,TI%ICACI-N .as operaciones de pausas sincronizaci)n de tiempo de ejecuci)n " lapsos de tiempo son uno de los criterios necesarios al momento de realizar implantaciones so/re los sistemas /asados en microcontroladores( microcontroladores(
'
TMR0
0
89u: tiene de especial; Es
un contador de & /its( ,e puede leer para sa/er cual es alor actual de las cuentas o puede p uede ser escrito Reloj Externo Reloj Interno para colocar un alor inicial( inicial( terminal RA<=TOC>! RA<=TOC>! Posee un /loque de preescalamiento que permite ampliar el ran1o de las cuentas( Contador de eventos 2enera una se3al de interrupci)n cuando se produce un des/orde en el re1istro TMR0 4cuando pasa de 05%% a 006( 7it T0I% del re1istro INTCON
Temporizador Temporizador
8C)mo manejo el TMR0; Para manejar el TMR0 se de/e confi1urar el re1istro OPTION?RE2 en el /anco ! del condi1o de pro1ramaci)n
Confi1uraci)n del OPTION?RE2 ! ClocD e5terno pin RA<=T0C>I /it @ T0CS: Bit selector de fuente para el TMR0 0 ClocD interno4C.>O+T6 ! Incrementa en flanco de /ajada en pin T0C>I /it < T0SE:Bit selector de flanco 0 Incrementa en flanco de su/ida en pin T0C>I ! Prescaler apa1ado /it PSA: Bits de asignación del preescaler 0 Prescaler es asi1nado al modulo TMR0 /it #B0 PS2:PS0: Bits selectores relacion de trabao
TMR0 COMO CONTAOR E EFENTO,
Eercicio: !ise"ar un programa en el P#C$%&'(( para contar e)entos con flancos de baada en RA*+T0C,# - mostrar la cuenta en el puerto B. Solución: confi1urar
1
el re1istro OPTION?RE2 en funci)n al ejercicio propuesto
1
1
1
1
Por tantoG OPTION?RE2 !!!! !000
0
0
0
C)di1o del pro1ramaG list p=16f877 ;Comando que indica el Pic usado include "p16f877.inc" ;Etiquetas genéricas para el Pic16F877 org ! nop (inicio )sf )cf
;nicio del programa en la posici#n cero de ;memoria ;$i%re &uso del de%ugger'
*+,+-*/P *+,+-*/P1
;r %anco 1
0ol2 %311 ;P, como entrada digital 0o2f ,4C51 0ol2 !FF 0o2f +/*, ;P, entrada Clrf +/*) ;P) salida OPTION?RE2 !!!! !000 mol2 ;alor a escri%ir en el registro de configuraci#n %3111113 ;del +0/ mo2f 5P+5(/E ;Configuracion del +0/5 %cf %cf
*+,+-*/P *+,+-*/P1
clrf )-C$E mof mo2f goto
+0/
+0/: P5/+) )-C$E
;r %anco
;+0/= iniciali9amos el contador en cero
;:=+0/ ;Escri%e el alor de +0/ en P5/+) ;*alta a la etiqueta %ucle
Ejercicios propuestos: Diseñar
un programa en el PIC16F877 para contar eventos con flancos de subida en RA!"#C$I con un preescalamiento de 1%&' (ostrar la cuenta en el puerto )' Diseñar
un programa en base al PIC16F877 *ue rote un bit a la i+*uierda del puerto ) cada ve+ *ue ocurra cuatro eventos ,flancos de ba-ada en RA!"#C$I.' Diseñar
un programa en base al PIC16F877 para contar eventos ,flancos de ba-ada en RA!"#C$I. / mostrar la cuenta en un displa/ de 7 segmentos conectado al puerto )' Cuando las cuentas llegan a 0 pasan de nuevo a #' Diseñar
un programa en base al PIC16F877 para contar eventos ,flancos de ba-ada en RA!"#C$I. / mostrar la cuenta en tres displa/s de 7 segmentos'
TMR0 COMO TEMPORIHAOR
Eercicio: Programar el TMR0 para generar un retardo de un segundo. A partir del cual un /E! conectado al PRTC debe apagarse - prenderse indefinidamente. !ebe permanecer un segundo en cada estado. Solución: confi1urar
esta/lecer el retardo(
el re1istro OPTION?RE2 en funci)n al ejercicio propuesto "
Para generar retardos es necesario usar el modulo "(R# como tempori+ador por lo tanto es necesario colocar el bit T0CS a 0 n ciclo de instrucci2n 3 4"osc , donde "osc es el inverso de la frecuencia del cloc5 *ue usa el PIC.
Retardo_T0= !Tosc! TMR0 l tiempo mimo ser9a% Retardo:"# 34"osc4&;6 de (=+> tendriamos% &;6 us'
Retardo_T0_"re= !Tosc!TMR0!"reescaler# Retardo:"#:Pre3 '#'&;us4&;64&;6 36;;?6 us 36;';?6 ms @o alcan+a a un segundo' Pero podr9amos lograr retardos ma/ores usando bucles% Retardo3)ucle4Retardo:"#:Pre Retardo3)ucle46;>;?6ms Como el Retardo debe ser 1seg 1###ms 3)ucle46;>;?6 )ucle31;'&;
Por tanto no existe una sino múltiples soluciones considerando este último punto y la fórmula :
Retardo <ToscTMR0Preescaler7ucle
1
1
0
0
0
1
1
0
1
1
0
0
0
Por tantoG OPTION?RE2 !!00 0!!0
1
1
0
C)di1o del pro1ramaG
list p=16f877 ;Comando que indica el Pic usado include "p16f877.inc" ;Etiquetas gen éricas para el Pic16F877 C5+, E- !< ;aria%le C5+, en direcci ón !< e!adecimal de ;memoria /,0 org ! ;nicio del programa en la posici ón cero de ;memoria nop ;$i%re &uso del de%ugger' (inicio %sf *+,+-*/P ;r %anco 1 %cf *+,+-*/P1 clrf mol2 mo2f
+/*) ;P5/+) salida OPTION?RE2 !!00 0!!0 %31111 ;Configuración del modulo +0/ 5P+5(/E ;Preescaler = 1<8
%cf *+,+-*/P %cf *+,+-*/P1 clrf (%ucle %sf call %cf call goto
P5/+)
;r %anco
;P5/+) =
P5/+) (retardo ;$lama la rutina de retardo P5/+) (retardo (%ucle ;r (%ucle
Sub-rutina de retardo
(retardo mol2 mo2f (espera1 clrf mol2 mo2f (espera %tfss goto decfs9 goto return
d36>3 C5+,
;+ = > ? +osc ? alor de +0/ ? Preescaler ;Cargar el alor de C5+, para 1 segundo
+C5 d31@>3 +0/
;4esa%ilitar interrupciones ;Cargar el alor de +0/ para 1<< cuentas ;&Complemento'
+C5+F (espera C5+,F (espera1
;Esperar des%orde del +0/ ;4ecrementar el registro C5+, asta cero ;*i no es ceroA ir a (espera1
;retorno de call
E4
Cuando se produce un desborde en el registro TMR0 1cuando pasa de 0&& a 003 el Bit T0#& del registro
Ejercicios: Programar
el TMR0 para generar un retardo de un segundo ! partir del cual se incrementa un contador cuyo valor se muestra por el P"RTC Programar
el TMR0 para generar un retardo de #00 ms Cada vez $ue concluya el tiempo se activar% el P"RTC de forma escalonada Programar
el TMR0 para generar un la pala&ra '"(!) letra por letra) con un retardo de 0)*# segundos en un display de + segmentos conectado al P"RTC
TIMER0 en C (a función para con,gurara el TMR0 es:
setup-timer-0 .mode) Parameters: mode may be one or two of the constants dened in the devices .h le.
RTCC_INTERNA! RTCC_E"T__T#_$ or RTCC_E"T_$_T#_ RTCC_%I&_'! RTCC_%I&_(! RTCC_%I&_)! RTCC_%I&_*+! RTCC_%I&_,'! RTCC_%I&_+(! RTCC_%I&_*')! RTCC_%I&_'+ P/C1222 only: RTCC-"33) RTCC-1-4/T "ne constant may &e used from eac5 group or6ed toget5er 7it5 t5e 8 operator
TIMER0 en C l compilador de C suministra una serie de funciones para leer o escribir en el "I(R#'
Para escri&ir un valor en el registro TMR0: set(timer &alor';
BB alor=entero de 8 %its.
Para leer el valor actual del registro TMR0: alor=get(timer &';
BB alor=entero de 8 %its.
TIMER0 en C -emplo% tili+ando la interrupci2n del "(R#> generar una señal cuadrada de 1$=+
por tanto el tiempo alto de la señal cuadrada ser de #>; ms o ;##us'
TIMER0 en C
TMR$
•9l
TMR Tiene &its distri&uidos en dos registros) el TMR( y el TMR' •Cuenta
desde 00005 5asta 33335) si des&orda se activa el &it TMR/3 en el registro P/R •9l
TMR se con,gura en el
banco 0
usando el
registro T*C#N.
• Tiene
tres Temporizador) !s
formas Contador
de funcionamiento: ;
TC"=
•9l
&it de des&orde del TMR es el TMR/3 u&icado en el registro PR/ •Para
con,gurar el TMR primero se de&e des5a&ilitar el TMR0 colocando "PT/"=-R9>? 0000000 en el &anco
0 0
0
0
0
0
9l retardo esta dado por:
Retardo/ (ToscTMR*1reescaler 9jemplo: si sa&emos $ue el cristal es de @ M'z) el preAescalamiento es de a 1 y usamos el TMR completo 9ntonces el retardo es: Retardo ? @ B 0*#us B##B1? 0#*@*11 s
Ejemplo: reali'ar ua subrutia co retardo de 0#$22 se*udos utili'ado el TMR1# Solució: Primero des5a&ilitamos el TMR0 en el &anco movlw movw#
!"0000000! O$TIO%_RE&
do con,guramos el TMR en el registro TC"= en el &anco lw w#
!00""0000! T"CO%
Tercero y último paso realizamos la rutina de retardo ret'ro # $"RI*T+R"I, lr# T+R"L lr# T+R"H s# T"CO%*T+R"O% esper'r t#ss $"RI*T+R"I, -oto esper'r # T"CO%*T+R"O% retur.
TIMER* en C (a función para con,gurara el TMR es:
setup-timer- .mode) Parameters: mode values may be:
T*_%ISA2E%! T*_INTERNA! T*_E"TERNA! T*_E"TERNA_S3NC T*_C4_#5T T*_%I&_23_*! T*_%I&_23_'! T*_%I&_23_(! T*_%I&_23_) constants from diDerent groups may &e or6ed toget5er 7it5 8 setup_timer_" ( T"_DI/1LED ); setup_timer_" ( T"_I%TER%L | T"_DIV_1_3 ); setup_timer_" ( T"_I%TER%L | T"_DIV_1_4 );
TIMER* en C l compilador de C suministra una serie de funciones para leer o escribir en el "I(R1'
Para escri&ir un valor en el registro TMR: set(timer1 &alor';
BB alor=entero de 16 %its.
Para leer el valor actual del registro TMR: alor=get(timer1 &';
BB alor=entero de 16 %its.
TIMER* en C -emplo% tili+ando la interrupci2n del "(R1> para generar un retardo de 1 segundo ; s / se repite dos veces'
TIMER* en C
TMR2
TMR2 es u tempori'ador de bits co u prescaler (di-isor de .recuecia pre-io), u re*istro de periodo ("R2) /ue marca el -alor mimo /ue puede alca'ar la cueta de TMR2 u postscaler (cotador de coicidecias etre TMR2 "R2) El re*istro TMR2 se puede leer escribir desde el 3cleo del microcotrolador# TMR2 puede trabajar como tempori'ador pero o como cotador de .lacos eteros El cotador TMR2 puede cotar desde 000 4asta el -alor car*ado e "R2, e el ciclo si*uiete al de esa coicidecia, el cotador -uel-e a cero El TMR2 tambi5 se puede utili'ar para *eerar ua se6al de reloj para tras.erecias serie s7croas mediate el puerto serie s7croo (SS") El TMR2 se emplea adems como base de tiempos para los módulos CC" cuado se co.i*ura e modo "8M (-5ase módulos CC")#
bit 6 No i78le7entado: Se lee co7o 0 bit +:, T#5T1S,:T#5T1S0: bits de selección del 8ostscaler del Ti7er' 0000/ *:* 1ostscale 000*/ *:' 1ostscale 9 9 9 ****/ *:*+ 1ostscale bit'TMR'#N: 2itde 8aroarran;ue del TMR' * / Ti7er' on 0 / Ti7er' o< bit *:0 T'C41S*:T'C41S0: 2its de selección de 8rescaler del Ti7er' 00/ 1rescaler is *
n el caso de "(R# / "(R1 era necesario precargar un valor de partida en la cuenta / el flag correspondiente se activaba al desbordar el contador> esto obligaba a volver a precargar de nuevo el contador para iniciar una nueva tempori+aci2n' n el caso de "(R&> la cuenta va desde ### Basta el valor de PR& / en el ciclo siguiente el contador vuelve a cero por Bardare> con lo cual no es necesario precargar por softare ningn valor peri2dicamente / las tempori+aciones tendrn una duraci2n fi-a mientras no se modifi*ue el registro de periodo ,PR&.' @o obstante> tambiEn ser9a posible precargar un valor en "(R& aun*ue no ser lo Babitual ms *ue en el principio de todo el proceso' l flag "(R&IF se pondr a 1 cuando produ+ca un nmero de coincidencias entre "(R& / PR& igual al valor establecido para el postscaler' el tiempo de rebosamiento mimo del postscaler ,overflo. ser9a% ,!fosc.4,Prescaler mimo.4&;64 ,Postscaler mimo. 3 ,!fosc. 4 164&;6416 3 ,!fosc. 4 6;;?6 *ue supondr9a un valor de tempori+aci2n mimo igual *ue el *ue se puede conseguir con el tempori+ador "(R# pero inferior al mimo alcan+able con "(R1
Realizar un retarde de *0ms usando el TMR* -Calculamos los valores a cargar -Pre?) PR*?*@ y Pos?0 -Retardo?B.*@EFB0Bus?*0ms P!;"; -9n el &anco se carga el valor de PR* movl7*@ mov7fPR* -9n el &anco 0 se carga los valores de con,guración el T*C"=
0 movl7 mov7f
0
0x@4 T*C"=
0
0
-Realizamos
la su&rutina de retardo:
Ret'ro lr# T+R2 # $IR"* T+R2I, s# T2CO%* T+R2O% Esper' t#ss $IR"* T+R2I, -oto Esper' # T2CO%* T+R2O% retur.
TIMER' en C (a función para con,gurara el TMR*es:
setup-timer-* .mode,period,postscale)
Parameters: mode =alues 7a> be: T'_%ISA2E%! T'_%I&_23_*! T'_%I&_23_(! T'_%I&_23_*+
period is a int 0-' t?at deter7ines @?en t?e cloc =alue is
reset! postscale is a number 1-16 that determines how many timer overows before an interrupt: (1 means once, means twice, and so on).
setup_timer_2 ( T2_DIV_1_3* 050* 2);
TIMER' en C l compilador de C suministra una serie de funciones para leer o escribir en el "I(R&'
Para escri&ir un valor en el registro TMR*: set(timer< &alor';
BB alor=entero de 8 %its.
Para leer el valor actual del registro TMR*: alor=get(timer< &';
BB alor=entero de 8 %its.
TIMER' en C -emplo% tili+ando la interrupci2n del "(R&> generar una señal cuadrada de 1$=+' por tanto el tiempo alto de la señal cuadrada ser de #>; ms o ;##us' un prescaler de / postscaler de 1 se tiene la siguiente ecuaci2n de desbordamiento% Retardo= Tosc!"reescaler !("R291)!postscaler $00us=1us !!("R291)!1 "R2=12
TIMER' en C