Es simple compañero.
En las especificaciones de cada comando te suele poner los bits que se ven afectados del STATUS en caso de realizar una operación y la forma de el comando y su uso.
En el caso de hacer una ADDWF, SWAP, INCF, DECF o cualquier otro comando que te permita guardar en F o en W podras hacerlo de las dos maneras.
Por ejemplo, en el caso de el comando ADDWF:
Sintaxis:
ADDWF f,d
Estados afectados: C, DC, Z
El contenido del registro W se suma al registro F. Si "d" es 0, el resultado se almacena en W; si "d" es 1, el resultado se guarda en el registro "f".
Al programar en MPLAB tienes que tener en cuenta que MPLAB interpretara ciertos comandos y los convertirá automaticamente sin problemas a lo que tendrían que ser realmente. Con esto quiero decir, que si tu en el comando de ADDWF pones:
ADDWF REGX,F -> Suma W con REGX y lo guarda en REGX.
seria lo mismo que poner:
ADDWF REGX,1
Solo que tu, en vez de ver un 1 ves una F y lo identificas mucho mejor.
Podrías hacer lo mismo con el registro W en vez de poner un 0.
La verdad es que de unos PICS a otros varían algunas cosas, pero en los datasheets de cada PIC esta todo. Veras los comandos y los estados afectados al terminar la operación. Cuando termina la operación si ves un estado afectado tendrás que ver por qué ese estado se ve afectado. Es decir, cuando desborda, si rotas un registro con RRF y sale un 1 que se va al C, etc... pero a eso ya llegarás más adelante.
Por eso te digo que en el caso este, como estas realizando una resta, que posiblemente será inferior a 0, tienes que poner una comprobación después de la operación para ver si el estado que te identifica que es negativo está activo.
Termina de testearlo y me cuentas de nuevo. Haz sumas y mira los estados. Haz restas en las que el resultado sea positivo y mira los estados y haz lo mismo con resultados negativos.
Por cierto. Si trabajas normalmente con MPLAB no hace falta que estes cambiando constantemente los numeros dentro de el programa. En esa misma ventana de "File Registers" en la parte de abajo dale a HEX.
Configura los registros de REGX, REGA y tal en las posiciones que te interesen. Por ejemplo en la 30, 40 y el resultado en la 50.
Y hazlo todo con los registros, es decir, muevo el registro A a W, se lo resto a B y lo almaceno en W, luego lo meto en RESU. Algo asi:
list p=16f876, f=INHX8M, r=hex
include "p16f876.inc"
MINU equ 20
SUST equ 30
RESU equ 40
org 0
Inicio movf SUST,W
subwf MINU,W
movwf RESU
goto Inicio
end
Con esto asi y con la ventana de FILE REGISTERS simplemente tendrás que indicar la cantidad en FILE REGISTERS, das doble click en el registro y pones la cantidad, simulas el programa paso a paso en MPLAB y vas viendo los estados afectados y en las casillas de los registros el resultado.
Por cierto, importante, asegurate también de revisar y borrar los estados afectados después de una operación, porque puede ser que lo siguiente que hagas también dependa de un estado despues de otra acción (aunque no es el caso) y que como esta afectado por la anterior, a lo mejor en esta no se ha visto afectado y te da error. Digamos que en la primera resta te da negativo, los estados se ven afectados y luego en la segunda resta no se ven afectados, como el estado no ha vuelto a su posición inicial el segundo resultado estará mal.
BITS Z, DC y C DE STATUSZ: Se pone a 1 después de una operación aritmético lógica con resultado 0. Se queda en 0 cuando el resultado lógico es distinto de 0.
DC: Bit de acarreo o debe. Se pone a 1 cuando hay acarreo en el cuarto bit (este no lo usarás prácticamente).
C: Bit de acarreo o debe en las instrucciones ADDWF, ADDLW, SUBLW, SUBWF. Se pone a 1 cuando hay acarreo en el 8 bit.
¿Esto que quiere decir?
- Que en estas operaciones, o en cualquier programa que quieras detectar que es un 0 podrás hacerlo a través de el bit Z de el status con btfsc.
-
Compruebas el carry que estará en 0., que se verá afectado después de realizar la resta y tendrás que hacer el "complemento a dos" sobre el resultado que te ha dado para sacar la cantidad exacta. Que es tu caso. Tenías razón. Al estar en 1 indica que es positivo, y al estar en 0 indica que es negativo.
Entonces, en el programa tendríamos que incluir esto:
list p=16f876, f=INHX8M, r=hex
include "p16f876.inc"
MINU equ 21
SUST equ 31
RESU equ 41
SIMB equ 40
org 0
Inicio bcf SIMB,0 ; Borramos indicador de símbolo, que estara en el bit 0 de SIMB.
movf SUST,W ; Movemos el sustraendo a W.
subwf MINU,W ; Restamos sustraendo a minuendo.
movwf RESU ; Guardamos resultado.
btfsc STATUS,C ; ¿Resultado negativo? ¿C=0?
goto Inicio ; No: Vuelve a inicio y hace otra operación.
bsf SIMB,0 ; Si: Incrementa la marca de el símbolo.
movlw b'11111111' ; Es lo mismo que poner 0xFF, la b indica binario.
xorwf RESU,F ; XOR entre F y W, guarda en RESU.
incf RESU,F ; Haciendo XOR con FF le damos la vuelta y sumándole 1 (incrementando 1 con este comando) para terminar el "Complemento a Dos".
goto Inicio ; Vuelve a inicio y hace otra operación.
end
Y, como vemos, he añadido el complemento a 2.
Si te da "11111100" hazle una operación XOR con FF.
11111100
11111111
-----------
00000011
Y le sumas 1, que te dará el cuatro
. No lo he comprobado, pero en teoría debería funcionar. Mañana lo miro, que ya es tarde.
Y ya... rizando el rizo, si sumas dos números que te den un resultado mayor a un byte tendrías que incrementar otro registro al lado de el resultado y... eso ya es otro capítulo.
Vaya testamento... me he liado bastante a escribir. Espero que te haya servido.
Suerte, cualquier duda ya sabes
Un saludo.