Duda con display doble de 7 segmentos en PicBasic Pro.

Hola a todos. Solicito su ayuda, por favor, con el siguiente problema. Estoy desplegando el contenido de las variables "Hour" y "Minute" en displays INDIVIDUALES de 7 segmentos . Divido ambas variables en dos variables cada una, de manera que tengo dos dígitos para la hora, a los que llamo "HRS_DER" y "HRS_IZQ"; también la variable de los minutos la separo en dos dígitos a los que he llamado "MIN_DER" y "MIN_IZQ". Cada una de estas últimas variables las envío a un display individual de 7 segmentos. Hasta ahí todo funciona bien, pero ahora deseo reducir los cuatro display individuales de 7 segmentos a DOS DISPLAYS DOBLES DE 7 SEGMENTOS, un display doble para la hora y el otro para los minutos. El problema es que las instrucciones que me sirven para desplegar cada dígito por separado en un display individual no funcionan para DISPLAYS DOBLES. Ya he probado las ideas que se me han ocurrido, pero no logro hacerlo. Por favor, ¿alguien puede decirme cuales son las instrucciones correctas? Anexo el código en PBP que funciona para cuatro displays individuales. De antemano, mil gracias.

Código:
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS

CMCON=7

define OSC 4

Symbol Hrs_button = PORTA.0     ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1    ; BOTON DE AJUSTE PARA MINUTOS

Ticks VAR byte                  ; 61 ticks = 1 sec
Hour VAR byte
Minute VAR byte
Second VAR byte
Disp VAR byte                   ; Disp = 1 to ACTULIZA DISPLAYS
Delay VAR byte
 
TRISB = 0                       ; PORTB is SALIDA
TRISA = 3                       ; RA0,RA1 SON ENTRADAS

;VARIABLES A DESPLEGAR
MIN_DER VAR BYTE                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
MIN_IZQ VAR BYTE                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO

HRS_DER VAR BYTE                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
HRS_IZQ VAR BYTE                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO

; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0

OPTION_REG = $05                ; prescaler = 64
ON INTERRUPT GOTO ISR           ; IR A RUTINA ISR
INTCON = $A0

;INICIO DEL PROGRAMA
PROG:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
IF Hrs_button = 0 THEN
   Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
   Gosub Antirrebote
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
   Minute = Minute + 1
IF Minute = 60 THEN Minute = 0
   Gosub Antirrebote
ENDIF

;RUTINA PARA MOSTRAR VALORES DE H:M:S
IF Disp = 1 THEN
   MIN_DER = Minute DIG 0
   MIN_IZQ = Minute DIG 1

   HRS_DER = Hour DIG 0
   HRS_IZQ = Hour DIG 1

   PORTB=224+MIN_DER
   PAUSE 50       
   PORTB=208+MIN_izq
   PAUSE 50
  
   PORTB=176+HRS_DER
   PAUSE 50
   PORTB=112+HRS_IZQ
   PAUSE 50
    
   Disp = 0
ENDIF
GOTO PROG

;RUTINA ANTIRREBOTE
Antirrebote:
FOR Delay = 1 To 200
    Pause 1
    NEXT Delay
    Disp = 1
RETURN

;RUTINA PARA EJECUCION DE UN SEGUNDO
DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate

;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
   Second = 0
   Minute = Minute + 1
IF Minute = 60 THEN
   Minute = 0
   Hour = Hour + 1
IF Hour = 24 THEN
   Hour = 0
ENDIF
ENDIF
ENDIF
Disp = 1                       

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END

END
 
Si funciona con los displays A y no con los B, es que lo has conectado mal o unos son AC y los otros CC o algo así.

Como no pones esquema , hasta aquí puedo leer.
 
Hola, Scooter, gracias por contestar. Estoy utilizando en ambos casos displays de ánodo común. Anexo esquemáticos de ambos casos, el de displays individuales que sí funciona y el displays dobles que no. Una vez más, gracias por tu ayuda. Saludos.
 

Adjuntos

  • FUNCIONA.png
    FUNCIONA.png
    110.4 KB · Visitas: 25
  • NO FUNCIONA.png
    NO FUNCIONA.png
    88.1 KB · Visitas: 25
También puede ser la frecuencia en que oscilan el apagado y prendido de cada número. Colocar de manera invertida los cables que salen de los transistores a los displays o_sea del display izquierdo el pin 1 E lo intercambias al display derecho ( no afectaría en la visualiación de los minutos) . Puedes aumentar el voltaje de la fuente para los transistores PNP a fin de que los display reciban mas voltaje. Probar con otros display quizas esos no son simulables o lo simulan mal en el Proteus de tu versión
 
¿Estás hablando de funcionamiento o de simulación?
Si es simulación puede que esté mal el modelo

Los leds azules necesitan mas tensión que los verdes.
Gracias, Scooter, voy a considerar tu observación y probaré con otro modelo. Saludos.
También puede ser la frecuencia en que oscilan el apagado y prendido de cada número. Colocar de manera invertida los cables que salen de los transistores a los displays o_sea del display izquierdo el pin 1 E lo intercambias al display derecho ( no afectaría en la visualiación de los minutos) . Puedes aumentar el voltaje de la fuente para los transistores PNP a fin de que los display reciban mas voltaje. Probar con otros display quizas esos no son simulables o lo simulan mal en el Proteus de tu versión
Hola, JDC, gracias. Voy a tomar en cuenta tus sugerencias y haré algunos cambios. Saludos.
 
Última edición:
Revisa esto:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
IF Hrs_button = 0 THEN
Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
Gosub Antirrebote
ENDIF
Así como está, el antirrebote sólo funciona al pulsar de 24 a 0.
Si es necesario, añade esto:
IF Hrs_button = 0 THEN
Hour = Hour + 1
Gosub Antirrebote

Misma modificación aquí:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
Minute = Minute + 1
Gosub Antirrebote
IF Minute = 60 THEN Minute = 0
Gosub Antirrebote

Revisa esto también:
;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 60 THEN
Minute = 0
Hour = Hour + 1
IF Hour = 24 THEN
Hour = 0
Minute = 0
Second = 0
Ticks = 0; (redundante)
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0

HRS_IZQ = 0
ENDIF
ENDIF
ENDIF
 
Última edición:
Revisa esto:

Así como está, el antirrebote sólo funciona al pulsar de 24 a 0.
Si es necesario, añade esto:


Misma modificación aquí:


Revisa esto también:
Hola, Nirvana, gracias por los señalamientos, he corregido el programa. Ya solo sigo peleando con lo de los Display de 7 segmentos. Cuestiones de novato. Mil gracias. Saludos.
 
Hola...Posiblemente sea algo referente al simulador, porque no empacas la simulación y el hex en un Zip o Rar y lo subes al foro.

De otra forma hay que hacer los esquemas y escribir y compilar el programa para probar/revisar.

Saludos.
 
Ummm, no uso proteus, pero ¿esa cosa simula el voltaje Vf? los LED azules requieren más voltaje y no sé si el umbral de visualización no les permita "encenderse", por ejemplo, mira esta simulación en Multisim:
1709963866674.png

Debo modificar el parámetro de corriente de encendido para simularlo y que ambos enciendan
1709963990499.png
Prueba bajar el valor de las resistencias a 220
 
Hola Nuyel

Para los LED individuales Proteus permite ajustar ciertos parámetros como el mencionado pero para los display, no es posible ajustar la corriente de cada led o del total.

De todas formas el participante si bien retorno al foro, hizo caso omiso a las recomendaciones para facilitar el poder ayudarlo en su problema.

Saludos.
 
Hola a todos. Gracias por sus respuestas. Creo que ya está terminado el proyecto. Mi PC no es muy nueva y eficiente para las simulaciones. ¿Puede, por favor, alguien confirmarme si funciona adecuadamente? Anexo archivo RAR con el proyecto en Proteus 8.7 y el archivo .HEX. El multiplexado está programado con 5 mS de retraso para lograr la impresión de que los cuatro dígitos se "encienden" al mismo tiempo. Me interesa saber si los botones para incrementar horas y minutos trabajan adecuadamente. De antemano, mil gracias.
 

Adjuntos

  • PRUEBA.rar
    50 KB · Visitas: 3
En mi simulación, los botones funcionan pero el display esta permanentemente colocándose en "0" por lo que los valores son visibles por una fracción de segundos.

Al simular en Proteus coloca las propiedades de las resistencias como valores digitales en vez de analógico para aligerar la carga de la CPU al momento de la simulación.

La conexión de los transistores multiplexores no me satisfacer de esa forma(colector común en NPN).
 
En mi simulación, los botones funcionan pero el display esta permanentemente colocándose en "0" por lo que los valores son visibles por una fracción de segundos.

Al simular en Proteus coloca las propiedades de las resistencias como valores digitales en vez de analógico para aligerar la carga de la CPU al momento de la simulación.

La conexión de los transistores multiplexores no me satisfacer de esa forma(colector común en NPN).
Hola, ricbevi, gracias por contestar. ¿Puedes decirme, por favor, cómo hacer lo de "Al simular en Proteus coloca las propiedades de las
resistencias como valores digitales en vez de analógico para aligerar la carga de la CPU al momento de la simulación"? Soy novato en esto. Nuevamente, gracias.
 
¿Los cambió? porque para mí que son PNP solo que el símbolo está al revés en la imagen que comparte, pero la conexión es correcta.
Todo puede ser pero me baso en lo la simulación que compartió.
Pru.jpg

Hola, ricbevi, gracias por contestar. ¿Puedes decirme, por favor, cómo hacer lo de "Al simular en Proteus coloca las propiedades de las
resistencias como valores digitales en vez de analógico para aligerar la carga de la CPU al momento de la simulación"? Soy novato en esto. Nuevamente, gracias.
Si, como no, de esta forma....

Seleccionas con el botón secundario sobre cada resistencia(Ctrol+E) y cambias las propiedades dentro de la hoja que te abre.
1.jpg
2.jpg
 
Atrás
Arriba