Autor Tema: Igualacion bit a bit?  (Leído 2445 veces)

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

Desconectado ignation

  • PIC10
  • *
  • Mensajes: 2
Igualacion bit a bit?
« en: 19 de Abril de 2014, 08:23:04 »
Buenas a todos,
Estoy intentando igualar el bit 5 de PORTA al bit 5 de PORTB es decir PORTB[5] = PORTA[5] Llevo un rato intentándolo pero no se me ocurre nada.

Gracias

Un saludo!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Igualacion bit a bit?
« Respuesta #1 en: 19 de Abril de 2014, 10:22:09 »
Que tal ignition,

Tienes que usar enmascaramiento de bits, de esta forma compararas el numero de 8 bits generado cuando el bit 5 esta en 0 o en 1 (cero y treintados respectivamente).

Para realizar esto lees el estado completo del puerto A, luego le aplicas una AND con el bit 5 en alto solamente.
esto seria asi:

MOVF    PORTA,W
ANDLW  B'00100000'
MOVWF VAR_BIT5

Y luego haces lo mismo con el puerto B

MOVF    PORTB,W
ANDLW  B'00100000'

Esto como ya lo explique provocara que sucedan dos casos el puerto A y B pueden valer 0 o 32. Entonces despues de esto puedes aplicar una EXOR y cuando dos numeros son igules el resultado es cero y eso hace que se levante la bander de ZERO en el registro STATUS.

Esto seria asi,

XORWF  VAR_BIT5,W    ;Compara el valor del bit 5 del puerto A con el valor del bit 5 del puerto B
BTFSS   STATUS,Z        ;si son iguales salta a continua tu codigo
GOTO    xxxxx             ;Si no, entonces salta a xxxxx
Continua tu codigo

Espero que esto te sirva.

Saludos,

Elreypic.

Desconectado ignation

  • PIC10
  • *
  • Mensajes: 2
Re: Igualacion bit a bit?
« Respuesta #2 en: 19 de Abril de 2014, 13:10:07 »
Que tal ignition,

Tienes que usar enmascaramiento de bits, de esta forma compararas el numero de 8 bits generado cuando el bit 5 esta en 0 o en 1 (cero y treintados respectivamente).

Para realizar esto lees el estado completo del puerto A, luego le aplicas una AND con el bit 5 en alto solamente.
esto seria asi:

MOVF    PORTA,W
ANDLW  B'00100000'
MOVWF VAR_BIT5

Y luego haces lo mismo con el puerto B

MOVF    PORTB,W
ANDLW  B'00100000'

Esto como ya lo explique provocara que sucedan dos casos el puerto A y B pueden valer 0 o 32. Entonces despues de esto puedes aplicar una EXOR y cuando dos numeros son igules el resultado es cero y eso hace que se levante la bander de ZERO en el registro STATUS.

Esto seria asi,

XORWF  VAR_BIT5,W    ;Compara el valor del bit 5 del puerto A con el valor del bit 5 del puerto B
BTFSS   STATUS,Z        ;si son iguales salta a continua tu codigo
GOTO    xxxxx             ;Si no, entonces salta a xxxxx
Continua tu codigo

Espero que esto te sirva.

Saludos,

Elreypic.

Gracias compañero! Pero creo que no es lo que pregunto, ya que no quiero una comprobación si no una asignación. Lo que necesito hacer es que el bit 5 del PORTB sea igual que el bit 5 del PORTA. Necesito que cuando se encienda un LED (Bit 5 de PORTA) se encienda otro led situado en el Bit 5 de PORTB y lo mismo a la hora de apagarse. En PORTB tengo un teclado numérico y en PORTA un display así que solo me interesa el bit 5. Lo ideal sería no usar una variable auxiliar como la VAR_BIT5 que propones.

Gracias

Un saludo!
« Última modificación: 19 de Abril de 2014, 13:19:22 por ignation »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Igualacion bit a bit?
« Respuesta #3 en: 19 de Abril de 2014, 19:11:54 »
Usando instrucciones orientadas a byte:

MOVF PORTB,W
XORWF PORTA,W
ANDLW 0x20
XORWF PORTB,F

Usando instrucciones orientadas a bit:

BTFSS PORTA,5
BCF    PORTB,5
BTFSC PORTA,5
BSF    PORTB,5

Saludos
« Última modificación: 19 de Abril de 2014, 19:17:16 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.