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