Problema de programación con PIC16F84A y dipswitchs

Hola a todos. Soy nuevo en el foro y tengo una duda en la programación de un PIC es el PIC16F84A
Lo que pasa es que en este pic lo programamos para que realice los siguiente:

Utilizando un dip switch de 8 interruptores nosotros ponemos el código en binario, por ejemplo yo puse el código 00010110, al colocar esos en el dip switch si se coloca ese en el dip switch se prenderán 8 leds, si no se coloca ese, no se prenderá ninguno.

Mi problema es que ya puse el código y toda la cosa, lo simulé en ISIS proteus colocando el pic, los leds, el dip switch, su cristal, los capacitores y la resistencia del masterclear
Le coloco todo lo que necesita pero al momento de simularlo y colocando el código, solo prenden 3 leds, se supone que tiene que prender los 8.

Acá dejo el código

Código:
List    p=16F84A               
INCLUDE <P16F84A.INC> 

__CONFIG  _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

DATO equ b'10110'
org 0
goto INICIO

INICIO
bsf STATUS, RP0
movlw b'00011111'
movwf TRISB
bcf STATUS, RP0

PROGRAMA
movlw DATO
subwf PORTA, w
movlw b'00000000'
btfsc STATUS, Z
movlw b'11111111'
movwf PORTB
goto PROGRAMA
end

La simulación está abajo, es una imagen, si requieren del archivo ejecutable de proteus y mplab lo subo, solo respondan.

Espero no sea mucha molestia para ustedes y gracias.
 

Adjuntos

  • simulacion.jpg
    simulacion.jpg
    106 KB · Visitas: 32
Última edición por un moderador:
A rápida vista... Estás poniendo movlw b'00011111' = tres salidas y 5 entradas en el puerto B.
Explica dónde conectas los dip switch y dónde conectas las salidas.
Ya lo vi disculpa...
El puerto B tiene que ser todas salidas. movlw b'00000000'



Prueba con esto...
Código:
List p=16F84A 
INCLUDE <P16F84A.INC> 

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

DATO equ b'10110'
org 0
goto INICIO

INICIO
bsf STATUS, RP0
movlw b'00000000'
movwf TRISB
movlw b'00011111'
movwf TRISA
bcf STATUS, RP0

PROGRAMA
movlw DATO
subwf PORTA, w
movlw b'00000000'
btfsc STATUS, Z
movlw b'11111111'
movwf PORTB
goto PROGRAMA
end
 
Última edición por un moderador:
Hola amigos.

Hace mucho no programo en ASM, pero creo que en donde estás definiendo las etiquetas no le estás asignando una dirección a la etiqueta DATO.
Tendrías que seleccionar una dirección de algún registro que este libre, luego le asignas la etiqueta y por último cargas el el valor a DATO.

Ahora, otra cosa y creo que a los saltos se les debe de colocar los dos puntos ":"

Se me olvidaba, dices que se deben encender los LED cuando corresponda el código, entonces deben de cargar en W todos en 1, ya que la comparación btfsc STATUS, Z, salta si es cero, es decir, cuando el código coincide la resta es cero y salta, de manera que los Led se deben encender, de lo contrario cargo ceros en el registro y apagas los Led.

Aquí te dejo como creo que debe ir, pruébalo

Código:
List p=16F84A 
INCLUDE <P16F84A.INC> 

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

//Se asigna la siguiente dirección
DATO         EQU        0FH


        ORG     00H

goto         INICIO


INICIO:

bsf                 STATUS, RP0
movlw         b'00000000'
movwf         TRISB
movlw         b'11111111'
movwf         TRISA
bcf                 STATUS, RP0

//Se carga el valor en DATO

movlw         b'00010110'
movwf         DATO


//Bucla infinita

PROGRAMA:
movlw         DATO
subwf         PORTA,w
movlw         b'11111111'
btfsc         STATUS, Z
movlw         b'00000000'
movwf         PORTB
goto         PROGRAMA

end
 
Última edición por un moderador:
a rapida vista... estas poniendo movlw b'00011111' = tres salidas y 5 entradas en el puerto B.
explica donde conectas los dip switch y donde conectas las salidas.
ya lo vi disculpa...
el puerto B tiene que ser todas salidas. movlw b'00000000'



prueba con esto...
List p=16F84A
INCLUDE <P16F84A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

DATO equ b'10110'
org 0
goto INICIO

INICIO
bsf STATUS, RP0
movlw b'00000000'
movwf TRISB
movlw b'00011111'
movwf TRISA
bcf STATUS, RP0

PROGRAMA
movlw DATO
subwf PORTA, w
movlw b'00000000'
btfsc STATUS, Z
movlw b'11111111'
movwf PORTB
goto PROGRAMA
end

gracias ya lo cambie y si en la simulacion ya me salio ahora voy a armarlo en la proto esperando que tambien me quede gracias
 
Última edición:
lo que dice el amigo edwin ts tiene razón el dato tiene que estar en una posición vacía de memoria pero como lo probé con el simulador y funciono no me di cuenta.
te recomiendo que uses MPLAB IDE de microchip para hacer las simulaciones es un poco enredado configurar lo pero después se hace muy fácil de entender y si corre en el simulador seguro que corre donde lo montes.
 
Hola amigos.

Hace mucho no programo en ASM, pero creo que en donde estás definiendo las etiquetas no le estás asignando una dirección a la etiqueta DATO.
Tendrías que seleccionar una dirección de algún registro que este libre, luego le asignas la etiqueta y por último cargas el el valor a DATO.

Ahora, otra cosa y creo que a los saltos se les debe de colocar los dos puntos ":"

Se me olvidaba, dices que se deben encender los LED cuando corresponda el código, entonces deben de cargar en W todos en 1, ya que la comparación btfsc STATUS, Z, salta si es cero, es decir, cuando el código coincide la resta es cero y salta, de manera que los Led se deben encender, de lo contrario cargo ceros en el registro y apagas los Led.

Aquí te dejo como creo que debe ir, pruébalo

Código:
List p=16F84A 
INCLUDE <P16F84A.INC> 

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

//Se asigna la siguiente dirección
DATO         EQU        0FH


        ORG     00H

goto         INICIO


INICIO:

bsf                 STATUS, RP0
movlw         b'00000000'
movwf         TRISB
movlw         b'11111111'
movwf         TRISA
bcf                 STATUS, RP0

//Se carga el valor en DATO

movlw         b'00010110'
movwf         DATO


//Bucla infinita

PROGRAMA:
movlw         DATO
subwf         PORTA,w
movlw         b'11111111'
btfsc         STATUS, Z
movlw         b'00000000'
movwf         PORTB
goto         PROGRAMA

end

genial con tu codigo tambien me quedo si ya lo simule y tendre que aprender a utilizar MPLAB IDE para las simulaciones pero una cosa es simular y otra cosa es montar en la protoboard por que aveces me salen bien las simulaciones pero al montarlo aveces no
 
Claro amigo, esa es la idea cometer errores que de ellos se aprende, por otra parte, estoy de acuerdo con fen2006 de que pruebes en el MPLAB IDE, lo utilice bastante tiempo pero conocí Atmel Studio y me enamore, jajaja
 
Atrás
Arriba