SISTEMAS ELECTRONICOS DIGITALES SALTO CONDICIONAL El repertorio del PIC16F84 también dispone de instrucciones de salto condicional, que son aquéllas que producen un salto en función de que se cumpla o no una condición. Estas instrucciones son el único medio para realizar bifurcaciones condicionales en un programa. El repertorio de instrucciones del PIC16F84 incluye cuatro instrucciones de salto condicional clasificadas en dos grupos: SALTOS EN FUNCIONDE UN BIT • Aquéllas que pueden producir el salto en función del estado de un bit. Son btfsc y btfss INSTRUCCION BTFSC F,B (BIT TEST F, SKIP IF CLEAR) SI EL BIT NUMERO B DEL REGISTRO F ES 1 LA INSTRUCCIÓN QUE SIGUE A ESTA SE EJECUTA NORMALMENTE, SI EL BIT ES 0 LA INSTRUCCIÓN QUE SIGUE A ESTA SE IGNORA Y SE SALTA. INSTRUCCIÓN BTFSS F,B (BIT TEST F, SKIP IF SET ) SI EL BIT NUMERO B DEL REGISTRO F ES 0. LA INSTRUCCIÓN QUE SIGUE A ESTA SE EJECUTA NORMALMENTE, SI ES 1 SE IGNORA Y SE SALTA. SALTOS EN FUNCION DE UN REGISTRO Aquéllas que pueden producir el salto en función del contenido de un registro distinto de cero. Son decfsz e íncfsz. INSTRUCCIÓN DECFSZ F,D (DECREMENT F, SKIP IF 0) Decrementa en una unidad el contenido del registro F, almacena el resultado en W si d=0(EN ESTE CASO F NO VARIA) y en el registro F si d=1. después de decrementar pueden suceder dos casos: 1) si el resultado es distinto de cero la instrucción que sigue se ejecuta normalmente. 2) Si el resultado es cero la instrucción que sigue se ignora y se salta. INSTRUCCION INCFSZ F,D (INCREMENT F,SKIP IF 0) Incrementa en uno el contenido del registro F, almacena el resultado en W si d=0 (F no varia) y se almacena en F si d=1.despues de incrementar suceden dos casos. 1) si el resultado no es cero, la instrucción que sigue se ejecuta normalmente. 2) Si el resultado es cero( porque al incrementarse se ha desbordado y ha pasado del numero binario 11111111 al 00000000 ) la instrucción que sigue se ignora y se salta. INSTRUCCIÓN SUBWF INSTRUCCIÓN SUBLW EJEMPLO. VERIFICAR QUE UN REGISTRO VALE 0. PARA SABER SIN UN REGISTRO VALE CERO, HAY QUE CARGAR EL REGISTRO SOBRE SI MISMO MEDIANTE MOVF, SE LOGRA POSICIONAR EL FLAG Z SIN VARIAR SU CONTENIDO Movf registro,f ;recordar, el contenido del registro F se carga en el registro destino d, si d=0 el destino es W, si d=1 el destino es F. Ademas de que el bit(flag) Z del registro STATUS se activa a 1 si el resultado de la operación es 0. Btfss STATUS,Z ; ¿Es cero?, ¿Z=I? Goto noescero ; NO Es cero ; Sí es cero y ejecuta la parte del programa correspondiente … Noescero EN EL EDITOR MPLAB ESCRIBA EL PROGAMA SIGUIENTE Y COLOQUE LOS COMENTARIOS PARA DEDUCIR LO QUE REALIZA EL PROGRAMA __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84A INCLUDE <P16F84A.INC> Numero EQU d'13' ORG 0 Inicio bsf STATUS,RP0 clrf TRISB movlw b'00011111' movwf TRISA bcf STATUS,RP0 Principal movlw Numero subwf PORTA,W movlw b'11111111' ; ; ; ; ; ; btfss STATUS,Z movlw b'01010101' movwf PORTB goto Principal ; ; ; ; ; ; ; ; END ; SUBRUTINAS Una subrutina es un conjunto de instrucciones al que se tiene acceso desde cualquier punto del programa principal. Es decir, una subrutina es un subprograma que se ejecuta cada vez que el programa principal lo necesita. Como una subrutina conceptualmente queda fuera del flujo secuencial del programa principal , es necesario un mecanismo para llegar a ella, y una vez ejecutadas las instrucciones, debe ser posible regresar al punto donde se quedo la ejecución del programa. La llamada a la subrutina se realiza con la instrucción “call” y para el retorno de la subrutina se realiza con la instrucción “return”. SUBRUTINAS ANIDADAS. Cuando una subrutina llama a otra subrutina, se llama anidamiento de subrutinas, cada call sucesivo sin que intervenga un return crea un nivel de anidamiento adicional. LA PILA La pila (stack en inglés) es una zona de memoria que se encuentra separada tanto de la memoria de programa como de la de datos dentro del microcontrolador, su estructura es del tipo LIFO (Last In First Out) por lo que el último dato que se guarda es el primero que sale. La manera de cargar la pila es a través de la llamada a subrutina con la instrucción call, que almacena el contenido del contador de programa (PC) en la posición superior de la pila, para recuperar el contenido de la pila en el PC, hay que ejecutar la instrucción de retorno return. VENTAJAS 1. se pueden escribir como subrutinas secciones de código y ser empleadas en varios programas. 2. dan a los programas un carácter modular, se obtienen una librería de subrutinas. 3. reduce tiempo de programación. 4. las instrucciones no aparecen en el programa principal. Solo figuran las llamadas call. Las bibliotecas de subrutinas se denominan LIBRERIAS, la directiva INCLUDE , realiza esta funcion pegándo el archivo correspondiente. RETARDOS En muchas aplicaciones y proyectos con microcontroladores es necesario generar tiempos de espera, denominados tiempo de retardo. Estos intervalos pueden conseguirse mediante una subrutina de retardo, basada en un lazo simple de instrucciones que se repiten tantas veces como sea necesario, hasta conseguir el retardo deseado. Se conoce el tiempo de ejecución de cada instrucción, entonces lo que hay que hacer es calcular el valor inicial que debe tener un registro CONTADOR1 que actua como el contador del número de iteracciones en el bucle, y así tener el tiempo de retardo deseado. EL TMR0 (TIMER 0) El PIC16F84 dispone de un timer principal denominado Timer 0 o TMR0 que es un contador ascendente de 8 bits. El TMRO se inicializa con un valor, que se incrementa con cada impulso de entrada hasta su valor máximo b' 11111111 '; con el siguiente impulso de entrada el contador se desborda pasando a valer b'00000000', esto se advierte mediante la activación del flag de fin de cuenta TOIF localizado en el registro INTCON. Un timer se implementa por medio de un contador que determina un tiempo preciso entre el momento en que el valor es cargado y el instante en el que se produce su desbordamiento. Un timer típico se consiste en un contador ascendente (también podría ser descendente) que, una vez inicializado con un valor, su contenido se incrementa con cada impulso de entrada hasta llegar a su valor máximo , desbordando y volviendo a comenzar desde cero. Los impulsos aplicados al TMRO, pueden provenir de los pulsos aplicados al pin TOCKI o de la señal de reloj interna (Fosc/4), lo que le permite actuar de dos formas diferentes : A)Como contador de los impulsos que le llegan por el pin RA4/TOCKI. Como temporizador de tiempos El actuar de una u otra forma depende del bit TOCS del registro OPTION: Si TOCS = 1, el TMRO actúa como contador. Si TOCS = 0, el TMRO actúa como temporizador TMRO COMO CONTADOR Cuando el TMRO trabaja como contador se le introducen los impulsos desde el exterior por el pin RA4/TOCKI (TMRO External Clock Input). Su misión es "contar" el número de acontecimientos externos representados por los impulsos que se aplican al pin TOCKI. El tipo de flanco activo se elige mediante el bit TOSE del registro OPTION: Si TOSE = 1, el flanco activo es descendente. Si TOSE = 0, el flanco activo es ascendente TMRO COMO TEMPORIZADOR Cuando el TMRO trabaja como temporizador cuenta los impulsos de Fosc/4. Se usa para determinar intervalos de tiempo concretos. Estos impulsos tienen una duración conocida de un ciclo máquina que es cuatro veces el periodo de la señal de reloj. Para una frecuencia de reloj igual a 4 MHz el TMR0 se incrementa cada 1 s, tal como se calculó anteriormente. Como se trata de un contador ascendente el TMR0 debe ser cargado con el valor de los impulsos que se desean contar restados de 256 que es el valor de desbordamiento. Por ejemplo, para contar cuatro impulsos, se carga al TMRO con 256-4 = 252: Número de pulsos a contar: 410 = b'00000100'. Número a cargar: 25610- 410= 25210 = b'11111100'. Incremento a cada ciclo de instrucción: b' 111111 00', b' 111111 O 1', b' 11111110', b' 11111111 " aquí se desborda pasando a b' 0000000' y activando el flag T0IF. De esta manera, con la llegada de cuatro impulsos, el timer se ha desbordado llegando al valor b'00000000' que determina el tiempo de temporización, en este caso 4 s si los impulsos se hubieran aplicado cada microsegundo TMRO ES UN REGISTRO DEL SFR y es un registro de propósito especial ubicado en la posición 1 del área SFR de la RAM de datos . Puede ser leído y escrito al estar conectado directamente AL BUS DE DATOS PRESCALER ,DIVISOR DE FRECUENCIA A veces es necesario controlar tiempos largos y aumentar la duración de los impulsos que incrementan el TMR0. Para cubrir esta necesidad se dispone de un circuito programable llamado. Divisor de Frecuencia o Prescaler que divide la frecuencia utilizada por diversos rangos para poder conseguir temporizaciones más largas . el PIC16F84 dispone de dos temporizadores: a) El TMR0, que actúa como temporizador principal. b) El Watchdog (perro guardián), que vigila que el programa no se "cuelgue". Para ello, cada cierto tiempo comprueba que el programa está ejecutándose normalmente y, si no es así, reinicializa todo el sistema. El Prescaler puede aplicarse a uno de los dos temporizadores, al TMR0 o al watchdog. Cuando se asigna al TMR0 los impulsos pasan primero por el divisor de frecuencia y una vez aumentada su duración se aplican a TMR0. BITS DE CONFIGURACiÓN DEL TMRO Para controlar el comportamiento del TMR0 se utilizan algunos bits de los registros OPTION e INTCON. El registro INTCON es un registro localizado en la dirección OBh del Banco 0 y duplicado en la 8Bh del Banco 1. Contiene los 8 bits que se muestran , de los cuales se utilizará por ahora únicamente el T0IF TOIF (TMRO Overjlow Interrupt Flag bit). Flag de interrupción del TMR0 Indica que se ha producido un desbordamiento del Timer 0, que ha pasado d= b' 11111111' a b'00000000'. TOIF = 0. El TMR0 no se ha desbordado. TOIF = 1. El TMR0 se ha desbordado. (Debe borrarse por software). registro OPTION La misión principal del registro OPTION es gobernar el comportamiento del TMR0. Algunos microcontroladores PIC tienen una instrucción denominada tambiéL option, por ello, el fabricante Microchip recomienda darle otro nombre a este registro. Asi en el archivo de definición de etiquetas PI6F84A.INC se le nombra como OPTION_REG PS2:PSO. (Prescaler Rate Select bits). Bits para seleccionar los valores del Prescaler o rango con el que actúa el divisor de frecuencia, según la tabla siguiente. • PSA (Prescaler Assignment bit). Asignación del divisor de frecuencia. PSA = 0. El divisor de rrecuencia se asigna al TMR0. PSA = 1. El divisor de frecuencia se asigna al Watchdog. Los bits utilizados por los timers son : TOSE (TMRO Source Edge Select bit). Selecciona flanco de la señal de entrada del TMR0 TOSE = o. TMRO se incrementa en cada flanco ascendente de la señal aplicada al pin RA4/TOCKI. TOSE = 1. TMRO se incrementa en cada flanco descendente de la señal aplicada al pin RA4/TOCKI. TOCS (TMRO Clock Source Select bit). Selecciona la fuente de señal del TMRO. TOCS = o. Pulsos de reloj interno Fosc/4 (TMRO como temporizador). TOCS = l. Pulsos introducidos a través del pin RA4/TOCKI (TMRO como contador). TMRO COMO TEMPORIZADOR .Se puede utilizar la siguiente fórmula para calcular el temporizado Temporización = TCM x Prescaler (256-Carga TMR0) temporización, es el tiempo deseado. Tcm es e1 período de un ciclo máquina e igual a TCM = 4 Tosc. Para 4 MHz ya se ado en anteriores ocasiones T CM = 4 l/f = 1microseg Prescaler es el rango de divisor de frecuencia elegido. (256-CARGA TMR0), es el número total de impulsos a contar por el TMR0 antes de desbordarse en la cuenta ascendente. "Carga TMRO" es el valor cargado inicialmente en el TMR0 tal como se ha explicado anteriormente. EJEMPLO Qué valor hay que cargar en el TMR0 para lograr un tiempo de 500 seg si se utiliza un Prescaler de 2? Sustituyendo en la ecuación anterior queda: Temporización = Tcm Presca/e' (256 - Carga TMRO) 500 = 1 x 2 (256 - Carga TMRO) luego el valor a cargar tiene que ser: Carga TMRO = 6 El valor de carga se podría poner en el programa TMR0_CARGA500S O bien: EQU d’5’ ; numero a cargar apara contar 250 pulsos antes de desbordarse TMR0_CARGA500S QUIZ 6 EQU d’256’-d’250’ 1.Reporte como opera la instrucción iorlw k , iorwf f,d de un ejemplo 2.Reporte como operan las instrucciónes rlf f,d y rrf f,d 3.¿cuál es la función del watchdog? 4.Proporcione un ejemplo de cómo se utilizan las instrucciones de incrementar (incf f,d) y decrementar(dec f,d) . 5.¿Para que se utiliza la instrucción SWAPF F,D? 6.Diga con cual instrucción el pic16f84a entra en modo de bajo consumo. 7. Diga como se carga la pila. 8. Diga como se logran tiempos mas largos de temporizado , por ejemplo para dos hrs, establezca un programa que realice esto. 9.diga como se puede utilizar el TMR0 como contador de pulsos externos. 10.Describa cada bit de los registros OPTION e INTCON 11.como se logra el salto condicional en el microcontrolador pic para realizar desiciones, o bifurcaciones. Bibliografía -Microcontroladores PIC , DISEÑO PRACTICO DE APLICACIONES. JOSE MA ANGULO USATEGUI. MC GRAW HILL REALIZAR UN PROYECTO