TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: bichomen 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:
(https://i.imgur.com/VuSoYG3.jpg)
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.
-
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.
-
Hola, este es el circuito:
(https://i.imgur.com/4UyDfZm.jpg)
Aquí un video de su funcionamiento:
-
Hola, has montado el circuito físicamente? En el simulador es de esperarse cualquier cosa, cuándo se trata de velocidad.
-
No, físicamente, además me falta el programador, que estoy esperando que me llegue.
-
Habrá que armar, no queda otra.
-
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.
-
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).
'****************************************************************
'* 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
-
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
-
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).
'****************************************************************
'* 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
-
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 :).
'****************************************************************
'* 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
- Tienes que ingresar para ver archivos adjuntos -
-
(http://[attachment id=1 msg=411007][/attachment])
-
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).
'****************************************************************
'* 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
-
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.