Amigos, necesito comparar un resgistro de entrada con una variable

Buenas tardes comunidad, soy principiante en el tema del lenguaje Assembler y los microcontroladores, me gustan mucho y me gustaria saber si me podrian ayudar con un problema que tengo.

Estoy realizando un secuenciador de luces con el pic 16f84a y ya tengo casi todo, pero me he quedado atascado en una parte, deseo hacer que si yo le ingreso por ejemplo al PUERTOA 10010, este tome el valor y vaya a una secuncia en especifico, si no es asi se apague, asi para varios datos. Lo logre hacer haciendo cuando se le ingresa un bit al puerto con la instruccion btfss pero esta solamente toma un bit mas no una constante.

Utilice la instruccion

movlw Numero ; Carga el número a comparar.
subwf PORTA,W ; (PORTA) - Numero --> (W).
movlw b'11110000' ; Supone (PORTA) es menor.
btfss STATUS,C ; ¿C=1?, ¿(W) positivo?, ¿(PORTA) >=
goto secuencia

no me funcino

y con ¡a funcion xor no me toma el dato

movlw PORTA
xorlw Numero
btfsc STATUS,Z
goto PRUEBA2
goto PREGUNTA

Agradezco su ayuda y sus aportes.
 
No entiendo bien lo que quieres hacer... pero alli te va una posible solucion:

Primero necesitas discriminar los bits que no quieres comparar, haciendo una operacion AND con una mascara... despues tienes 2 opciones... usar una resta y verificar que el numero sea cero o usar una xor y verificar que el resultado sea cero... aunque en realidad ambas dan el mismo resultado aveces se usa mas la resta ya que tambien te puede decir si el numero es mayor, menor (al verificar la bandera C) o igual (al verificar la bandera Z), en cambio la xor solo te dice si es igual o no

Código:
movf portb,w    ;copiamos puerto B a registro de trabajo
andlw b'00011111'    ;discriminamos bits mas significativos y el resultado queda en w
xorlw  Numero    ;verificamos si Numero = W
btfsc status,z     ;si Z=0 salta, si no, continua
goto  iguales
goto  diferentes
 
Muchas gracias por tu pronta respuesta chico3001

mira lo que tu me dices lo entiendo, ahora mira lo he planteado en el programa pero no me funciona, apenaas le inserto digamos un 1 en cualquier parte del puerto a, el se va a la secuencia.

Mira el codigo que tengo es el siguiente:

#define REG1 b'00011111'

PREGUNTA

movf PORTA,w
andwf B'00011111'
xorlw REG1
btfsc STATUS,Z
goto PRUEBA2
goto PREGUNTA

al final lo unico que el me esta haciendo es que si le ingreso un bit en cualquier posicion se salga de el ciclo prueba.

Que podria hacer en este caso
 
Pediste una comparacion con un valor especifico.. y eso fue lo que se te dio.. en tu caso solo saldra del ciclo cuando hayas puesto los ultimos bits del puerto A en 1, si quieres cambiar la combinacion entonces cambias REG1 por otra cosa...

PERO si quieres que se salga cuando CUALQUIERA de las entradas sea 1.. entonces tienes que cambiar el algortimo... especificamente eliminas el XORLW REG1, y cambias el BTFSC por BTFSS
 
Amigo creo que he detallado cual era el error.

Aunque me queda algo de duda, ya que estoy comparando por ejemplo 1101 y en el puerto ingreso 1101 (Aclaro los 1 serian los pulsadores conectados a tierra y a su vez a VCC con una resistencia de 10k), pero no funciona, encambio si hago lo contrario 0010 si funciona. Tal vez debo tomar los que estan abiertos como 1 y los que se conecten a tierra y VCC como interrutores cerrados o unos logicos.

Y otra cosa, me gustaria saber que es lo que hace el operador and, ya se que elimina los 3 bits menos significativos, pero me gustaria saber como hace para eliminarlos.

Un saludo y muchas garcias de antemano Chico3001
 
Pues atravez de la tabla logica de la AND si ambos bits son 1, entonces el resultado es 1... y en cualquier otra combinacion es cero...

Sabiendo eso puedes armar "mascaras" con bits en 1 o 0 (no solo para AND sino para tambien para otras operaciones), y dejar pasar solo los bits que requieres....
 
Atrás
Arriba