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