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
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
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
¿Dejaste el dip switch como al inicio?, es decir ¿como en tu diagrama que pusiste?
swapf PORTA,W
movwf REG1
andlw 0xF0
movwf PORTB
mmm entonces hay que quitar la parte de la inversión:
Código:swapf PORTA,W movwf REG1 andlw 0xF0 movwf PORTB
__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
Cambia tu conexión de los switches por esta
http://class.ece.iastate.edu/arun/CprE281_F05/lab/labw03a/labw03a_files/image003.jpg
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
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
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
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
;
; 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
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.