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

Temas similares

13/06/2014 #1

Avatar de Esauvq

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.
13/06/2014 #2


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'

---------- Actualizado después de 41 minutos ----------

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
13/06/2014 #3


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
13/06/2014 #4

Avatar de Esauvq

fen2006 dijo: Ver Mensaje
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'

---------- Actualizado después de 41 minutos ----------

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
13/06/2014 #5


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.
13/06/2014 #6

Avatar de Esauvq

edwin ts dijo: Ver Mensaje
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
13/06/2014 #7


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
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.