XORWF Exclusive OR W with f
Syntax: [ label ] XORWF f,d
Operands: 0 ≤ f ≤ 127
d ∈ [0,1]
Operation: (W) .XOR. (f) → (destination)
Status Affected: Z
Description: Exclusive OR the contents of the
W register with register 'f'. If 'd' is
0, the result is stored in the W
register. If 'd' is 1, the result is
stored back in register 'f'.
Hola a todos. Mi pregunta es que es lo que indica los operands ya que en algunas instrucciones es 0 ≤ f ≤ 127 y en otras de 0 ≤ f ≤ 255. Arriba dejo un ejemplo. Sospecho que por esto no esta andando mi programa.
PD: miren esto. en la hoja de datos del pic da como ejemplo (primer ejemplo) para la XORWF un numero de 8 bits.
Example XORWF REG 1
Before Instruction
REG = 0xAF <-----------Este es el numero, no concuerda con "Operands: 0 £ f £ 127" si es eso a lo que se refiere.
W = 0xB5
After Instruction
REG = 0x1A
W = 0xB5
Bueno.
Para comprender qué quiere decir ese "0 <= f <= 127" es necesario comprender a la perfección la arquitectura de esta familia de uC PIC.
El 16F877A posee su memoria RAM particionada en 4 bancos distintos.
Si mirás en el datasheet de este PIC, vas a poder ver una tabla donde muestra de manera resumida los 4 bancos de acceso a la RAM.
Entonces, podés observar que cada banco posee una cantidad de 0x80(128) registros de 8 bits cada uno.
¿Cómo se hace entonces, para acceder a cualquier registro en cualquier banco?
Bueno, debido a las limitaciones de los 14 bits de OPTCODE de esta familia y limitaciones en su arquitectura, para acceder a un registro, primero es necesario tener el banco correcto seleccionado.
Aquí intervienen los bits RP0 y RP1 del registro STATUS.
Entonces, en realidad, vos tenés por un lado 7 bits que pueden ser directamente declarados en la instrucción a utilizar, y dos bits que deben estar correctamente seteados antes de ejecutar dicha instrucción.
Resumiendo. Para acceder a cualquier registro de la RAM son necesarios 9 bits:
XXXXXXXXX
Donde:
X X XXXXXXX
RP1 RP0 F
Entonces, cuando utilizas una instrucción orientada a registro, como por ejemplo la XORWF el registro declarado son sólo los 7 bits menos significativos de esos 9 en total. Los otros dos se seleccionan mediante RP1 y RP0.
Vamos a los ejemplos:
Ejemplo 1:
BCF STATUS,RP1 ;indicar banco 0 (ó 1)
BCF STATUS,RP0 ;elegir banco 0 entre ambos
XORWF 0x60, 1 ;El XORWF afecta al registro 0x060 de la RAM.
Ejemplo 2:
BCF STATUS,RP1 ;indicar banco 0 (ó 1)
BSF STATUS,RP0 ;elegir banco 1 entre ambos
XORWF 0x60, 1 ;El XORWF afecta al registro 0x060 + 0x080 = 0x0E0 de la RAM.
Ejemplo 3:
BSF STATUS,RP1 ;indicar banco 2 (ó 3)
BCF STATUS,RP0 ;elegir banco 2 entre ambos
XORWF 0x60, 1 ;El XORWF afecta al registro 0x060+ 0x100 = 0x160 de la RAM.
Ejemplo 4:
BSF STATUS,RP1 ;indicar banco 2 (ó 3)
BSF STATUS,RP0 ;elegir banco 3 entre ambos
XORWF 0x60, 1 ;El XORWF afecta al registro 0x060+ 0x100 + 0x080 = 0x1E0 de la RAM.
Posible, pero no correcto:
BCF STATUS,RP1 ;indicar banco 0 (ó 1)
BCF STATUS,RP0 ;elegir banco 0 entre ambos
XORWF 0xF0, 1
Como 0xF0 > 127, entonces el MPASM elimina los bits que no "entran", quedandose solo con los 7 bits de menor peso. Entonces hacer:
XORWF 0xF0, 1
será tranformado por el MPLAB a:
XORWF 0x70, 1 ;(el MPLAB ignora el bit7 de 0xF0)
Otra cosa:
No confundamos:
Example XORWF REG 1
Before Instruction
REG = 0xAF <-----------Este es el numero, no concuerda con "Operands: 0 £ f £ 127" si es eso a lo que se refiere.
W = 0xB5
After Instruction
REG = 0x1A
W = 0xB5
----------------------------------
Este tema siempre produce confusiones en los que se inician a la programación.
NO HAY QUE CONFUNDIR LA POSICION DE MEMORIA DE UN REGISTRO CON SU CONTENIDO(VALOR).Hacé de cuenta que tenés 4 galpones gigantes numerados del 0 al 3(los 4 bancos de memoria).
Dentro de cada galpón hay 128 tanques con agua numerados desde el 0 al 127(los 128 registros de cada banco)
A su vez, cada tanque tiene una capacidad máxima de 255 litros(el valor que puede adoptar un registro de 8 bits, entre 0 y 255).
Si yo te pido que vayas y agregues 25 litros de agua al tanque 89 del galpón 2. ¿Cómo harías?
Y...yo haría:
BSF STATUS,RP1 ;selecciono banco 2(ó 3)(galpón 2 ó 3)
BCF STATUS,RP0 ;elijo banco 2 entre ambos(elijo galpón 2)
movlw .25 ;cargo 25 litros en el balde
addwf .89, 1 ;y se los agrego a lo que ya tenía el tanque 89.
Entonces, volvamos a lo que escribiste:
REG = 0xAF <-----------Este es el numero, no concuerda con "Operands: 0 £ f £ 127" si es eso a lo que se refiere.
Ese signo = se está refiriendo al valor del registro. No a su posición de memoria(no confundas la ubicación del tanque con la cantidad de litros de agua que contiene).
Te voy a mostrar el mísmo ejemplo del datasheet pero con todos los recuados contemplados:
Example XORWF REG 1
;Before Instruction
REG EQU 0x7A ;Respeto que 0 <= f <= 0x7F ya que 0 <= 0x7A <= 0x7F
;Ese EQU hizo que cada vez que escriba REG en el programa, el MPASM lo reemplace por 0x7A( es decir que estoy "apuntando" a la posición de memoria 0x?7A del PIC. El signo de pregunta(?) es porque, como explique antes, los bits RP0 y RP1 pueden modificar la posición final de memoria afectada)
movlw 0xAF
movwf REG ;(REG = 0xAF)
movlw 0xB5 ;(W = 0xB5)
XORWF REG 1
Hagamos la XOR en hoja y papel(electrónico
).
Entonces:
REG = 0xAF = 10101111
W = 0xB5 = 10110101
Hagamos entonces bit a bit la XOR:
10101111
XOR
10110101
--------------------------------
00011010
Resultado: 00011010 = 0x1A. Como "d(destino)" = 1, entonces el resultado se almacena en el registro REG. W permanece inalterado.
Resumiendo:
After Instruction
REG = 0x1A
W = 0xB5
¿Se comprendió?
Saludos.