Tema 8 Saltos (parte I) 1 Tema 8. Saltos Ya vimos el salto incondicional con “goto”. SALTOS CONDICIONALES El repertorio del PIC16F84 también dispone de instrucciones de salto condicional, que son aquellas 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. Hay 4 instrucciones de salto condicional clasificadas en 2 grupos: •btfsc, btfss à que pueden producir el salto en función del estado de un bit •decfsz, incfsz à que pueden producir el salto en función del contenido de un registro distinto de cero. Las instrucciones de salto no afectan a los flags del registro STATUS (C, DC y Z). 2 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN BIT Son muy poderosas ya que permiten al programa tomar decisiones en función del estado de un bit de cualquier registro o puerto de entrada/salida. Hay 2 instrucciones de este tipo: btfsc f,b btfss f,b 3 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN BIT Nemónico Descripción Bit Test f, Skip if Clear. (Salta si el bit “b” del “f” es 0.) btfsc f,b - Si el bit número “b” del registro “f” es “1” la instrucción que sigue a ésta se ejecuta normalmente. - Si el bit número “b” del registro “f” es “0” la instrucción que sigue a ésta se ignora y se salta. Ejemplo: Aquí btfsc Flag,1 ;Si el bit 1 del registro Flag es “0” salta Falso goto ProcesoX ; Ha sido “1” Verdad ........... ; Ha sido “0” Antes: Después: (PC)= Dirección de “Aquí” Si el bit 1 del registro Flag=0, (PC)=Dirección de “Verdad” Si el bit 1 del registro Flag=1, (PC)=Dirección de “Falso” 4 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN BIT Nemónico Descripción Bit Test f, Skip if Set. (Salta si el bit “b” del “f” es 1.) btfss f,b - Si el bit número “b” del registro “f” es “0” la instrucción que sigue a ésta se ejecuta normalmente. -Si el bit número “b” del registro “f” es “1” la instrucción que sigue a ésta se ignora y se salta. Ejemplo: Aquí btfss Flag,4 ;Si el bit 4 del registro Flag es “1” salta Falso goto ProcesoX ; Ha sido “0” Verdad ........... ; Ha sido “1” Antes: Después: (PC)= Dirección de “Aquí” Si el bit 4 del registro Flag=1, (PC)=Dirección de “Verdad” Si el bit 4 del registro Flag=0, (PC)=Dirección de “Falso” 5 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN BIT EJEMPLO: Saltos_01.asm 6 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN REGISTRO Las instrucciones de salto condicional: decfsz f,d incfsz f,d pueden producir el salto en función del contenido de un registro distinto de cero y son casos especiales de las instrucciones de incremento y decremento de un registro analizadas en el tema anterior (decf e incf). 7 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN REGISTRO Nemónico Descripción Decrement f, Skip if 0. ( (f)-1 à destino y salta si 0 si d=0, destino=(W) si d=1, destino=(f) ) decfsz f,d Esta instrucción decrementa en una unidad el contenido del registro f. Almacena el resultado en (W ) si d=0 y en (f) si d=1. Después de decrementar, pueden ocurrir dos casos: - Si el resultado es distinto de cero la instrucción que sigue a ésta se ejecuta normalmente -Si el resultado es cero la instrucción que sigue a ésta se ignora y se salta. Ejemplo: Aquí EsCero NoEsCero Antes: Después: decfsz Contador,F goto NoEsCero .................. ................... ................... (PC)= Dirección de “Aquí” (Contador)=(Contador)-1 y además: Si (Contador)=0, (PC)=Dirección de “EsCero” Si (Contador)≠0, (PC)=Dirección de “Aquí”+1 (goto NoEsCero) 8 Tema 8. Saltos SALTOS EN FUNCIÓN DE UN REGISTRO Nemónico Descripción Increment f, Skip if 0. ( (f)+1 à destino y salta si 0 si d=0, destino=(W) si d=1, destino=(f) ) incfsz f,d Esta instrucción incrementa en una unidad el contenido del registro f. Almacena el resultado en (W ) si d=0 y en (f) si d=1. Después de incrementar, pueden ocurrir dos casos: -Si el resultado es distinto de cero la instrucción que sigue a ésta se ejecuta normalmente. -Si el resultado es cero (porque al incrementarse se ha desbordado y ha pasado del número 0xFF al 0x00) la instrucción que sigue a ésta se ignora y se salta. Ejemplo: Aquí Continua Bucle Antes: Después: incfsz Contador,F goto Bucle ................... ................... ................... (PC)= Dirección de “Aquí” (Contador)=(Contador)+1 y además: Si (Contador)=0 (256), (PC)=Dirección de “Continua ” Si (Contador)≠0, (PC)=Dirección de “Aquí”+1 (goto Bucle) 9 Tema 8. Saltos COMPARACIÓN ENTRE REGISTROS Una de las más significativas aplicaciones de los saltos condicionales es la comparación entre registros: •COMPROBAR QUE UN REGISTRO VALE 0 •COMPROBAR LA IGUALDAD ENTRE 2 REGISTROS •COMPROBAR QUE UN REGISTRO ES MAYOR O MENOR QUE OTRO 10 Tema 8. Saltos COMPROBAR QUE UN REGISTRO VALE 0 Para saber si un registro es 0 hay que cargar el registro sobre sí mismo mediante la instrucción “movf”, y así el contenido de f no cambia pero sí se afecta al flag Z. Ejemplo: movf Dato,F btfss STATUS,Z goto NoesCero EsCero ............... ............... NoesCero............... ............... 11 Tema 8. Saltos COMPROBAR LA IGUALDAD ENTRE 2 REGISTROS Por ejemplo para comprobar si el contenido de los registros Dato1 y dato2 son iguales el programa sería: Ejemplo: movf Dato1,W subwf Dato2,W btfsc STATUS,Z goto Iguales NoIguales............... ............... Iguales ............... ............... ; (Dato1)à(W) ;(Dato2)-(Dato1)à(W) 12 Tema 8. Saltos COMPROBAR QUE UN REGISTRO ES MAYOR O MENOR QUE OTRO En este caso hay que realizar la resta de ambos. Así siendo A y B dos registros cualesquiera y haciendo la operación (A-B) se tienen las siguientes posibilidades: Operación (A-B) Resultado Flags A>B A<B A=B Positivo Negativo Cero C=1 y Z=0 C=0 y Z=0 C=1 y Z=1 13 Tema 8. Saltos COMPROBAR QUE UN REGISTRO ES MAYOR O MENOR QUE OTRO Ejemplo: MayorIgual Menor movf DatoB,W subwf DatoA,W btfss STATUS,C goto Menor ............... ............... ............... ............... ; (DatoB)à(W) ;(DatoA)-(DatoB)à(W) ;¿C=1? ;C=1, ha sido (DatoA)>=(DatoB) ;C=0, ha sido (DatoA)<(DatoB) 14 Tema 8. Saltos COMPROBAR QUE UN REGISTRO ES MAYOR O MENOR QUE OTRO Ejemplo (el de la práctica 2): 15 Tema 8. Saltos Más ejemplos con instrucciones de saltos…………….. 16 Tema 8. Saltos Ejemplo : Saltos_02.asm 17 Tema 8. Saltos Ejemplo ; Saltos_05.asm 18 BIBLIOGRAFÍA "Microcontrolador PIC16F84, Desarrollo de proyectos" E. Palacios, F. Remiro, L.J. López. Ra-Ma, 2004 Podéis encontrar más información de este Tema 8 en el CAPÍTULO 9 19