Panel de texto

Lugar dedicado a el diseño y realización de circuitos eléctricos, electrónicos, localización de componentes, aparatos de medida y otros.
Mensaje
Autor
Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Panel de texto

#1 Mensaje por troglodita »

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   :oops:  este es el resultado. Todo el hardware y software es diseño mío, menos la placa del Arduino.

Imagen

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 :?

Imagen
Qué bien y qué pronto, le dijo la tonta al tonto.

Avatar de Usuario
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

#2 Mensaje por heli »

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.
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es

Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#3 Mensaje por troglodita »

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.
Qué bien y qué pronto, le dijo la tonta al tonto.

Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#4 Mensaje por troglodita »

Este es el 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

  {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); 
  }  
}
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.
Qué bien y qué pronto, le dijo la tonta al tonto.

Avatar de Usuario
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

#5 Mensaje por heli »

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

Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#6 Mensaje por troglodita »

Imagen

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); 
  }  
}
En realidad hay algo mal seguramente en el circuito y ocurre lo siguiente:
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.

Imagen

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.

Avatar de Usuario
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

#7 Mensaje por heli »

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.
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...
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

Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#8 Mensaje por troglodita »

heli escribió: Mié Oct 19, 2022 7:54 pmEs 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.
Es curioso que pase sólo en la primera fila y no en las demás siendo el mismo código para todas.
heli escribió: Mié Oct 19, 2022 7:54 pmNo veo donde controlas OE, supongo que lo dejas a LOW todo el tiepo para que los displays esten activados.
Así es. En HIGH está inactivado. Lo he inactivado y activado cuando es necesario pero no hay diferencia.
heli escribió: Mié Oct 19, 2022 7:54 pmTampoco 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)?
del 5 al 12 están los TIP125 que alimentan las filas de 60 LEDs cada uno.
heli escribió: Mié Oct 19, 2022 7:54 pmEntiendo que tienes los chips encadenados SDO con SDI y LE en común.
Sí.
heli escribió: Mié Oct 19, 2022 7:54 pmMir a ver que tal va esto, como no tengo el esquema a lo mejor no funciona nada
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.

Imagen

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.

Avatar de Usuario
troglodita
Mensajes: 2336
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#9 Mensaje por troglodita »

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.

Imagen


Haciendo pruebas he visto que el desplazamiento que hace es porque repite el último dato en la fila 1, sea 1 ó 0.

Imagen

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.

Avatar de Usuario
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

#10 Mensaje por heli »

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.

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

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados