Panel de texto
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Panel de texto
En la revista Elektor nº 255 de agosto de 2001 se publicó un artículo para montar un panel de texto. Ese mismo mes empecé a hacerme con el material necesario.
Primero lo hice sólo con tres módulos, pero no iba bien, ya que en el circuito de Elektor usan un 74LS164 para activar los leds y no los mantiene encendidos mientras se carga la línea siguiente. El efecto era muy malo.
Lo dejé algún tiempo y lo retomé añadiendo un integrado más entre cada 74LS164 y los leds. Todo se controlaba desde un 16F84A.
No recuerdo qué paso ni por qué lo dejé aparcado.
Un tiempo después apareció el Arduino y decidí retomarlo.
Encontré un integrado que hacía la misma función que los dos anteriores, el MBI-5026, que controla 16 LEDs cada uno y es muy fácil de manejar.
No sé por qué volví a aparcar el asunto.
Como cada vez cacharreo menos y a este paso se me va a olvidar la electrónica, lo he vuelto a retomar.
Antes hacía las placas con el EAGLE y con insoladora. Ya no me acuerdo del EAGLE y he hecho las placas con rotulador a mano y también he usado placas de estas con agujeros.
De momento y después de 21 años este es el resultado. Todo el hardware y software es diseño mío, menos la placa del Arduino.
El panel va con un Arduino nano, pero no sé por qué, funcionan sólo una vez y se quedan inutilizados, ya me he cargado dos, por eso de momento he puesto un Arduino UNO. No sé si tendrá algo que ver el Windows 10 y el CH340, ya que hasta hace poco tenía el Windows 7
Primero lo hice sólo con tres módulos, pero no iba bien, ya que en el circuito de Elektor usan un 74LS164 para activar los leds y no los mantiene encendidos mientras se carga la línea siguiente. El efecto era muy malo.
Lo dejé algún tiempo y lo retomé añadiendo un integrado más entre cada 74LS164 y los leds. Todo se controlaba desde un 16F84A.
No recuerdo qué paso ni por qué lo dejé aparcado.
Un tiempo después apareció el Arduino y decidí retomarlo.
Encontré un integrado que hacía la misma función que los dos anteriores, el MBI-5026, que controla 16 LEDs cada uno y es muy fácil de manejar.
No sé por qué volví a aparcar el asunto.
Como cada vez cacharreo menos y a este paso se me va a olvidar la electrónica, lo he vuelto a retomar.
Antes hacía las placas con el EAGLE y con insoladora. Ya no me acuerdo del EAGLE y he hecho las placas con rotulador a mano y también he usado placas de estas con agujeros.
De momento y después de 21 años este es el resultado. Todo el hardware y software es diseño mío, menos la placa del Arduino.
El panel va con un Arduino nano, pero no sé por qué, funcionan sólo una vez y se quedan inutilizados, ya me he cargado dos, por eso de momento he puesto un Arduino UNO. No sé si tendrá algo que ver el Windows 10 y el CH340, ya que hasta hace poco tenía el Windows 7
Qué bien y qué pronto, le dijo la tonta al tonto.
- heli
- Mensajes: 1957
- Registrado: Mié Sep 06, 2006 7:28 am
- País: España
- Ciudad: Alcalá de Henares
- Ubicación: Alcala de Henares (Madrid, España)
- Contactar:
Re: Panel de texto
Muy chulo!,
Yo hice uno parecido pero sin registros de desplazamiento, sólo lathc 74hc273 y multiplexado. También con arduino, un mini en mi caso.
El arduino nano de 8Mhz funciona a 3.3V. Si lo tienes de 16Mhz es de 5V. Puede darte problemas. También el bootloader da bastante guerra en los clones de arduino nano, mini y micro.
Yo hice uno parecido pero sin registros de desplazamiento, sólo lathc 74hc273 y multiplexado. También con arduino, un mini en mi caso.
El arduino nano de 8Mhz funciona a 3.3V. Si lo tienes de 16Mhz es de 5V. Puede darte problemas. También el bootloader da bastante guerra en los clones de arduino nano, mini y micro.
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es
Aka: no es difícil si sabes como.
http://heli.xbot.es
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Re: Panel de texto
Es el de 16MHz.
En el ordenador tengo las IDEs 1.5, 1.8 y 2.0. Tengo 6 tipos de Arduino distintos y cuando uno no funciona en una IDE lo programo con otra.
La próxima semana pongo el programa.
En el ordenador tengo las IDEs 1.5, 1.8 y 2.0. Tengo 6 tipos de Arduino distintos y cuando uno no funciona en una IDE lo programo con otra.
La próxima semana pongo el programa.
Qué bien y qué pronto, le dijo la tonta al tonto.
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Re: Panel de texto
Este es el programa:
Un día de estos le pondré movimiento.
Los textos los hago en Microsoft Word y los paso al programa con Copy-Paste. Es hacer el texto con unos y ceros, 64 x 7, (sólo hay 60 LEDs por fila pero hay 4 MBI-5026), y pasar cada grupo de ocho a hexadecimal.
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x02,0x4C,0x83,0x03,0x3D,0x2F,0xA5,0xE6},
{0x04,0xA5,0x09,0x09,0x43,0x44,0x48,0x52},
{0x04,0xA5,0x09,0x08,0x42,0xC4,0x48,0x92},
{0x07,0xA5,0x0F,0x0B,0x72,0x44,0x49,0x1E},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0x99,0xE9,0x06,0x7A,0x44,0x33,0xD2},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
digitalWrite(LE, LOW);
for (byte columna=0; columna < 8; columna++) {
digitalWrite(SDI, (elementos[fila][columna] & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x40) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x20) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x10) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x08) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x04) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x02) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x01) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
}
digitalWrite(fila + 5, HIGH);
digitalWrite(fila + 6, LOW);
digitalWrite(LE, HIGH);
delayMicroseconds(10);
}
}
Los textos los hago en Microsoft Word y los paso al programa con Copy-Paste. Es hacer el texto con unos y ceros, 64 x 7, (sólo hay 60 LEDs por fila pero hay 4 MBI-5026), y pasar cada grupo de ocho a hexadecimal.
Qué bien y qué pronto, le dijo la tonta al tonto.
- heli
- Mensajes: 1957
- Registrado: Mié Sep 06, 2006 7:28 am
- País: España
- Ciudad: Alcalá de Henares
- Ubicación: Alcala de Henares (Madrid, España)
- Contactar:
Re: Panel de texto
Muy chulo... mando una mini mejora para sustituir parte del código por un bucle...
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x02,0x4C,0x83,0x03,0x3D,0x2F,0xA5,0xE6},
{0x04,0xA5,0x09,0x09,0x43,0x44,0x48,0x52},
{0x04,0xA5,0x09,0x08,0x42,0xC4,0x48,0x92},
{0x07,0xA5,0x0F,0x0B,0x72,0x44,0x49,0x1E},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0x99,0xE9,0x06,0x7A,0x44,0x33,0xD2},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
digitalWrite(LE, LOW);
for (byte columna=0; columna < 8; columna++) {
byte data = elementos[fila][columna];
for (byte bits=0; bits < 8; bits++) {
digitalWrite(SDI, (data & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
data<<=1;
}
/*
digitalWrite(SDI, (elementos[fila][columna] & 0x40) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x20) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x10) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x08) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x04) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x02) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x01) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
*/
}
digitalWrite(fila + 5, HIGH);
digitalWrite(fila + 6, LOW);
digitalWrite(LE, HIGH);
delayMicroseconds(10);
}
}
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es
Aka: no es difícil si sabes como.
http://heli.xbot.es
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Re: Panel de texto
Funciona correctamente.
He visto que el texto que he puesto en el código no se corresponde con la imagen.
Este es el programa con el texto correcto:
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x01, 0x13, 0x90, 0x38, 0x39, 0xF4, 0x5F, 0x7C},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x0C, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x82, 0x0A, 0x88, 0x80},
{0x03, 0xE8, 0xA0, 0xF8, 0xBB, 0xC9, 0x88, 0xF0},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x27, 0x3E, 0x88, 0x73, 0xE8, 0x88, 0xF8},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
digitalWrite(LE, LOW);
for (byte columna=0; columna < 8; columna++) {
digitalWrite(SDI, (elementos[fila][columna] & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x40) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x20) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x10) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x08) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x04) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x02) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x01) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
}
digitalWrite(fila + 5, HIGH);
digitalWrite(fila + 6, LOW);
digitalWrite(LE, HIGH);
delayMicroseconds(10);
}
}
La primera línea sale desplazada un led a la izquierda, y para corregirlo, desplazo el texto una posición a la derecha antes de pasarlo a hexadecimal.
Cuando acaba de completar la primera línea le entra un ciclo extra de reloj a los MBI-5026 y se produce un desplazamiento. No veo que pueda ser del programa, ya que el de Heli hace lo mismo. Es algo curioso.
Qué bien y qué pronto, le dijo la tonta al tonto.
- heli
- Mensajes: 1957
- Registrado: Mié Sep 06, 2006 7:28 am
- País: España
- Ciudad: Alcalá de Henares
- Ubicación: Alcala de Henares (Madrid, España)
- Contactar:
Re: Panel de texto
Es un problema muy común cuando se usan registros de desplazamiento. Suele estar provocado por una inicialización incorrecta de las señales de control. Si una señal de control se debe iniciar a 0 y es activa con 1 pero esta iniciada a 1, el primer 1 no lo percibirá como señal...Cuando acaba de completar la primera línea le entra un ciclo extra de reloj a los MBI-5026 y se produce un desplazamiento. No veo que pueda ser del programa, ya que el de Heli hace lo mismo. Es algo curioso.
Vieno la hoja de datos del MBI-5026 te mando un programa con las señales de control correctamente iniciadas. No veo donde controlas OE, supongo que lo dejas a LOW todo el tiepo para que los displays esten activados. Tampoco sé que significa la líneas digitalWrite(fila + 5, LOW) ¿Que tienes conectados en los pines 5-6-7-8-9-10-11-12 (fila + 5)? Los delays no son necesarios, puedes dejarlos en 1 o quitarlos, el chip funciona hasta 25Mhz. Entiendo que tienes los chips encadenados SDO con SDI y LE en común.
Mir a ver que tal va esto, como no tengo el esquema a lo mejor no funciona nada, pero revisa lo de los estados iniciales de las señales en tu programa.
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x01, 0x13, 0x90, 0x38, 0x39, 0xF4, 0x5F, 0x7C},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x0C, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x82, 0x0A, 0x88, 0x80},
{0x03, 0xE8, 0xA0, 0xF8, 0xBB, 0xC9, 0x88, 0xF0},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x27, 0x3E, 0x88, 0x73, 0xE8, 0x88, 0xF8},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
// Garantiza estados iniciales de las se¤les de control
digitalWrite(CLK, LOW);
digitalWrite(LE, LOW); // LE inactivo
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
for (byte columna=0; columna < 8; columna++) {
digitalWrite(SDI, (elementos[fila][columna] & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10); // No son necesarios, el MBI5026 funciona hasta 25Mhz
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x40) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x20) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x10) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x08) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x04) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x02) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x01) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
}
digitalWrite(fila + 5, LOW); // Esto no se que significa...
delayMicroseconds(10);
digitalWrite(fila + 5, HIGH); // Esto no se que significa...
}
digitalWrite(LE, HIGH); // LE activo, almacena los datos
delayMicroseconds(10); // No es necesario, el MBI5026 funciona hasta 25Mhz
digitalWrite(LE, LOW); // LE inactivo
}
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es
Aka: no es difícil si sabes como.
http://heli.xbot.es
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Re: Panel de texto
Es curioso que pase sólo en la primera fila y no en las demás siendo el mismo código para todas.
Así es. En HIGH está inactivado. Lo he inactivado y activado cuando es necesario pero no hay diferencia.
del 5 al 12 están los TIP125 que alimentan las filas de 60 LEDs cada uno.
Sí.
En ese programa los LEDs parpadean muy tenue.
Este es el esquema de las conexiones de los TIP125 (los he dibujado normales pero son darlington.
Esta es la última versión del programa pero no hay diferencia. Tengo que seguir haciendo el truco en la primera línea:
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x01, 0x13, 0x90, 0x38, 0x39, 0xF4, 0x5F, 0x7C},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x0C, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x82, 0x0A, 0x88, 0x80},
{0x03, 0xE8, 0xA0, 0xF8, 0xBB, 0xC9, 0x88, 0xF0},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x27, 0x3E, 0x88, 0x73, 0xE8, 0x88, 0xF8},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
digitalWrite(LE, LOW); //Aislo el buffer de los MBI-5026 para cargarlos con la fila siguiente
for (byte columna=0; columna < 8; columna++) {
byte data = elementos[fila][columna];
digitalWrite(OE, LOW); //Añadido por si acaso
for (byte bits=0; bits < 8; bits++) {
digitalWrite(OE, LOW);
digitalWrite(SDI, (data & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
data<<=1;
}
digitalWrite(OE, HIGH); //Añadido por si acaso
}
digitalWrite(OE, HIGH); //Añadido por si acaso
digitalWrite(fila + 5, HIGH); //Quito alimentación LEDs fila actual
digitalWrite(fila + 6, LOW); //Pongo alimentación LEDs fila siguiente
digitalWrite(OE, LOW); //Añadido por si acaso
digitalWrite(LE, HIGH); //envío datos cargados en los buffer de los MBI-5026 a los LEDs
delayMicroseconds(10);
}
}
Qué bien y qué pronto, le dijo la tonta al tonto.
- troglodita
- Mensajes: 2336
- Registrado: Lun Mar 29, 2010 10:47 am
- País: España
- Ciudad: Alcorcón Madrid
Re: Panel de texto
Veo que la señal OE sólo sirve para mantener apagados los LEDs, pero sigue funcionando la entrada CLK y SDI del MBI-5026.
He cambiado microsegundos a 1 y a 20 y no he notado diferencia.
He conectado el panel a unos interruptores, (CLK antirrebotes), en vez de al Arduino y funciona perfectamente, por si fuera tema de hardware.
Haciendo pruebas he visto que el desplazamiento que hace es porque repite el último dato en la fila 1, sea 1 ó 0.
Además si os fijáis en la primera fila veréis leds medio encendidos. Realmente están haciendo una secuencia de cuenta binaria en grupos de ocho.
Si cambio microseconds(10) por delay(100) ya no parpadean los leds de la fila de arriba pero sigue repitiendo el último valor metido.
He cambiado el MBI-5026 del primer grupo de la derecha pero no hay cambios.
He modificado el programa para que sólo ilumine la primera columna de la derecha, como se ve en la primera foto pero dejando continuamente la señal LE activada, y tiempos lentos para ver qué ocurre con los datos.
Se ven dos cosas extrañas.
Empieza a meter datos desde el led 3 y cuando ha completado la primera fila hace los leds 1 y 2.
Con las demás filas hace lo mismo.
En la última fila mete basura.
https://youtu.be/GhRZwEveu5o
Seguiré investigando.
He cambiado microsegundos a 1 y a 20 y no he notado diferencia.
He conectado el panel a unos interruptores, (CLK antirrebotes), en vez de al Arduino y funciona perfectamente, por si fuera tema de hardware.
Haciendo pruebas he visto que el desplazamiento que hace es porque repite el último dato en la fila 1, sea 1 ó 0.
Además si os fijáis en la primera fila veréis leds medio encendidos. Realmente están haciendo una secuencia de cuenta binaria en grupos de ocho.
Si cambio microseconds(10) por delay(100) ya no parpadean los leds de la fila de arriba pero sigue repitiendo el último valor metido.
He cambiado el MBI-5026 del primer grupo de la derecha pero no hay cambios.
He modificado el programa para que sólo ilumine la primera columna de la derecha, como se ve en la primera foto pero dejando continuamente la señal LE activada, y tiempos lentos para ver qué ocurre con los datos.
Se ven dos cosas extrañas.
Empieza a meter datos desde el led 3 y cuando ha completado la primera fila hace los leds 1 y 2.
Con las demás filas hace lo mismo.
En la última fila mete basura.
https://youtu.be/GhRZwEveu5o
Seguiré investigando.
Qué bien y qué pronto, le dijo la tonta al tonto.
- heli
- Mensajes: 1957
- Registrado: Mié Sep 06, 2006 7:28 am
- País: España
- Ciudad: Alcalá de Henares
- Ubicación: Alcala de Henares (Madrid, España)
- Contactar:
Re: Panel de texto
Valeee, que fallo, no habia visto como hacías el multiplexado.
Te mando otro programa más elaborado, pero tambien sin probar. He separado el proceso de multiplexado que se ejecuta una llínea cada vez que permanece 10ms encendida hasta que se avanza a la siguiente. Se puede mejorar, pero prueba a ver si funciona...
Un fallo que tiene tu programa es que hace un write a (fila + 6) cuando fila = 7 y ese, pin es el 13 que queda inutilizado para otras cosas.
Sigo pensando que el problema que tienes es debido a que al iniciar el bucle alguna señal no esta en el estado correcto...
Se puede mejorar un poco el brillo moviendo digitalWrite(fila + 5, HIGH) mas cerca de digitalWrite(fila + 5, LOW) para que los LED esten mas microsegundos encendidos, mientras se transmiten los datos a los latch, pero necesitaría una variable auxiliar para recordar el valor de la fila anterior... te lo dejo a ti.
Te mando otro programa más elaborado, pero tambien sin probar. He separado el proceso de multiplexado que se ejecuta una llínea cada vez que permanece 10ms encendida hasta que se avanza a la siguiente. Se puede mejorar, pero prueba a ver si funciona...
Un fallo que tiene tu programa es que hace un write a (fila + 6) cuando fila = 7 y ese, pin es el 13 que queda inutilizado para otras cosas.
Sigo pensando que el problema que tienes es debido a que al iniciar el bucle alguna señal no esta en el estado correcto...
Se puede mejorar un poco el brillo moviendo digitalWrite(fila + 5, HIGH) mas cerca de digitalWrite(fila + 5, LOW) para que los LED esten mas microsegundos encendidos, mientras se transmiten los datos a los latch, pero necesitaría una variable auxiliar para recordar el valor de la fila anterior... te lo dejo a ti.
Código: Seleccionar todo
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal
{0x01, 0x13, 0x90, 0x38, 0x39, 0xF4, 0x5F, 0x7C},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x0C, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x82, 0x0A, 0x88, 0x80},
{0x03, 0xE8, 0xA0, 0xF8, 0xBB, 0xC9, 0x88, 0xF0},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x27, 0x3E, 0x88, 0x73, 0xE8, 0x88, 0xF8},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
digitalWrite(LE, LOW); // Inicia inactivo, nivel bajo
digitalWrite(OE, HIGH); // Inicia OE, LEDS apagados, nivel alto
digitalWrite(CLK, LOW); // Inicia inactivo, nivel bajo
// Poner aqui otras inicializaciones que lleven tiempo...
digitalWrite(OE, LOW); // Activa los LEDS , nivel bajo
}
void Multiplex(){
static byte fila = 0;
digitalWrite(fila + 5, HIGH); // Quito alimentacio LEDs fila anterior
if (fila++ >= 8 ) file = 0; // Actualizo la fila
for (byte columna=0; columna < 8; columna++){
byte data = elementos[fila][columna];
for (byte bits=0; bits < 8; bits++){
digitalWrite(SDI, (data & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH); // Activar pulso clock
delayMicroseconds(1); // Peque¤o retardo
digitalWrite(CLK, LOW); // Desactivar pulso clock
data<<=1;
}
}
digitalWrite(LE, HIGH); // Activa envio datos cargados en los buffer de los MBI-5026 a los LEDs
delayMicroseconds(1); // Pequeno retardo
digitalWrite(LE, LOW); // Desactiva envio dato
digitalWrite(fila + 5, LOW); // Pongo alimentacion a la fila actual
}
void loop() {
static long oldmillis = 0L;
// Llamar al multiplexado de LEDS cada 10ms, eso e sun mpx a 10ms = 100Hz, un refresco completo cada 8*10 = 80ms = 12,5Hz
if (oldmillis >= millis()+10){
oldmillis = millis();
Multiplex();
// Hacer otras cosas utiles aqui
}
}
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es
Aka: no es difícil si sabes como.
http://heli.xbot.es
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado