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: 2335
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#11 Mensaje por troglodita »

heli escribió: Vie Oct 21, 2022 7:59 pmUn 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.
Lo he corregido pero curiosamente ahora ocurre esto:

Imagen

Es como si la fila 7 repitiese todos los LEDs de las filas de arriba.

Investigando este nuevo suceso he descubierto el fallo del impulso de reloj extra.

En esta parte del programa:

Código: Seleccionar todo

    digitalWrite(fila + 5, HIGH);
    digitalWrite(fila + 6, LOW);


apago la fila anterior y enciendo la fila siguiente, pero cuando es la primera fila (pin 6), al apagar el pin anterior, (pin 5), como lo apago con un HIGH realmente estoy metiendo un HIGH en el pin 5 que es el CLK. :oops:
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

#12 Mensaje por heli »

¿Has probado mi programa? Tiene un error, hay que cambiar fila + 5 por fila + 6, no había visto que el pin 5 es CLK.
Entiendo que los transistores estan en los pines 6,7,8,9,10,11,12,13

Yo apago primero la fila indicada por el contador de filas, luego incremento el contador de filas, si es >=8 lo hago 0, actulizo los registros y enciendo la fila indicada por el contador de filas. Esto evita que se pueda escribir en un PIN no revisto.
¡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: 2335
Registrado: Lun Mar 29, 2010 10:47 am
País: España
Ciudad: Alcorcón Madrid

Re: Panel de texto

#13 Mensaje por troglodita »

Ahora haré la corrección que me indicas, ya que al probarlo no sale nada por los LEDs.

De momento así funciona bien, con la excepción de que en la primera fila parpadean ligeramente los leds apagados coma ya he comentado. Apenas se nota pero tengo que averiguar por qué.

Así queda el programa por ahora:

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 {fila}[columna}

  {0x02, 0x27, 0x20, 0x70, 0x73, 0xE8, 0xBE, 0xF8},     
  {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++) {    //elementos{fila}[columna}
    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;
      }                   
    }
    if (fila == 0) {                //Este if es para evitar que al apagar la
      digitalWrite(12, HIGH);       //fila anterior cuando estamos en la fila     
    }                               //primera (pin 6) meta un impulso de CLK 
    else {                          //en el pin 5, ya que los TIP125 se apagan
      digitalWrite(fila + 5, HIGH); //con HIGH y se encienden con LOW.     
    }
    
    digitalWrite(fila + 6, LOW);
    digitalWrite(LE, HIGH);
    delayMicroseconds(10); 
  }  
}
Qué bien y qué pronto, le dijo la tonta al tonto.

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

Re: Panel de texto

#14 Mensaje por troglodita »

heli escribió: Sab Oct 22, 2022 2:18 pmEntiendo que los transistores estan en los pines 6,7,8,9,10,11,12,13
Son 7 filas de 60 LEDs cada una. 7 transistores en los pines 6,7,8,9,10,11,12. En el 13 no hay nada conectado.
Qué bien y qué pronto, le dijo la tonta al tonto.

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

Re: Panel de texto

#15 Mensaje por troglodita »

Ya he probado tu nuevo programa.
No hacía nada. Lo he revisado y he hecho este cambio, ya que oldmillis nunca puede ser >= que millis() +10

Código: Seleccionar todo

  if (oldmillis >= millis()+10){

Código: Seleccionar todo

  if (millis() >= oldmillis+10){
Con ese cambio el programa funciona bien pero parpadea la imagen bastante. No veo por qué.

Lo del ligero parpadeo (que realmente son secuencias de los leds en grupos de 8 de 0 a 255), supongo que no tiene nada que ver con el software. Será algún ruido que se mete por algún lado. Pero es 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

#16 Mensaje por heli »

El parpadeo puede ser debido a que apaga la fila anterior muy lejos de encender la siguiente, el display queda en blanco demasiado tiempo. También hay una ieración del bucle de filas de más. También puede aumentarse la frecuencia de refresco.
Prueba esto:

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; 
  byte fila_anterior = fila; 
  if (fila++ >= 7 ) 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(fila_anterior + 6, HIGH); // Quito alimentacio LEDs fila anterior
  digitalWrite(LE, HIGH);       // Activa envio datos cargados en los buffer de los MBI-5026 a los LEDs
  delayMicroseconds(1);   	    // Peque¤o retardo
  digitalWrite(LE, LOW);        // Desactiva envio dato
  digitalWrite(fila + 6, 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 (millis() >= oldmillis+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

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

Re: Panel de texto

#17 Mensaje por troglodita »

Sigue parpadeando. De todas formas, el último programa que he puesto va bastante bien. Con excepción del problema que he comentado de los LEDs de la primera fila, que con luz y letras en el panel apenas se aprecia.

En este vídeo se ve claramente:

https://youtu.be/F1iYeN6gnRc
Qué bien y qué pronto, le dijo la tonta al tonto.

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

Re: Panel de texto

#18 Mensaje por troglodita »

Creo que ya está todo solucionado.

Con respecto al problema de los LEDs fantasma de la primera fila, después de tirar de osciloscopio, ver que todas las señales son un caos, con lo cual el osciloscopio me ha liado más todavía y hacer muchos cambios y programas y usar varios arduinos distintos, uno antiguo con chip DIL y otro con chip pequeño, he llegado a la conclusión de que en los arduinos el pin 6 está embrujado.
Todo ese "ruido" sale por el pin 6 y entra por la base del TIP 125, sale por el colector, atraviesa los LEDs y llega a los MBI-5026. Esto no tiene mucho sentido pero es la conclusión a la que he llegado.

Para deshacerme del pin 6 he usado los pines del 7 al 13, pero el pin 13 de mis arduinos no funcionan en este circuito.
Como el pin 3 (señal OE), está siempre a cero, he pasado la última fila a ese pin y he hecho una chapucilla momentánea (poco elegante) para dirigirme a ese pin a su tiempo.

Ahora todo funciona perfectamente. :D
troglodita escribió: Sab Oct 22, 2022 1:48 pmEs como si la fila 7 repitiese todos los LEDs de las filas de arriba.
Esto ocurría porque al corregir el valor fila < 8 por el de fila < 7 nunca se apagaba la última fila del pin 13.
Qué bien y qué pronto, le dijo la tonta al tonto.

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

Re: Panel de texto

#19 Mensaje por troglodita »

Aunque con los cambios anteriores ya funciona bien, he vuelto a dejarlo como al principio para seguir investigando lo de la secuencia fantasma en la primera fila.
Si conecto otra fila al pin 6 la secuencia fantasma aparece en esa otra fila, luego se descarta el TIP125 de la primera fila, ya que todos lo hacen si se conectan al pin 6.
Esa secuencia fantasma aparece en los LEDs controlados por los MBI-5026 1º, 2º y 4º, no en el 3º. Si cambio el 3º por el 2º sigue apareciendo en el 2º y no el 3º, luego se descartan los MBI-5026.
Si desconecto el TIP125 del pin 6 y lo conecto directamente a GND (se activa por 0) sigue apareciendo la secuencia fantasma, luego no le entra por el pin 6 como parecía lógico. :cry:
Es decir, si uso en el programa el pin 6, aunque luego no lo use físicamente, aparece el problema. Sólo desaparece si en el programa no uso el pin 6.
Después de hacer muchas pruebas y usar otros Arduinos, (he usado Nano, Uno con chip pequeño, Uno con chip DIL y Diecimilla con ATmega 168), con todos ocurría lo mismo.
La frecuencia de esa secuencia fantasma no variaba si aumentaba los delays o incluso si los quitaba (he visto que no hacen falta).
Por si fuese por la fuente de alimentación conmutada, lo he conectado a una fuente con transformador, puente, condensador y 7805, pero sigue igual. Esa secuencia tiene que salir de los arduinos.
Lo siguiente que he hecho ha sido desactivar las interrupciones, ya que no uso ni interrupciones ni delays, con "noInterrupts()" y mano de santo. Ha desaparecido la secuencia fantasma. :D
He pasado el programa a un Arduino Nano para dejarlo integrado en el panel (sólo he conseguido programarlo con el IDE 1.0.3). :!:
Y así es como ha quedado 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 {fila}[columna}

  {0x02, 0x27, 0x20, 0x70, 0x73, 0xE8, 0xBE, 0xF8},     
  {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
  noInterrupts();              // Evita secuencia fantasma tenue en fila 1
}

void loop() {
  for (byte fila=0; fila < 8; fila++) {    //elementos{fila}[columna}
    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);
        digitalWrite(CLK, LOW);
        data<<=1;
      }                   
    }
    if (fila == 0) {                //Este if es para evitar que al apagar la
      digitalWrite(12, HIGH);       //fila anterior cuando estamos en la fila     
    }                               //primera (pin 6) meta un impulso de CLK 
    else {                          //en el pin 5, ya que los TIP125 se apagan
      digitalWrite(fila + 5, HIGH); //con HIGH y se encienden con LOW.     
    }
    
    digitalWrite(fila + 6, LOW);
    digitalWrite(LE, HIGH);
  }  
}
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

#20 Mensaje por heli »

Enhorabuena!
Al final un mix de ideas y resultados de pruebas...
El pin 6 del arduino es también la salida OC0A que del Timer 0, no había visto nunca problemas, pero lo tendré en cuenta.
¡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: Ahrefs [Bot] y 0 invitados