Problema con la instrucción SWAPF

#21
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
 
#26
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
 
#28
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

Última edición:
#29
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
 
#30
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
 
#32
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
 
#34
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
 
#35
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:
#37
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:
#38
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
 
Arriba