Problema con la instrucción SWAPF

Sólo hago una corrección, la máscara no debe ser 0x0F si no 0xF0, así se forma que el nibbles bajo permanezca en 0's
 
mmm entonces hay que quitar la parte de la inversión:

Código:
swapf PORTA,W
movwf REG1
andlw 0xF0
movwf PORTB

me sigue dando lo mismo ala mejor el problema esta en otra parte del codigo aca pongo el codigo ala mejor estoy declarando mal la variable o algo

Código:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

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

Main 
swapf PORTA,W
movwf REG1
andlw 0xF0
movwf PORTB
goto Main ;fin del programa y $=salta a el mismo
END

no se en donde podria estar mal
 
Cambia tu conexión de los switches por esta

image003.jpg
 

ok las resistencias a negativo y el switch a positivo

PD: ya lo intente como dices pero ahora en OFF esta apgados y en ON se prenden pero no se si la variable que estoy declarando sea la correcta o tengo que declarar otra por que quiero que cuando yo encienda el circuito de RB0 a RB3 esten encendidos y mediante los dipswitch y la instruccion SWAPF cambien de direcion es decir que se enciendan los leds de RB4 a RB7
 

Adjuntos

  • diagramapic.jpg
    diagramapic.jpg
    155.9 KB · Visitas: 9
Última edición:
Bien, entonces para hacer que RB0-RB3 se mantengan encendidos es necesario aplicar otra máscara de bits:

Código:
Main 
swapf PORTA,W  ;Lee dato e invierte nibbles
iorlw  0x0F   ;Forza nibble bajo a estar en alto
movwf PORTB  ;Pasa resultado al puerto B
goto Main ;fin del programa y $=salta a el mismo
END
 
Bien, entonces para hacer que RB0-RB3 se mantengan encendidos es necesario aplicar otra máscara de bits:

Código:
Main 
swapf PORTA,W  ;Lee dato e invierte nibbles
iorlw  0x0F   ;Forza nibble bajo a estar en alto
movwf PORTB  ;Pasa resultado al puerto B
goto Main ;fin del programa y $=salta a el mismo
END

bueno si se quedan prendidos pero no se apagan y me pide que se apaguen
 
Por lo que yo entiendo, lo que quiere SaulOmega es

1) por defecto, deben encenderse los LED asociados de RB0 .. RB3
2) si alguno de los interruptores se activa, se desactiva la patilla correspondiente y la pasa al conjunto RB4 .. RB7
 
mm ya entiendo pues... algo así entonces:

Código:
Lazo

	swapf		PORTA,W		;Lee dato de entrada
	movwf		REG1		;Lo respalda en RAM
	comf		REG1,W		;Invierte estado lógico de dato de etrada
	iorlw		0x0F		;Máscara de bits para forzar RB0-RB3=1
	movwf		PORTB		;Muestra resultado en los LED de salida
	goto		Lazo		;Lazo
 
Esta es mi solución.

Se lee el nibble que entra por el puerto A y sale por el nibble alto del puerto B, mientras que sale invertido por el nibble bajo.

Está escrito para MPLAB X.
PHP:
;
; Prueba de operación SWAP
;
; Se lee un nibble por el PORTA.
; Por el PORTB debe salir:
;  el nibble alto debe ser igual al valor de PORTA
;  el nibble bajo debe ser igual al valor invertido de PORTA
;

;*******************************************************************************
; Listado y condiciones de ensamblado

    processor   16F84A                  ; procesador
    radix       dec                     ; formato decimal, por defecto
    errorlevel  -302                    ; Turn off banking message

;*******************************************************************************
; Bibliotecas

    include     p16f84a.inc             ; definiciones

;*******************************************************************************
; Fusibles

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;*******************************************************************************
; Variables en memoria compartida
        udata_shr

REG1    res     1                       ; registro temporal


;*******************************************************************************
; Código
        code    0x000

                                ; Configuración de los puertos
                                ; 0: salida. 1: entrada

        banksel TRISA           ; banco 1

        movlw   B'00001111'
        movwf   TRISA           ; patillas RA0..RA3 como entrada

        clrf    TRISB           ; PORTB como salida (dos nibbles)

        banksel PORTA           ; banco 0


Bucle:
        movf    PORTA,w         ; leemos la entrada
        movwf   REG1        	; y la guardamos

                                ; nibble bajo
        comf    REG1,w          ; invierte valor de la entrada
        andlw   0x0F            ; nos quedamos con el nibble bajo

                                ; nibble alto
        swapf   REG1,f          ; intercambia nibbles de la entrada

                                ; unir nibbles
        iorwf   REG1,w

                                ; salida
        movwf   PORTB

                                ; y repetir
        goto    Bucle

        END
 
Última edición por un moderador:
No importa si está para uno u otro. Lo importante es que el código en ensamblador es el mismo, así que lo puedes portar sin muchos problemas.

Por ejemplo, la sección udata_shr se refiere a que ahí reservaremos bytes de RAM compartida (entre bancos), y le daremos un nombre a esos bytes, por lo que nos servirán de registros extra o variables. Será el compilador el que se encargue de averiguar dónde comienza esa zona, dependiendo del procesador indicado antes.

Al poner 16f84a, veo en el código que me genera que es la posición 0x0C, que es justo la primera posición libre.

Pero en tu código puedes seguir poniendo lo del 'equ' y el resto del programa es igual :)

P.D. No conozco las diferencias entre MPLAB X y MPLAB IDE, pero no creo que sean tantas. Los dos usarán el mismo ensamblador, el mpasm.
 
Última edición por un moderador:
No importa si está para uno u otro. Lo importante es que el código en ensamblador es el mismo, así que lo puedes portar sin muchos problemas.

Por ejemplo, la sección udata_shr se refiere a que ahí reservaremos bytes de RAM compartida (entre bancos), y le daremos un nombre a esos bytes, por lo que nos servirán de registros extra o variables. Será el compilador el que se encargue de averiguar dónde comienza esa zona, dependiendo del procesador indicado antes.

Al poner 16f84a, veo en el código que me genera que es la posición 0x0C, que es justo la primera posición libre.

Pero en tu código puedes seguir poniendo lo del 'equ' y el resto del programa es igual :)

P.D. No conozco las diferencias entre MPLAB X y MPLAB IDE, pero no creo que sean tantas. Los dos usarán el mismo ensamblador, el mpasm.

Esta bien intentare con el código and más necesitare saber algunas instrucciónes que no conosco
 
Atrás
Arriba