Salidas PORTB PIC 16F84A cambian segun la carga que conecte

Buenas.

He programado un codigo,que me da una salida por el PORTB (rb7,6,5,4) en BCD y la meto a un display BCD 7 segmentos para que se visualice el numero.

Si las salidas las conecto a leds, se enciende el numero correcto. Sin embargo, si en las mismas salidas, conecto el display, estas cambian. Yo mandando desde el codigo un 1001 por ejemplo, se activa un 1101.

Porque se modifican las salidas del PORTB en funcion de la carga?? si es un dato que yo estoy obligando desde el codigo fijo?

Espero seme haya entendido.
Gracias.
 
hola amigo saludos
ya mirastes el tipo de display que usas y su respectivo codigo? de pronto eso haga que de un codigo errado... espero te haya ayudado en algo
 
Hola dcastibl1.

Gracias por tu rapida respuesta.

Yo ahora lo estoy simulando con Proteus, no se si conoces el programa.

He probado con todos los displays, y el asunto es ese, que colocando a las salidas del PORTB leds si da el codigo, pero sin embargo al conectar los displays, me modifica la salida que yo habia asignada al PORTB, No termino de entenderlo. Es como si el display mandara tension hacia los pines del PORTB, aunque estan definidos como salidas y a cero.

Me estoy volviendo loco, jajaj,

Gracias de nuevo
 
bueno te propongo algo yo ahora me voy para clase de laboratorio de sistemas embebidos estas de suerte jaja yo le pregunto al profe y apenas termine la clase vengo y te doy una respuesta
 
Eiii vaya que si.

Si quieres te mando el esquema.

El ausnto es ese. Porque se cambian los bits de salida de PORTB del PIC 16f84 dependiendo de lo que se le conecte .

No encuentro la solucion.

Graciasss
 
Hola Graciass.

Yo he configurado las salidas para que reaccionen al '1' ánodo.

Y como leds independientes funciona bien. Cada vez que yo cambio las entradas, una por PORTA y otra por PORTB , se modifica la salida con lo que yo he programado.

Sin embargo, si meto el bcd 7 segmentos de proteus, o el 74LS48 y despues uno de 7 segmentos, etcc... la salidas que yo veo ahora en el PIC,(rb7,6,5,4) del PORTB, no coinciden con las que deberian ser, segun lo programado, dando por lo tanto, error en el display. Por lo tanto, segun el tipo de dispositivo o carga que coloque en la salida de PORTB, me lo hace bien o mal.

Yo estudie electronica y esto me supera. Quizas sea un problema del programa y meestoy volviendo loco, no se...

Graciass a todos.
 
Buenas.
Os adjunto los dos casos.

En el primero se ve como las salidas de PORTB RB7,6,5,4 estan conectadas a unos leds.

Para la combinacion que se ve arriba, la salida es '0000', y esta correcto.

Firjaros en el siguiente esquema.

Ahora he colocado un BCD 7 segmentos, y si os fijais en las salidas de PORTB,para las mismas combinaciones que en el ejemplo anterior, ahora hay salidas (RB6 y RB5) que estan activas, mandando otro numero erroneo al display.

Como es posible, que yo haya programado para ese ejemplo todas a 0, y hayan dos que esten activas, cuando con los leds no pasa.

En fin. A ver si alguien me saca de mi error que me estoy volviendo loco

Gracias
 

Adjuntos

  • leds.JPG
    leds.JPG
    106.5 KB · Visitas: 33
  • display.JPG
    display.JPG
    100.6 KB · Visitas: 28
Bueno ya entiendo mas bien cual es el problema.
Configuraste las 4 patitas del puertoB como salida?, es decir, que los ultimos 4 BITS del TRISB esten a 0?.

Puedes ajuntar el codigo fuente para ver si ahi hay algun error?,


saludos
 
Buenas.

Dudo mucho que el codigo sea el problema. Yo creo que es mas del hardaware que estoy montando,pero bueno ahi va.

Es una modificacion del ejercicio del libro del PIC, los datos a comparar entran por los puertos.
Os he puesto una explicacionen el codigo

Ahi va:
;;;;;;;;;;;;;;;;;;;

; Compara dos datos entrados por PORTA y PORTB de dos digitos.
; salida por los bits de mayor peso de PORTB a un display BCD de 7 segmentos
; Si A=B , mandamos el valor '0'
; Si A<B, mandamos el resultado 'A+B'
; Si A>B, mandamos el resultado 'A-B'

list p= 16f84A
#include <p16f84.inc>

Resultado equ 0x10
Error_E equ b'1110'
Consigna_7 equ b'0111'
Consigna_2 equ b'0010'

org 0x00 ;vector reset origen

goto inicio

;org 0x05
inicio


bsf STATUS,RP0 ;cambio al banco 1

movlw b'00001111'
movwf TRISA ;RA0 y RA1 como entrada

movlw 0x0F ;Parte baja PORTB como entrada
movwf TRISB ;parte alta PORTB como salida

bcf STATUS,RP0 ;cambio al banco 0


;programa principal

principal
movf PORTB,0 ; cargamos el dato del PORTB a W
subwf PORTA,0 ; restamos al valor de PORTA lo que hay en W,
; es decir, el valor de PORTB,


btfsc STATUS,Z ; Si despues de la resta, Z= 1 , significa que
;A = B
goto A_igual_B

btfsc STATUS,C ;si despues de la resta, Z=0, y ahora C= 1,
;significa que A > B
goto A_mayor_B

A_menor_B ; si llegamos aqui, es porque despues de
;la resta, Z=0, y C= 0
movf PORTA,0
addwf PORTB,0 ; para el caso de A < B, mandamos a la
;salida el valor de A+B.
; si no ponemos el '0', la suma la guarda
; en PORTB, dando falso el resultado
goto Activa_salida

A_mayor_B
goto Activa_salida ; para el caso A > B, resulta que en la
;resta, en W quedo A-B, que
;es lo queremos mandar a la salida, por eso no lo volvemos a cargar

A_igual_B
clrf W ; para el caso A = B, en la salida teniamos
;que enviar el valor '0'

Activa_salida

movwf Resultado ; cargamos el valor que haya en W en un
;registro Resultado, pq hacer el
; SWAPF en W da problemas
swapf Resultado,0 ;rotamos en el registro Resultado los bits
; de mayor peso con los de
; menor peso, pq la salida en PORTB la
;tenemos en los bits altos de mayor peso




movwf PORTB ;cargamos ya el valor rotado en PORTB


;goto principal



END

Lo pongo de nuevo que el anterior era erroneo.



; Compara dos datos entrados por PORTA y PORTB de dos digitos.
; salida por los bits de mayor peso de PORTB a un display BCD de 7 segmentos
; Si A=B , mandamos el valor '0'
; Si A<B, mandamos el resultado 'A+B'
; Si A>B, mandamos el resultado 'A-B'


list p= 16f84A
#include <p16f84.inc>

Resultado equ 0x10


org 0x00

goto inicio


inicio


bsf STATUS,RP0

movlw b'00001111'
movwf TRISA

movlw 0x0F
movwf TRISB

bcf STATUS,RP0


;programa principal

principal
movf PORTB,0
subwf PORTA,0


btfsc STATUS,Z
goto A_igual_B

btfsc STATUS,C
goto A_mayor_B

A_menor_B
movf PORTA,0
addwf PORTB,0
goto Activa_salida

A_mayor_B
goto Activa_salida

A_igual_B
clrf W

Activa_salida

movwf Resultado

swapf Resultado,0





movwf PORTB


goto principal



END
 
Última edición:
Estimado Elcoloso

Por que no intentas a construir el circuito, ya que los simuladores llegan a tener errores . No hay como probar el circuito y asi despejas la duda. Yo me decantaria por que es error del simulador.

Prueba y nos comentas

saludos
 
Atrás
Arriba