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

Temas similares

11/04/2015 #21

Avatar de Daniel Meza

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
12/04/2015 #22


Daniel Meza dijo: Ver Mensaje
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
bueno ahora pasa que cuando el interruptor esta en OFF estan prendidos y cuando los pongo en ON se apagan
12/04/2015 #23

Avatar de Daniel Meza

¿Dejaste el dip switch como al inicio?, es decir ¿como en tu diagrama que pusiste?
12/04/2015 #24


Daniel Meza dijo: Ver Mensaje
¿Dejaste el dip switch como al inicio?, es decir ¿como en tu diagrama que pusiste?
Si exacto los deje igual al diagrama
12/04/2015 #25

Avatar de Daniel Meza

mmm entonces hay que quitar la parte de la inversión:

Código:
swapf PORTA,W
movwf REG1
andlw 0xF0
movwf PORTB
13/04/2015 #26


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

Avatar de Daniel Meza

Cambia tu conexión de los switches por esta

13/04/2015 #28


Daniel Meza dijo: Ver Mensaje
Cambia tu conexión de los switches por esta

http://class.ece.iastate.edu/arun/Cp...s/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
Imágenes Adjuntas
Tipo de Archivo: jpg diagramapic.jpg (155,9 KB (Kilobytes), 8 visitas)
13/04/2015 #29

Avatar de Daniel Meza

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
13/04/2015 #30


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

Avatar de Daniel Meza

¿cuándo?, vaya es muy enredado todo esto

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
13/04/2015 #32

Avatar de JoaquinFerrero

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


JoaquinFerrero dijo: Ver Mensaje
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
Si exacto amigo es lo que quiero que haga
14/04/2015 #34

Avatar de Daniel Meza

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

Avatar de JoaquinFerrero

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.
Código 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 decimalpor 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
                                
0salida1entrada

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


¿Y sólo se puede compilar en MPLAB X, no en MPLAB IDE?
15/04/2015 #37

Avatar de JoaquinFerrero

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.
15/04/2015 #38


JoaquinFerrero dijo: Ver Mensaje
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
15/04/2015 #39

Avatar de JoaquinFerrero

Todo está descrito en el MPASM Assembler, MPLINK Object Linker, MPLIB Object Librarian User’s Guide -33014L.pdf- (en inglés).

Si te atascas en algún detalle, avísanos.
Respuesta
¿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.