Bueno veo que te has complicado un poco, pero si estas usando MPLAB o tenes el archivo .inc ya tiene definido muchas cosas, como los PORTA, TRISA, cada uno de los bits de los registros, por ejemplo STATUS,RP0 , W y F entre otras.
Asi que eso por una parte, por la otra multiplicar se puede hacer de 2 formas distintas en binario. La primera es la que nos enseñan siempre. y es la de sumar tantas veces como sea la multiplicacion, la otra es rotar y sumar cuando se encuentre un 1. Dejo ambos codigos.
Pero intenta crearlos vos mismo, tus problemas fueron:
- no limpiaste bien los datos de entrada, observa que le hago una AND yo antes de guardarlos en ENTRADAx.
- Si te fijas en tu bucle, cargas W con 0 al entrar, y luego tu bucle suma 0 a ENTRADA1 ( ADD W F , sumar W con F ), lo unico que hace es Mover Entrada1 a Tempsalida una cantidad de veces dada por Entrada2. Pero se resumen en que Tempsalida va a tener siempre el valor de Entrada1.
Para mostrar los datos esta correcto, Tus principales fallas fueron las anteriores, que eran limpiar los datos bien (por que no sabes que hay en los otros bits, tenes que asegurarte que sean 0 ) y Crear una funcion que las sume correctamente.
Sumas consecutivas
LIST P=16F84A ;Indica el modelo de PIC que se usa
;Es un directiva del ensamblador
RADIX HEX ;Los valores se representan en hexadecimal
include "p16f84a.inc"
CBLOCK
ENTRADA1
ENTRADA2
TEMPSALIDA
ENDC
org 0x00 ;Vector de Reset
GOTO Configuracion
org 0x04 ;Vector de interrupcion
RETURN
Configuracion:
BANKSEL TRISA ; Banco 1 , esto luego el compilador lo reemplaza por los BSF/BCF a STATUS,RP0
movlw 0X0E
movwf TRISA
movlw 0X07 ;w entradas Y SALIDAS
movwf TRISB ;w trisa (las lineas de pb salida)
BANKSEL PORTA ; Banco 0
Inicio:
RRF PORTA, W ; De RA3-RA1 a RA2-RA0, quedando el valor xxxx xaaa
ANDLW b'00000111' ; Me aseguro que quede 0000 0aaa
MOVWF ENTRADA1
movf PORTB ; Este va directo, asi que queda xxxx xbbb
ANDLW b'00000111' ; Me aseguro que quede 0000 0bbb
movwf ENTRADA2 ; Ya tengo los datos, es hora de trabajarlos!
INCF ENTRADA2, F ; Incremento F entrada 2 en 1, esto me va a permitir que si es 0 , al restar el primero no sume nada
CLRF TEMPSALIDA ; Limpio mi registro donde se realiza la suma
MOVF ENTRADA1, W ; W = Entrada1
bucle
DECF ENTRADA2, F ; Entrada - 1
BTFSS STATUS, Z ; Es 0 ?
GOTO MostrarResultado; Si es 0: Muestro el resultado, por que termino
ADDWF TEMPSALIDA, F ; No es 0: Le sumo 1 Entrada1 a TempSalida y procedo a decrementar
GOTO bucle ; Vuelvo hasta que quede en 0
MostrarResultado ; Resultado en 000c cccc , debo llevarlo a cccc c000
RLF TEMPSALIDA, F
RLF TEMPSALIDA, F
RLF TEMPSALIDA, W ; Este ultimo que lo rote y que lo ponga en W, me ahorro una instruccion
MOVWF PORTB ; Muevo al puerto
GOTO Inicio
END ;Directiva que indica el final del programa
Como son 3 bits no me complique haciendo loops:
LIST P=16F84A ;Indica el modelo de PIC que se usa
;Es un directiva del ensamblador
RADIX HEX ;Los valores se representan en hexadecimal
include "p16f84a.inc"
CBLOCK
ENTRADA1
ENTRADA2
TEMPSALIDA
ENDC
org 0x00 ;Vector de Reset
GOTO Configuracion
org 0x04 ;Vector de interrupcion
RETURN
Configuracion:
BANKSEL TRISA ; Banco 1 , esto luego el compilador lo reemplaza por los BSF/BCF a STATUS,RP0
movlw 0X0E
movwf TRISA
movlw 0X07 ;w entradas Y SALIDAS
movwf TRISB ;w trisa (las lineas de pb salida)
BANKSEL PORTA ; Banco 0
Inicio:
RRF PORTA, W ; De RA3-RA1 a RA2-RA0, quedando el valor xxxx xaaa
ANDLW b'00000111' ; Me aseguro que quede 0000 0aaa
MOVWF ENTRADA1
movf PORTB ; Este va directo, asi que queda xxxx xbbb
ANDLW b'00000111' ; Me aseguro que quede 0000 0bbb
movwf ENTRADA2 ; Ya tengo los datos, es hora de trabajarlos!
CLRF TEMPSALIDA ; Limpio mi registro donde se realiza la suma
BCF STATUS, C ; Preparo el flag para cuando necesite rotar, ya que el carry esta en la rotacion y necesito que sea 0
BTFSC ENTRADA1, 0 ; Comienza la multiplicacion!
CALL Sumar
RLF ENTRADA2, F
BTFSC ENTRADA1, 1
CALL Sumar
RLF ENTRADA2, F
BTFSC ENTRADA1, 2
CALL Sumar
MostrarResultado ; Resultado en 000c cccc , debo llevarlo a cccc c000
RLF TEMPSALIDA, F
RLF TEMPSALIDA, F
RLF TEMPSALIDA, W ; Este ultimo que lo rote y que lo ponga en W, me ahorro una instruccion
MOVWF PORTB ; Muevo al puerto
GOTO Inicio
Sumar
MOVF ENTRADA2, W
ADDWF TEMPSALIDA
BCF STATUS,C ; Borro el carry para la rotacion de Entrada2
RETURN
END ;Directiva que indica el final del programa
Este segundo metodo se explica asi... Si por ejemplo tenes estos 2 registros:
0000 0101 = ENTRADA1
0000 0010 = ENTRADA2
Y los multiplicas
Es lo mismo que sumar:
0000 0010 + 0000 1000 = 0000 1010
El primer termino es debido a este 1: 0000 010
1, el segundo termino debido a este 1: 0000 0
101
Observa que los terminos son ENTRADA2 desplazado la misma cantidad de bits que donde hay un 1.
Espero que entiendas las 2 formas de "multiplicacion" que pueden existir en binario, lo demas sobre las instrucciones esta explicado en los codigos, podras ver en ambos codigos como podes separarlos en partes..
- La primera es la limpieza de los datos
- La segunda es la multiplicacion
- La tercera es mostrarlo
Si comparas ambos codigos solo cambio la segunda.
¿ Una es mejor que la otra ? Si.. Las sumas consecutivas o restas consecutivas dependen mucho de los valores manejados, en este caso de 3 bits, el maximo es un valor 7, es decir que el loop va a tener que ser realizado 7 veces como minimo, es decir sumar, restar uno de los indices,etc.
Mientras que el segundo metodo, tiene una pequeña variacion tal ves en el largo, pero si crearamos un Loop para este, solo se haria un loop por cada bit, al ser 3 bits solo se haria 3 veces.
En caso que te preguntes como seria con un loop
LIST P=16F84A ;Indica el modelo de PIC que se usa
;Es un directiva del ensamblador
RADIX HEX ;Los valores se representan en hexadecimal
include "p16f84a.inc"
CBLOCK
ENTRADA1
ENTRADA2
TEMPSALIDA
CONTADOR
ENDC
org 0x00 ;Vector de Reset
GOTO Configuracion
org 0x04 ;Vector de interrupcion
RETURN
Configuracion:
BANKSEL TRISA ; Banco 1 , esto luego el compilador lo reemplaza por los BSF/BCF a STATUS,RP0
movlw 0X0E
movwf TRISA
movlw 0X07 ;w entradas Y SALIDAS
movwf TRISB ;w trisa (las lineas de pb salida)
BANKSEL PORTA ; Banco 0
Inicio:
RRF PORTA, W ; De RA3-RA1 a RA2-RA0, quedando el valor xxxx xaaa
ANDLW b'00000111' ; Me aseguro que quede 0000 0aaa
MOVWF ENTRADA1
movf PORTB ; Este va directo, asi que queda xxxx xbbb
ANDLW b'00000111' ; Me aseguro que quede 0000 0bbb
movwf ENTRADA2 ; Si llego aca ninguno es cero. Y ya tengo los datos, es hora de trabajarlos!
CLRF TEMPSALIDA ; Limpio mi registro donde se realiza la suma
MOVLW 0x03
MOVWF CONTADOR
Multiplicar:
RRF ENTRADA1, F
BTFSS STATUS,C
CALL Sumar
BCF STATUS,C ; Borro el carry para la rotacion de Entrada2
RLF ENTRADA2, F
DECFSZ CONTADOR, F
GOTO Multiplicar
MostrarResultado ; Resultado en 000c cccc , debo llevarlo a cccc c000
RLF TEMPSALIDA, F
RLF TEMPSALIDA, F
RLF TEMPSALIDA, W ; Este ultimo que lo rote y que lo ponga en W, me ahorro una instruccion
MOVWF PORTB ; Muevo al puerto
GOTO Inicio
Sumar
MOVF ENTRADA2, W
ADDWF TEMPSALIDA
RETURN