Autor Tema: Letras en un 7 segmentos de 2 digitos  (Leído 521 veces)

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

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Letras en un 7 segmentos de 2 digitos
« en: 02 de Julio de 2019, 09:56:15 »
Hola a todos,

Para empezar quiero decir que soy nuevo en la materia, apenas se nada de Basic, me he basado en códigos similares para intentar hacer los que pretendo, que no es mas que sacar una palabra "HOLA" que vaya de derecha a izquierda la salida es un 7 segmentos con 2 dígitos, os pongo el código:



Funciona, pero a medias, es decir, solo muestra uno de los dígitos a la vez, no los 2, he probado a bajar y subir el relay para que parezca que estén a la vez los 2 dígitos encendidos a la vez, pero no lo consigo, a ver si me podéis ayudar o guiar un poco, gracias.
« Última modificación: 02 de Julio de 2019, 11:14:43 por bichomen »

Conectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1041
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #1 en: 02 de Julio de 2019, 10:12:25 »
Que tal bichomen,

Mencionas que estás usando un relay para activar los digitos. Si es así, ya desde ahí estás incorrecto. Lo que debes usar es transitores para encender y apagar los digitos y usar una técnica de multiplexación, en la cual se enciende uno y otro digitos relativamente rápido de moso que el ojo percibr que ambos dígitos (displays) están encendidos.
Sube tu esquemático para corroborar esto y entonces ayudarte a realizar el circuito correctamente y después a modificar el código para su funcionamiento.

elreypic.

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #2 en: 02 de Julio de 2019, 11:22:32 »
Hola, este es el circuito:



Aquí un video de su funcionamiento:


« Última modificación: 02 de Julio de 2019, 11:40:58 por bichomen »

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 251
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #3 en: 02 de Julio de 2019, 12:35:41 »
Hola, has montado el circuito físicamente? En el simulador es de esperarse cualquier cosa, cuándo se trata de velocidad.

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #4 en: 02 de Julio de 2019, 15:30:17 »
No, físicamente, además me falta el programador, que estoy esperando que me llegue.


Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 251
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #5 en: 02 de Julio de 2019, 21:16:30 »
Habrá que armar, no queda otra.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3488
    • Pinballsp
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #6 en: 03 de Julio de 2019, 03:24:03 »
Funciona, pero a medias, es decir, solo muestra uno de los dígitos a la vez, no los 2, he probado a bajar y subir el relay para que parezca que estén a la vez los 2 dígitos encendidos a la vez, pero no lo consigo, a ver si me podéis ayudar o guiar un poco, gracias.


Cuando mencionas "relay", te debes de estar refiriendo a "Delay", en ese caso no debes de aumentarlo, sino reducirlo para que ambos dígitos aparenten estar encendidos al mismo tiempo.

200ms es mucho retardo para conseguir el efecto que buscas, bájalo a 20 ó 30ms, o ve probando reduciendo poco a poco hasta que ambos dígitos queden fijos en el display.

Y una cosa más, muy importante para que funcione bien. Debes de considerar y separar lo que es el efecto de persistencia de los datos en el display, a lo que es la velocidad de presentación. Son cosas totalmente distintas, y tal como lo estás programando, NO tienes el control de ambas.

Lo correcto, para crear el efecto de persistencia, es que lo programes usando un timer vinculado a una interrupción, y luego ya tranquilamente, sin problemas de retardo, alimentes, por ejemplo, un array o un par de variables, con los datos a visualizar.
« Última modificación: 03 de Julio de 2019, 03:45:28 por planeta9999 »

Conectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1041
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #7 en: 04 de Julio de 2019, 10:36:15 »
Que tal bichomen,

Me di a la tarea de realizar el ejemplo que estás tratando de simular y encontré una solución para simularlo en Proteus. He hecho un código rápido (me di cuenta de que estás usando el Proton Compiler). Lo primero es que el tipo de display de 2 dígitos de 7 segmentos de Anodo común es algo así como digital, es decir no se preocupa de corrientes ni voltajes para la operación de los leds de cada segmento, simplemente ve los niveles lógicos y este enciende o apaga los segmentos y/o digitos en cuestión.
Lo primero es reemplazar los transistores PNP (2N3906) por inversores, en este caso el 74HC04. Esto es slo para el simulador en el circuito real sí necesitas los transistores 2N3906 al igual que las resistencias.

 

* Hola7seg.JPG
(81.55 kB, 882x396 - visto 88 veces)


Lo segundo es realizar el código y este quedó de la siguiente manera (ojo no es un código optimizado, es un código rápido de demo que realiza el trabajo).

Código: [Seleccionar]
'****************************************************************
'*  Name    : HOLA7SEG.BAS                                      *
'*  Author  : elreypic                                          *
'*  Notice  : Copyright (c) 2019                                *
'*          : All Rights Reserved                               *
'*  Date    : 7/4/2019                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F84A
Declare Xtal = 4

'****************************************************************************************
'               DEFINICION DE VARIABLES Y BANDERAS
'****************************************************************************************
Dim I As Byte   'Variable auxiliar para los ciclos FOR

'****************************************************************************************
'               INICIO DE PROGRAMA PRINCIPAL
'****************************************************************************************
INICIO: TRISB = %00000000
        TRISA = %11111100
        PORTB = 255
        PORTA = 3
AGAIN:  For I=0 To 200
            PORTB = 255
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001001  'Muestra "H"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001001   'Muestra "H"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000000   'Muestra "O"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000000   'Muestra "O"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000111   'Muestra "L"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000111   'Muestra "L"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001000   'Muestra "A"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001000   'Muestra "A"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = 255
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        DelayMS 400
        GoTo    AGAIN

En el circuito real es posible que necesites cambiar los valores del tiempo de desplegado, los cuales están definidos en cada ciclo FOR (si te fijas va de 0 a 200).
Espero esto te sirva para lo que estás tratando de hacer.

elreypic

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #8 en: 04 de Julio de 2019, 14:32:11 »
Funciona, pero a medias, es decir, solo muestra uno de los dígitos a la vez, no los 2, he probado a bajar y subir el relay para que parezca que estén a la vez los 2 dígitos encendidos a la vez, pero no lo consigo, a ver si me podéis ayudar o guiar un poco, gracias.


Cuando mencionas "relay", te debes de estar refiriendo a "Delay", en ese caso no debes de aumentarlo, sino reducirlo para que ambos dígitos aparenten estar encendidos al mismo tiempo.

200ms es mucho retardo para conseguir el efecto que buscas, bájalo a 20 ó 30ms, o ve probando reduciendo poco a poco hasta que ambos dígitos queden fijos en el display.

Y una cosa más, muy importante para que funcione bien. Debes de considerar y separar lo que es el efecto de persistencia de los datos en el display, a lo que es la velocidad de presentación. Son cosas totalmente distintas, y tal como lo estás programando, NO tienes el control de ambas.

Lo correcto, para crear el efecto de persistencia, es que lo programes usando un timer vinculado a una interrupción, y luego ya tranquilamente, sin problemas de retardo, alimentes, por ejemplo, un array o un par de variables, con los datos a visualizar.

Si me refería a Delay

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #9 en: 04 de Julio de 2019, 14:40:33 »
Que tal bichomen,

Me di a la tarea de realizar el ejemplo que estás tratando de simular y encontré una solución para simularlo en Proteus. He hecho un código rápido (me di cuenta de que estás usando el Proton Compiler). Lo primero es que el tipo de display de 2 dígitos de 7 segmentos de Anodo común es algo así como digital, es decir no se preocupa de corrientes ni voltajes para la operación de los leds de cada segmento, simplemente ve los niveles lógicos y este enciende o apaga los segmentos y/o digitos en cuestión.
Lo primero es reemplazar los transistores PNP (2N3906) por inversores, en este caso el 74HC04. Esto es slo para el simulador en el circuito real sí necesitas los transistores 2N3906 al igual que las resistencias.

  - Tienes que ingresar para ver archivos adjuntos -  

Lo segundo es realizar el código y este quedó de la siguiente manera (ojo no es un código optimizado, es un código rápido de demo que realiza el trabajo).

Código: [Seleccionar]
'****************************************************************
'*  Name    : HOLA7SEG.BAS                                      *
'*  Author  : elreypic                                          *
'*  Notice  : Copyright (c) 2019                                *
'*          : All Rights Reserved                               *
'*  Date    : 7/4/2019                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F84A
Declare Xtal = 4

'****************************************************************************************
'               DEFINICION DE VARIABLES Y BANDERAS
'****************************************************************************************
Dim I As Byte   'Variable auxiliar para los ciclos FOR

'****************************************************************************************
'               INICIO DE PROGRAMA PRINCIPAL
'****************************************************************************************
INICIO: TRISB = %00000000
        TRISA = %11111100
        PORTB = 255
        PORTA = 3
AGAIN:  For I=0 To 200
            PORTB = 255
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001001  'Muestra "H"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001001   'Muestra "H"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000000   'Muestra "O"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000000   'Muestra "O"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000111   'Muestra "L"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000111   'Muestra "L"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001000   'Muestra "A"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001000   'Muestra "A"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = 255
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        DelayMS 400
        GoTo    AGAIN

En el circuito real es posible que necesites cambiar los valores del tiempo de desplegado, los cuales están definidos en cada ciclo FOR (si te fijas va de 0 a 200).
Espero esto te sirva para lo que estás tratando de hacer.

elreypic

Hola, por bucles, así también lo intente pero no supe aplicarlo bien.

Este fin de semana probare lo que me habéis dicho: separar el efecto de persistencia de los datos en el display, a lo que es la velocidad de presentación, que es lo que hace @elreypic2

También en el simulador cambiare los transistores por inversores.

Si estoy usando el Proton IDE, para el código. Una vez tenga el esquema definitivo, ¿con Proteus se puede diseñar la placa?


Gracias

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #10 en: 04 de Julio de 2019, 21:41:21 »
En realidad creo es más sencillo de lo que parece, aprovechando que tomé un respiro y recordé que tenía un contador de 4 dígitos; me tomé la molestia de adaptarlo a la necesidad de bichomen. Solo que para que veas un poco el efecto en Proteus te recomiendo que uses los displays individuales, no sé porque en el modelo que usas hace cosas raras  :).
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : EJM                                               *
'*  Notice  : Copyright (c) 2019 EJM                            *
'*          : All Rights Reserved                               *
'*  Date    : 04/07/2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F84A
Xtal = 4
TRISB=0         
TRISA=0         
Dim x As Byte     

texto:
For x=1 To 20            ; repeticiones   
    PORTA=2 :PORTB=64    ; letra O
    DelayMS 5     
    PORTA=1 :PORTB=9     ; letra H
    DelayMS 5
    Next
For x=1 To 20            ; repeticiones     
    PORTA=2 :PORTB=71    ; letra L
    DelayMS 5     
    PORTA=1 :PORTB=64    ; letra O
    DelayMS 5
    Next
For x=1 To 20            ; repeticiones de este segmento   
    PORTA=2 :PORTB=8     ; letra A
    DelayMS 5     
    PORTA=1 :PORTB=71    ; letra L
    DelayMS 5
    Next
For x=1 To 20            ; repeticiones de este segmento     
    PORTA=2 :PORTB=127   ; apaga el display
    DelayMS 5     
    PORTA=1 :PORTB=8     ;letra A
    DelayMS 5
    Next
For x=1 To 20            ; repeticiones de este segmento   
    PORTA=2 :PORTB=9     ;letra H
    DelayMS 5     
    PORTA=2 :PORTB=127   ;apaga el display
    DelayMS 5
    Next

GoTo texto
End

Adjunto un imagen del circuito, porque uso Proteus 8.7
  - Adjunto no válido -

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #11 en: 04 de Julio de 2019, 21:45:18 »

Desconectado bichomen

  • PIC10
  • *
  • Mensajes: 6
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #12 en: 07 de Julio de 2019, 08:58:00 »
Lo segundo es realizar el código y este quedó de la siguiente manera (ojo no es un código optimizado, es un código rápido de demo que realiza el trabajo).

Código: [Seleccionar]
'****************************************************************
'*  Name    : HOLA7SEG.BAS                                      *
'*  Author  : elreypic                                          *
'*  Notice  : Copyright (c) 2019                                *
'*          : All Rights Reserved                               *
'*  Date    : 7/4/2019                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F84A
Declare Xtal = 4

'****************************************************************************************
'               DEFINICION DE VARIABLES Y BANDERAS
'****************************************************************************************
Dim I As Byte   'Variable auxiliar para los ciclos FOR

'****************************************************************************************
'               INICIO DE PROGRAMA PRINCIPAL
'****************************************************************************************
INICIO: TRISB = %00000000
        TRISA = %11111100
        PORTB = 255
        PORTA = 3
AGAIN:  For I=0 To 200
            PORTB = 255
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001001  'Muestra "H"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001001   'Muestra "H"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000000   'Muestra "O"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000000   'Muestra "O"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %11000111   'Muestra "L"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %11000111   'Muestra "L"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = %10001000   'Muestra "A"
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        For I=0 To 200
            PORTB = %10001000   'Muestra "A"
            PORTA = 1
            DelayMS 1
            PORTA = 3
            PORTB = 255
            PORTA = 2
            DelayMS 1
            PORTA = 3
        Next I
        DelayMS 400
        GoTo    AGAIN

En el circuito real es posible que necesites cambiar los valores del tiempo de desplegado, los cuales están definidos en cada ciclo FOR (si te fijas va de 0 a 200).
Espero esto te sirva para lo que estás tratando de hacer.

elreypic

Hola,

¿Porque PORTA 3? ¿Haces aparecer la letra primero de forma oculta? He modificado un poco los tiempos, porque se me antojaba que iban un poco rapidas las letras

Conectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1041
Re:Letras en un 7 segmentos de 2 digitos
« Respuesta #13 en: 08 de Julio de 2019, 16:38:32 »
                           
Hola,

¿Porque PORTA 3? ¿Haces aparecer la letra primero de forma oculta? He modificado un poco los tiempos, porque se me antojaba que iban un poco rapidas las letras

Que tal bichomen,

La instrucción PORTA=3 es necesaria para que la simulación funcione correctamente. Esto es porque al parecer el display de 2 dígitos de 7 segmentos tiene un bug, el cual antes de desplegar un dato el dígito se necesita apagar, esa instrucción del PORTA = 3 no es necesaria en el circuito real.

saludos,

elreypic.