Autor Tema: Multiplexación de displays lenta  (Leído 3417 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Thevenin

  • PIC10
  • *
  • Mensajes: 29
Multiplexación de displays lenta
« en: 08 de Septiembre de 2008, 17:28:28 »
Buenas  :)

Tengo un problema con este circuito. No es más que un termómetro digital basado en el 16F876. El potenciómetro simula el LM35.

Breve descripción del circuito:

PUERTO C
=======
Pines 1 al 7 a dos display en paralelo de siete segmentos

PUERTOB
=======
Pin 5 al transistor que controla el display de decenas
Pin 6 al transistor que controla el display de unidades


La cuestión es que no sé si realmente la multiplexación está funcionado bien:

Por un lado:
=========
En el proteus lo simula muy lento, aunque asumo que esto es normal.

Por otro lado:
=========
En el circuito real las decenas se ven correctas, pero el display de las unidades brilla muy poco

No sé si es que la frecuencia con la que se enciende el transitor de las decenas es mayor, o que pasa.

A continuación os pongo un extracto del código de la multiplexación y visualización de los display.

El valor de la temperatura se obtiene en W después de la llamada a BIN_A_BCD

Agradezco cualquier ayuda.

Un saludo.

Código: [Seleccionar]
;
 --------------------------
; Paso 4
; Convertimos el dato de binario a BCD
; Código de multiplexado
; --------------------------
call BIN_a_BCD
movwf Unidades        ; Tenemos el valor de la temperatura en BCD dentro de Unidades
bcf PORTB,5            ; Apaga decenas
andlw b'00001111' ; Me quedo con nible bajo
call DecoDisplay   ; Devuelve el valor de 7 segmentos para el número a visualizar
movwf PORTC ; Lo saco por el PORTC
bsf PORTB,6            ; Enciende unidades

movfw Unidades       ; Recupero de nuevo el valor de la temperatura
swapf Unidades,W    ; Intercambio nibbles, es hora de tomar las decenas
andlw b'00001111'   ; Me quedo con el nible bajo
call DecoDisplay     ; Devuelve el valor de 7 segmentos para el número a visualizar
bsf PORTB,5          ; Apagamos Unidades
movwf PORTC       ; Lo saco por PORCT
bcf PORTB,6         ; Encendemos Decenas

; El resultado se visualiza por la salida.
goto Principal ; Se queda permanentemente en este bucle.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Multiplexación de displays lenta
« Respuesta #1 en: 08 de Septiembre de 2008, 21:45:07 »
Hola.

Mira que cuando sales de la rutina de multiplexado, dejas encendido el display correspondiente a las decenas, por lo que el tiempo que permanece encendido es mayor al tiempo que tienes prendido las unidades (me imagino que despues de esa rutina haces mas cosas, cosas que toman tiempo). Para tener un brillo constante de los dos displays debes garantizar que el tiempo que permanecen encendido es el mismo, normalmente yo uso interrupciones para el manejo de los displays, de esta manera no lo afectan las funciones muy largas y otras cosas como las que comentas.

Saludos
El papel lo aguanta todo

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Multiplexación de displays lenta
« Respuesta #2 en: 10 de Septiembre de 2008, 14:12:09 »
tiene que haber un tiempo de encendido y un tiempo de apagado, éste último es mucho menor al de encendido


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Thevenin

  • PIC10
  • *
  • Mensajes: 29
Re: Multiplexación de displays lenta
« Respuesta #3 en: 21 de Marzo de 2009, 09:19:37 »
Buenas,

han pasado muchos meses, un poco tarde para responder a esto, pero aquí estoy:

Tenía esto pendiente, pero esta semana me levanté inspirado, y lo solucioné de forma muy sencilla:

Código: [Seleccionar]
; --------------------------
; Paso 4
; Convertimos el dato de binario a BCD
; --------------------------
call BIN_a_BCD
movwf Unidades
andlw b'00001111'
call DecoDisplay
movwf PORTC
bsf PORTB,5     ; Encender Decenas
        call    Retardo_10ms ; Visualizo las decenas por un tiempo de 10ms <-----  solución
bcf PORTB,5     ; Apago Decenas


movfw Unidades
swapf Unidades,W
andlw b'00001111'
call DecoDisplay
movwf PORTC
bsf PORTB,6    ; Encendemos Unidades
call    Retardo_10ms ; Visualizo las unidades por un tiempo de 10ms   <-----  solución
bcf PORTB,6    ; Apagamos Unidades
; El resultado se visualiza por la salida.
goto Principal ; Se queda permanentemente en este bucle.

Tras darle muchas vueltas para mantener encendidos los displays por el mismo tiempo, lo terminé dejando,
hasta que se me ocurrió un día:

¡Tras encenderlo los apago inmediantamente  durante 10ms cada uno!, de esta forma el tiempo de visualización
sería el mismo para cada uno.

y funcionó.

En fin, era para agradecer la ayuda, y dejo donde el puse el proyecto, funciona en real, aunque
en la simulación vaya lento:

http://www.todopic.com.ar/foros/index.php?topic=25281.0

¡Muchas gracias!!
« Última modificación: 21 de Marzo de 2009, 09:21:53 por Thevenin »