Problema con la instrucción SWAPF

Hola a todos, espero me puedan ayudar a resolver un problema que tengo con una instrucción.
Sucede que tengo 4 bits de entrada por el puerto A representados por un dip-switch y cuando yo active el primer interruptor éste será intercambiado y se convertirá en el bit de mayor peso y así consecutivamente con las demás entradas, pero no puedo lograrlo o no sé si solo sea con un interruptor que todos pasen a ser de mayor peso.

Por favor, ayuda. No puedo hacerlo, ya le intenté varias cosas y nada.

Código:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
REG1 equ 0xA5
ORG 0x00
Inicio bsf STATUS,RP0 
clrf TRISB ;PORTB 
movlw b'00001111' 
movwf TRISA 
bcf STATUS,RP0 

Main 
movf PORTA, w
swapf <------- no se que podria ir aca 
movwf PORTB 
goto Main 
END

Por favor, sólo díganme qué podría poner o quitar. Espero y no los moleste.
 
Última edición:
Hola, si entendí bien lo que puedes hacer es el siguiente código:

swapf PORTA,W ;Se lee el puerto A y al mismo tiempo se intercambian ponderaciónes
movwf PORTB ;Se envía dato al puerto B
 
la misma instrucción SWAPF PORTA,W lee el puerto A, intercambia ponderaciónes y guarda el resultado en W, no hay necesidad de leer en otra instrucción al puerto A
 
la misma instrucción SWAPF PORTA,W lee el puerto A, intercambia ponderaciónes y guarda el resultado en W, no hay necesidad de leer en otra instrucción al puerto A

ok creo que ya te entendi pero volvi a cometer otro error no se si afecte a como me habias dicho pero habia puesto esta constante REG1 equ 0xA5 pero no la declare en ningun lado asi que no se si afecte a algo al quitarlo

PD: ya lo compile y simule lo unico que hace cambia el bit de menor peso al mayor pero al momento de presionar el interruptor este se apaga y quiero que se regrese a ser el menor
 
Última edición:
No hay problema en quitar esa variable... La instrucción swapf cambia nibbles, es decir, los 4 bits de menor peso por los 4 bits de mayor peso. ¿Podrías ser mas claro con la acción que debe de hacer el botón?
 
No hay problema en quitar esa variable... La instrucción swapf cambia nibbles, es decir, los 4 bits de menor peso por los 4 bits de mayor peso. ¿Podrías ser mas claro con la acción que debe de hacer el botón?

Bueno, cuando inicio el circuito un LED estará prendido digamos en la posición uno y cuando yo accione el interruptor éste se pondrá en la posición 5 debido a la instrucción SWAPF.
 
Última edición por un moderador:
Código:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

ORG 0x00
Inicio 
bsf STATUS,RP0 ;Accesando al banco 1
bsf STATUS, C
clrf TRISB ;PORTB como salida
movlw b'00011111' ;cargando la cte
movwf TRISA ;puerto A como entrada
bcf STATUS,RP0 ;acceso al banco 0
bcf STATUS, C

Main 
movf PORTA, W ;leer el dato
swapf PORTA, W ;suma el dato mas 15
movwf PORTB ;muestra el resultado
goto Main ;fin del programa y $=salta a el mismo
END

He cambiado el código pero me sigue dando lo mismo, quiero que el LED se prenda en la primera posición y al oprimir el interruptor éste se cambia en la quinta posición, ya saben un intercambio de nibbles.
 
Última edición por un moderador:
No tiene caso la instruccion movf PORTA,W pues la misma instruccion swapf lee el dato y deja el resultado en w. Será de ayuda que compartas tu diagrama porque halando así de primera, quinta posición no queda muy claro. Saludos
 
No tiene caso la instruccion movf PORTA,W pues la misma instruccion swapf lee el dato y deja el resultado en w. Será de ayuda que compartas tu diagrama porque halando así de primera, quinta posición no queda muy claro. Saludos

bueno aca esta el diagrama cuando los interruptores estan en ON los leds se posicionan en la ultima posicion pero despues se apagan y quiero que cambian hacia el otro lado con la instruccion swapf y cuando quito movf PORTA,W me marca error
 

Adjuntos

  • diagrama1.png
    diagrama1.png
    39.2 KB · Visitas: 14
pero despues se apagan y quiero que cambian hacia el otro lado con la instruccion swapf

Esta parte es la que no entiendo a que te refieres, como se ve en la imagen RA0-RA3 están en alto lo que se traduce a RB4-RB7 en alto en el otro puerto. La instrucción SWAPF trabaja bien.
 
Esta parte es la que no entiendo a que te refieres, como se ve en la imagen RA0-RA3 están en alto lo que se traduce a RB4-RB7 en alto en el otro puerto. La instrucción SWAPF trabaja bien.

Desde RA0 a RA3 si se encuentran en lo alto cuando el interruptor está en ON pero lo que yo quiero es que regrese de lugar regrese al lugar bajo cuando el interruptor está en OFF por que lo único que hace es apagarlos y no regresarlos
 
cualquiera de las dos o bien intercambiar los dips switch para que al activarse pongan en 1 la entrada y viceversa. O bien por software:

Código:
swapf PORTA,W
movwf  REG1
comf    REG1,W
movwf  PORTB

REG1 es una variable en RAM que tendrás que declarar previamente
 
cualquiera de las dos o bien intercambiar los dips switch para que al activarse pongan en 1 la entrada y viceversa. O bien por software:

Código:
swapf PORTA,W
movwf  REG1
comf    REG1,W
movwf  PORTB

REG1 es una variable en RAM que tendrás que declarar previamente

REG1 la declaro con una variable exadecimal así
REG1 equ 0x0f

PD: se quedan prendidos los demas y quiero que se apaguen los primeros 4 despues de activar el interruptor aunque si esta dando un resultado favorable
 
Última edición:
Para mantener los pines RB0-RB3 en cero basta con aplicar una máscara de AND de 0's. El código así:

swapf PORTA,W
movwf REG1
comf REG1,W
andlw 0x0F
movwf PORTB

PD: Reg1 debes de declararlo en espacio de RAM disponible para el usuario, es decir una dirección apartir de la 0x20

Saludos
 
Para mantener los pines RB0-RB3 en cero basta con aplicar una máscara de AND de 0's. El código así:

swapf PORTA,W
movwf REG1
comf REG1,W
andlw 0x0F
movwf PORTB

PD: Reg1 debes de declararlo en espacio de RAM disponible para el usuario, es decir una dirección apartir de la 0x20

Saludos

listo ya entiendo ahora probare como sale y gracias por ayudarme
 
Atrás
Arriba