TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: sota_de_bastos en 15 de Octubre de 2007, 13:27:19
-
hola,
¿hay alguna instruccion asm que permita conmutar un bit? es decir si el bit estaba a 0 ponerlo a 1 y viceversa.
saludos :-/
-
Creo que no la hay para 16F. De hecho, he probado a compilar esto en C:
output_toggle (PIN_B4);
y ha necesitado 4 instrucciones ASM para hacerlo:
0047: BCF 06.4
0048: MOVLW 10
0049: BCF 03.5
004A: XORWF 06,F
-
En assembler tienes la instrucción compf, pero te realiza la inversión de todos los bits de un byte.
Saludos.
-
ok, gracias de todas formas para conmutar todo el puerto ya está la x-or.
1 saludo.
-
En los 16F se usa la XOR. Es lo mas simple.
Supongamos que queres invertir el PIN RB4.
Simplemente se hace:
movlw b'00010000'
xorwf PORTB,F
Si queres invertir todo un registro, usá la COMF.
COMF Registro,F
porque hacerlo con XOR lleva dos instrucciones:
movlw 0xFF
xorwf Registro,F
Hay otras formas, pero utilizan mas instrucciones.
Saludos!.
-
Y para volver al estado anterior?? :mrgreen:
-
Y para volver al estado anterior?? :mrgreen:
Previamente lo guardas en una posición de la RAM y listo.
Saludos. :-/ :-/
-
Es que llevaria muchas instrucciones en assembler ese toggle... :mrgreen:
-
Y para volver al estado anterior?? :mrgreen:
Uy, uy, casi pico...
-
:D
-
Y para volver al estado anterior?? :mrgreen:
Uy, uy, casi pico...
Yo como un estúp... piqué :mrgreen: :mrgreen: :mrgreen:
Saludos. :-/ :-/
-
En los 16F se usa la XOR. Es lo mas simple.
Supongamos que queres invertir el PIN RB4.
Simplemente se hace:
movlw b'00010000'
xorwf PORTB,F
Si queres invertir todo un registro, usá la COMF.
COMF Registro,F
porque hacerlo con XOR lleva dos instrucciones:
movlw 0xFF
xorwf Registro,F
Hay otras formas, pero utilizan mas instrucciones.
Saludos!.
con la instruccion que tú pones... (
movlw b'00010000'
xorwf PORTB,F
¿no se estaría inviertiendo tambien todo el puerto? Según tengo entendido lo que hace la x-or es comparar y donde los bits son iguales saca un 0 y cuando los bits son distintos saca un 1, justo como en esta tabla de verdad.
xor
0 0 0
1 0 1
0 1 1
1 1 0
-
Efectivamente, es como describiste la teoria pero no se invierte todo el puerto.
Ejemplo:
Antes de la instruccion:
PORTB = b'10101010'
al hacer:
movlw b'00010000'
xorwf PORTB,F
la XOR hace esto:
10101010
XOR
00010000
-------------------------
10111010
Como podes ver, solo camabio el RB4 de estado.
Esto es asi cuando controlamos uno de los dos registros en juego. Pensemos que las instrucciones logicas se realizan, la mayoria de las veces, entre dos registros distintos(y no sobre un mismo registro).
Te paso una tabla de verdades que por ahi son mas utiles que las que tenes:
XOR:
Muy util para invertir bits o comparar valores iguales (A = B <-> A XOR B = 0).
Supongamos que tengo un registro MiReg= b'????????'
Si quiero invertir el valor de un pin de MiReg, harè una XOR con el bit correspondiente seteado a 1. Al resto de bits que no quiera invertir, los haré valer 0.
Ejemplo:
Quiero invertir el bit 1 de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'00000010'
xorwf MiReg,F
Despues de las instrucciones:
MiReg= b'??????¿?'
Donde ¿ es el estado inverso al que tenia antes de someter a MiReg a la XOR.
AND
Fuerza bits a valer cero.
Supongamos que tengo un registro MiReg= b'????????'
Si quiero forzar un/os bit/s de MiReg a valer 0, harè una AND con dicho/s bit/s en 0 . Al resto de bits que no quiera forzar a 0(conservaran su estado anterior) los haré valer 1.
Ejemplo:
Quiero forzar a cero todo el nibble bajo de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'11110000'
andwf MiReg,F
Despues de las instrucciones:
MiReg= b'????0000'
Otras conclusiones adicionales:
C = A AND B
C nunca puede valer más que lo que vale A o más que B. Puede valer menos que ambos, o bien igual a uno de ellos(o a ambos).
Conclusion: El resultado es siempre menor o a lo sumo igual al menor de los registros en juego.
IOR
Fuerza bits a valer uno.
Supongamos que tengo un registro MiReg= b'????????'
Si quiero forzar un/os bit/s de MiReg a valer 1, harè una IOR con dicho/s bit/s en 1 . Al resto de bits que no quiera forzar a 1(conservaran su estado anterior) los haré valer 0.
Ejemplo:
Quiero forzar a uno todo el nibble alto de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'11110000'
iorwf MiReg,F
Despues de las instrucciones:
MiReg= b'1111????'
Otras conclusiones adicionales:
C = A IOR B
C nunca puede valer menos que lo que vale A o menos que B. Puede valer más que ambos, o bien igual a uno de ellos(o a ambos).
Conclusion: El resultado es siempre mayor o por lo menos igual al mayor de los registros en juego.
¿Sirvió de ayuda?
Si mi tabla de la verdad falla en algo me avisan... :D
Ejercicios(haganlos a quienes les intereza el potencial de las operaciones logicas):
¿Qué hace ((A IOR B) XOR A)? ¿Y ((A IOR B) XOR B)?
Saludos!
-
Gracias brunoF por el machete o resumen.
Ya pertenece a mis machetes que estoy realizando.
Saludos. :-/ :-/
-
es cierto, gracias por la amplia explicacion