Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

07/04/2015 #1


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.
07/04/2015 #2

Avatar de Daniel Meza

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
07/04/2015 #3


Daniel Meza dijo: Ver Mensaje
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
pero creo que cometi un error por que no era movlw PORTA, w es movf PORTA, w aunque si moviera a swapf PORTA, w que pondria en movf
07/04/2015 #4

Avatar de Daniel Meza

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
07/04/2015 #5


Daniel Meza dijo: Ver Mensaje
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
08/04/2015 #6

Avatar de Daniel Meza

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?
08/04/2015 #7


Daniel Meza dijo: Ver Mensaje
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.
08/04/2015 #8


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.
08/04/2015 #9

Avatar de Daniel Meza

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
08/04/2015 #10


Daniel Meza dijo: Ver Mensaje
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
Imágenes Adjuntas
Tipo de Archivo: png diagrama1.png (39,2 KB (Kilobytes), 13 visitas)
08/04/2015 #11

Avatar de Daniel Meza

Coloca algunas resistencias limitadoras en los leds para que la simulación no de problemas y cuentas los resultados
08/04/2015 #12


Daniel Meza dijo: Ver Mensaje
Coloca algunas resistencias limitadoras en los leds para que la simulación no de problemas y cuentas los resultados
sigue dando lo mismo amigo
09/04/2015 #13

Avatar de Daniel Meza

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.
09/04/2015 #14


Daniel Meza dijo: Ver Mensaje
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
09/04/2015 #15

Avatar de Daniel Meza

Pero observa que el switch manda a 0's cuando está en la posición de ON y 1's cuando está en OFF.
09/04/2015 #16


Daniel Meza dijo: Ver Mensaje
Pero observa que el switch manda a 0's cuando está en la posición de ON y 1's cuando está en OFF.
entonces tendria que invertir las entras o las salidas
09/04/2015 #17

Avatar de Daniel Meza

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
10/04/2015 #18


Daniel Meza dijo: Ver Mensaje
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
11/04/2015 #19

Avatar de Daniel Meza

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
11/04/2015 #20


Daniel Meza dijo: Ver Mensaje
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
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.