Autor Tema: instruccion para conmutar bit  (Leído 4870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sota_de_bastos

  • PIC10
  • *
  • Mensajes: 23
instruccion para conmutar bit
« 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  :-/

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: instruccion para conmutar bit
« Respuesta #1 en: 15 de Octubre de 2007, 13:39:44 »
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

Desconectado Mazinger_bcn

  • PIC10
  • *
  • Mensajes: 42
    • e-repair
Re: instruccion para conmutar bit
« Respuesta #2 en: 15 de Octubre de 2007, 15:50:46 »
En assembler tienes la instrucción compf, pero te realiza la inversión de todos los bits de un byte.

Saludos.

Desconectado sota_de_bastos

  • PIC10
  • *
  • Mensajes: 23
Re: instruccion para conmutar bit
« Respuesta #3 en: 16 de Octubre de 2007, 04:24:26 »
ok, gracias de todas formas para conmutar todo el puerto ya está la x-or.

1 saludo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: instruccion para conmutar bit
« Respuesta #4 en: 16 de Octubre de 2007, 18:18:56 »
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!.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: instruccion para conmutar bit
« Respuesta #5 en: 16 de Octubre de 2007, 18:31:06 »
Y para volver al estado anterior?? :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: instruccion para conmutar bit
« Respuesta #6 en: 16 de Octubre de 2007, 18:57:30 »
Y para volver al estado anterior?? :mrgreen:

Previamente lo guardas en una posición de la RAM y listo.

Saludos.  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: instruccion para conmutar bit
« Respuesta #7 en: 17 de Octubre de 2007, 00:21:22 »
Es que llevaria muchas instrucciones en assembler ese toggle... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: instruccion para conmutar bit
« Respuesta #8 en: 17 de Octubre de 2007, 01:22:20 »
Y para volver al estado anterior?? :mrgreen:
Uy, uy, casi pico...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: instruccion para conmutar bit
« Respuesta #9 en: 17 de Octubre de 2007, 01:47:59 »
:D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: instruccion para conmutar bit
« Respuesta #10 en: 17 de Octubre de 2007, 22:09:29 »
Y para volver al estado anterior?? :mrgreen:
Uy, uy, casi pico...

Yo como un estúp... piqué  :mrgreen: :mrgreen: :mrgreen:

Saludos.  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado sota_de_bastos

  • PIC10
  • *
  • Mensajes: 23
Re: instruccion para conmutar bit
« Respuesta #11 en: 18 de Octubre de 2007, 07:23:35 »
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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: instruccion para conmutar bit
« Respuesta #12 en: 18 de Octubre de 2007, 18:21:48 »
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!
« Última modificación: 18 de Octubre de 2007, 18:31:20 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: instruccion para conmutar bit
« Respuesta #13 en: 18 de Octubre de 2007, 19:36:51 »
Gracias brunoF por el machete o resumen.

Ya pertenece a mis machetes que estoy realizando.

Saludos.  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado sota_de_bastos

  • PIC10
  • *
  • Mensajes: 23
Re: instruccion para conmutar bit
« Respuesta #14 en: 19 de Octubre de 2007, 05:12:08 »
es cierto, gracias por la amplia explicacion


 

anything