Sunteți pe pagina 1din 5

MANEJO DE BITS CON CONDICIÒN

BTFSS f,b
Bit Test File Skip Set f,b
(testea el bit “b” del registro f y si es “1” se salta a la subsiguiente
instrucción y si no es “1” continua con la siguiente instrucción)
EJM.- analice el siguiente conjunto de instrucciones:
BTFSS ESTADO,4 ; explora el bit 4 del registro ;ESTADO
CALL VALE_0 ; si el bit 4 vale 0 se ejecuta ésta
;instrucción
CALL VALE_1 ; si el bit 4 vale 1 se ejecuta ésta
;instrucción
--------------------------------------------------------------------------------------------
BTFSC f,b
Bit Test File Skip Clear f,b
(testea el bit “b” del registro f y si es “0” se salta a la subsiguiente
instrucción, si no es “0” continua con la siguiente instrucción)
EJM.- analice el siguiente conjunto de instrucciones:
BTFSC ESTADO,4 ; explora el bit 4 del registro ;ESTADO
CALL VALE_1 ; si el bit 4 vale 1 se ejecuta ésta
;instrucción
CALL VALE_0 ; si el bit 4 vale 0 se ejecuta ésta
;instrucción
Para la aplicación de estas instrucciones se pide escribir el
programa, simularlo e implementar un circuito de modo
que podamos ingresar 2 números de 4 bits, A y B,
compararlos. Como resultado de la comparación realizar:

• Que un motor gire en un sentido si A > B


• Que gire en sentido contrario si A < B
• Activar un zumbador si A = B
MANEJO DE IGUALDADES Y DESIGUALDADES
A) Comprobar la igualdad del contenido de 2 registros.
Para llamar a la subrutina IGUAL en un programa cuando se cumple que
contenidos de REG1 y REG2 se puede usar las siguientes instrucciones:
MOVF REG1,0 ; REG1 se carga en W
XORWF REG2,0 ; REG1 xor REG2 se carga en W
BTFSS ESTADO,2 ; si el bit 2 de ESTADO es “0”,
CALL IGUAL ; si bit 2 de ESTADO es “1” (Z=1)
CALL RUTMAYOR ; llama a IGUAL
B) Comprobar que un registro tiene un contenido mayor que otro
Para llamar a la subrutina MAYOR en un programa cuando se cumple
que contenidos de REG1 es mayor que el de REG2 se puede usar las
siguientes instrucciones:
RUTMAYOR
MOVF REG1,0 ; REG1 se carga en W
SUBWF REG2,0 ; REG2 – REG1 se carga en W
BTFSS ESTADO,0 ; si el bit “0” de ESTADO es “1”,
CALL MENOR
CALL MAYOR; como C=0, REG1 > REG2

C) Comprobar que un registro tiene un contenido menor que otro


Para llamar a la subrutina MENOR en un programa cuando se cumple
que contenidos de REG1 es menor que el de REG2 se puede usar las
siguientes instrucciones:

MOVF REG2,0 ; REG2 se carga en W


SUBWF REG1,0 ; REG2 – REG1 se carga en W
BTFSS ESTADO,0; si el bit “0” de ESTADO es “1”salta
CALL MENOR ; como C=0, REG1 < REG2

IGUAL BSF PORTB,3; RB21


CALL RETARDO1

MAYOR BSF PORTB,4; RB31

BCF PORTB,5; RB40

MENOR BCF PORTB,4; RB30

BSF PORTB,5; RB41


APLICACIÓN: PROGRAMA PARA ALARMA DE TRES ENTRADAS

Se tienen 3 detectores digitales, cada uno de los cuales provocará la activación de


un LED, diferente en cada caso. Uno de los detectores será un opto acoplador
ranurado (simulado también con dipswitch) y los otros 2 pueden ser 2 LDR uno que
detecte oscuridad y el otro que detecte luz (se simularán mediante 2 dipswitches).
El programa consiste en poner en marcha un zumbador cuando la alarma salte por
causa de la activación de cualquiera de los detectores. También se enciende el LED
correspondiente al detector o sensor activado. La alarma sólo funcionará cuando el
dipswitch conectado a I1 (bit RA0 del puerto A que actúa como master control), está
a nivel alto.

Analice el programa a SIMULAR e IMPLEMENTAR el circuito en


hardware. PARA LA PRACTICA DE LABORATORIO
; DIRECTIVAS DEL PROGRAMA
LIST P=16F84A ; Se emplea el PIC16F84A
RADIX HEX ; Sistema de numeración hexadecimal
; ETIQUETAS DEL PROGRAMA
W EQU 0x00 ; Registro de destino W: cuando d=0
F EQU 0x01 ; Registro de destino F: cuando d=1
Z EQU 0x02 ; Bit 2 del registro ESTADO
ESTADO EQU 0x03 ; El registro ESTADO ocupa la dirección 3 de los dos bancos
PUERTAA EQU 0x05 ; La PUERTA A ocupa la dirección 5 del banco 0 y su registro de
configuración la dirección 5 del banco 1
PUERTAB EQU 0x06 ; La PUERTA B ocupa la dirección 6 del banco 0 y su registro de
configuración la dirección 6 del banco 1
; PROGRAMA PRINCIPAL
ORG 0 ; El programa comienza en la dirección 0 y
goto INICIO ; salta a la dirección 5 para sobrepasar el
ORG 5 ; vector de interrupción
INICIO bsf ESTADO,5 ; RP0 1, Selección del banco 1
movlw 0xFF ; Se configura la puerta A como
movwf PUERTAA ; entrada
clrf PUERTAB ; Se configura la puerta B como salida
bcf ESTADO,5 ; RP0 0, Selección del banco 0
clrf PUERTAA ; Se inicializan las dos puertas a
clrf PUERTAB ; ceros
BUCLE btfss PUERTAA,0 ; Se explora el valor del microrruptor que indica si la
; alarma está o no conectada
goto DESCON ; Si está desconectada habrá que desactivar los LED
; y el zumbador por si estaban activados de una
; anterior pasada por el bucle
call SENS1 ; Se comprueba el estado de los tres sensores y se
; hace el tratamiento que corresponda con los LED
call SENS2
call SENS3
call ZUMB ; Si alguno de los sensores está activado el
; zumbador deber pitar, si no, no
goto BUCLE

DESCON clrf PUERTAB


goto BUCLE
; RUTINA DE TRATAMIENTO DEL SENSOR 1
SENS1 btfss PUERTAA,1 ; Si está a 1, hay que activar el LED correspondiente
goto DESACT1 ; Si no, hay que desactivarlo
goto ACT1
DESACT1 bcf PUERTAB,1
goto VOLVER1
ACT1 bsf PUERTAB,1
goto VOLVER1
VOLVER1 return
; RUTINA DE TRATAMIENTO DEL SENSOR 2
SENS2 btfss PUERTAA,2 ; Si está a 1, hay que activar el LED correspondiente
goto DESACT2 ; Si no, hay que desactivarlo
goto ACT2
DESACT2 bcf PUERTAB,3
goto VOLVER2
ACT2 bsf PUERTAB,3
goto VOLVER2
VOLVER2 return
; RUTINA DE TRATAMIENTO DEL SENSOR 3
SENS3 btfss PUERTAA,3 ; Si está a 1, hay que activar el LED
; correspondiente
goto DESACT3 ; Si no, hay que desactivarlo
goto ACT3
DESACT3 bcf PUERTAB,5
goto VOLVER3
ACT3 bsf PUERTAB,5
goto VOLVER3
VOLVER3 return
; RUTINA DE TRATAMIENTO DEL ZUMBADOR
ZUMB movf PUERTAA,W
andlw b'00001110' ; Con esta máscara, se consigue que sobre W quede sólo el valor de
los sensores. Si ninguno está
; activo, W contendr 0 y el flag Z se pondr a 1
btfss ESTADO,Z ; Si est a 1, hay que desactivar el zumbador
goto ACTZ ; Si no, hay que activarlo
goto DESACTZ
DESACTZ bcf PUERTAB,0
goto VOLVERZ
ACTZ bsf PUERTAB,0
goto VOLVERZ
VOLVERZ return
END