Verbinden von nicht benutzten MAX7219 Ausgang-Pins an die Masse

Hallo,
wir benutzen MAX7219, um die 5x7 LED (LTP2157AE) anzusteuern (insgesamt 8 Stück). Da der Baustein normalerweise die 8x8 LED ansteuert, sind bei uns 3 Säulen-Outputs und 1 Reihen-Output frei (siehe der Anhang).

Wir haben MaxMAtrix Library benutzt, um die Texte auf dem Prototyp-Display (bestehend aus 2 LED) darzustellen und es hat nie richtig geklappt. Erst nachdem haben wir die unbenutzten Pins 10, 5, 6 und 22 an die Masse verbunden, hat es funktioniert. Es fuktioniert schon lange und stabil!

Hat jemand hier die Erfahrung gesammelt? Ist das nicht zu große Belastung für MAX7219? Welche Spannung gibt es auf den Output-Pins und welchen Widerstand haben die Outputs, wenn sie nicht benutzt werden?

Welche Lösung wäre hier die optimalste Lösung? Durch einen Widerstand an die Masse gehen? Wenn ja, welchen Widerstand sollten wir wählen, an die wir alle 4 Outputs verbinden?

Danke
Afriend2You

Hallo,

im Moment kann ich das Problem mit offenen Ausgängen nicht verstehen.
Direkt gegen Masse einen Kurzschluss zu provozieren halte ich dagegen für falsch. Ich habe auch im Datenblatt nichts gelesen das man unbenutzte Ausgänge beschalten muss. Selbst nachvollziehen kann ich es erst später. Das wird noch eine Weile dauern. Ich habe auch 4 unbenutzte Digit Ausgänge.
Was mich etwas stutzig macht ist dein 9,3kOhm Widerstand. Arg wenig. Hat jedoch mit dem Problem nichts zu tun.
Haben deine LEDs 3,5V Uf und willst du wirklich bis zu 40mA durchjagen?
Laut Plan ist deine LED Matrix richtig angeklemmt.
Leider kann ich keine Lösung anbieten. Wenn dann später.

Hallo,

lässt mir keine Ruhe. Vage Idee. Es kann am Init / Power Up liegen. Nicht das er in "Fehler" geht, wenn er nicht alles scannen kann eben weil paar unbenutzt sind. ? Man kann ihm jedoch per Register sagen was alles angeschlossen ist und was nicht.

Hi

Da die Pins stromgetrieben sind, sollte hier ein 'Kurzschluss' durchaus auch auf Dauer überlebbar bleiben.
Und Zugegeben: Ich hätte noch keinen MAX7219 nur teilbeschaltet betrieben - ICs vorhanden, aber dann gab's das Zeug 'fertig' für kleines Geld - und dort sind Die nun Mal komplett verdrahtet und überall hängt auch was dran.

MfG

Doc_Arduino:
Hallo,

lässt mir keine Ruhe. Vage Idee. Es kann am Init / Power Up liegen. Nicht das er in "Fehler" geht, wenn er nicht alles scannen kann eben weil paar unbenutzt sind. ? Man kann ihm jedoch per Register sagen was alles angeschlossen ist und was nicht.

Hallo Doc_Arduino,
könntest Du uns näher sagen, wie wir per Register dem MAX7219 sagen können, welche Pins benutzt werden?
Wir benutzen MaxMatrix Library. Ist das eine gute Library oder sollen wir auf LedControl ausweichen?
Danke.

Hallo,

wie gesagt meine eigene Platine wird noch dauern. Da die Digit Pins gegen V+ geschalten werden wenn sie aus sind, würde ich zumindestens einen 500 Ohm bis 1k Widerstand gegen Masse klemmen und nicht direkt auf Masse legen. Sollte auch funktionieren bis das Problem hoffentlich geklärt ist.

Im Moment kann ich dich nur auf das Datenblatt verweisen. Ab Seite 6 gehts los. Digit und Control Register, Init/PowerUp. Vielleicht hat eure Lib dafür etwas vorgesehen. Wie gesagt es ist derzeit eine Vermutung das es daran liegen könnte. Wenn die LedControl Lib dafür etwas hat probiere ruhig diese aus.

Hallo,

ich habe von einem vertrauenswürdigen Menschen der mit den ICs Erfahrung hat mir sagen lassen, dass meine Vermutung nicht stimmt. Die unbenutzten Ausgänge (Digits) sollte man aus einem anderen Grund in den Register(n) abschalten. Nämlich damit das interne Multiplexing keine Zeit vergeudet. Ansonsten müssen die angeschlossenen LEDs auch mit offenen unbenutzen Ausgängen funktionieren.

Jetzt wäre die Frage für dich. Ist die Led Matrix richtig angeschlossen? Also nicht wie gewollt. Kann ja sein. Leuchtet auch wirklich der LED Punkt der laut Code leuchten soll? Nicht das du irgendwelche zufälligen Effekte hast. Was anderes fällt mir im Moment nicht ein.

Prinzipell dürfen Ausgänge nicht auf Masse, Spannungsversorgung oder andere Ausgänge geschalten werden.
Der MAX7219 hat seine Eigenheiten weil er direkt, ohne Vorwiderstände eine LED Matrix ansteuert.

Die DIG -Ausgänge begrenzen den Strom und gehen darum nicht kapputt wenn auf Masse geschaltet werden. Die Ausgänge auf Masse schalten ist aber keien Lösung eines Problems.

Das Scan-Limit Register bestimmt wieviele Digits verwenden werden. Dadurch wird das Multiplexing nur auf diese Anzahl von DIG Ausgängen gemacht. Dadurch sind die einzelnen Segmente heller.

Grüße Uwe

Hallo Uwefed,
in LedControl - Library kann man eine Funktion finden

void LedControl::setScanLimit(int addr, int limit) {
if(addr<0 || addr>=maxDevices)
return;
if(limit>=0 || limit<8)
spiTransfer(addr, OP_SCANLIMIT,limit);
}

Diese sollte man für jeden MAX7219 verwenden
setScanLimit(I, 4) // wir haben 5 Spalten von 0 ... 4
um die unbenutzten Spalten zu deaktivieren.

Und was sollten wir mit einer unbenutzten Zeile machen? Kann man sie auch deaktivieren?
Afriend2you

P.S. Der Code ist falsch angezeigt und ich kann es nicht ändern, sollte an der Stelle vom Kopf (Emoji) "kleiner 8 Klammer zu"
kommen.

Mit einer unbenutzten Zeile kannst Du nichts machen; unbeschaltet lassen.
Da immer 8 Spalten für jede Reihe gleichzeitig ausgegeben werden gibt es keine Ersparnis.

Grüße Uwe

Hallo,

möchte Vollzug melden. Heute kam meine Platine die umgehend bestückt wurde. Erster Funktionstest mit der LedControl Lib ist erfolgreich. Unbenutzte Ausgänge sind offen. Mein Schaltplan beruht auf dem Datenblatt.

Hallo Doc_arduino,
danke sehr.

Hast Du in setup
setScanLimit(I, 4) // wir haben 5 Spalten von 0 ... 4
benutzt, um die unbenutzten Spalten zu deaktivieren.?

Die Standard-Version von LedControl-Lib macht
bei der Initialisierung setScanLimit(I, 7)

void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
/
lc.shutdown(0,false);
/
Set the brightness to a medium values /
lc.setIntensity(0,8);
/
and clear the display */
lc.clearDisplay(0);

setScanLimit(I, 4) // wir haben 5 Spalten von 0 ... 4

}

Hallo,

ich hatte nur die Pins angepasst, mehr nicht. Es scheint wir verwenden verschiedene Libs? Meine war von wayoda. GitHub - wayoda/LedControl: An Arduino library for MAX7219 and MAX7221 Led display drivers

Wie gesagt, es spielt für die reine Funktion keine Rolle ob alle Digits (Spalten) angesteuert werden oder nur die vorhandenen, muss dennoch funktionieren. Der Unterschied ist nur das die Zeit der restlichen nicht vorhandenen Digits ungenutzt bleibt für das Multiplexing. Deswegen kann man ungenutzte Digits abschalten. Rein praktisch wird auch das keine große Rolle spielen, weil die Mindestfrequenz 800Hz ist.

Probiere mal folgendes, falls in deiner Lib nicht vorhanden. Das ist der im MAX eingebaute LED Test. Damit müssen alle LEDs mit voller Helligkeit leuchten. Die Helligkeit bei dem Test ist unabhängig von einer ggf. vorher eingestellen Intensität. Sie ist nur noch von Rset abhängig. Deine Massebrücken solltest du entfernen. Auch ein vorher eingestelltes Scanlimit ist bei dem Test egal.

Wenn dabei nicht alle Leds leuchten, liegt entweder eine Hardwarefehler oder ein Defekt vor.
Beschaltung des MAX laut Datenblatt ist okay? Kondensatoren?
Wenn das funktioniert können wir weitere Tests machen.

Pins anpassen! CS ist LOAD und MOSI ist DIN. Habe nur die SPI üblichen Namen verwendet.
Und lasse dich nicht am "7221" stören. Die Funktionen sind gleich.

/*
  Doc_Arduino - german Arduino Forum
  IDE 1.8.7
  Arduino Mega2560
  07.11.2018

  MAX7221
  DATA: MSB first
        D15 ...D12  bleibt unbenutzt
        D11 ... D8  Registeradresse
        D7  ... D0  Daten

*/

struct t_setup
{
  const byte CLK  = 24;
  const byte CS   = 25;
  const byte MOSI = 26;
  const byte SEGDP = 128;     // Bit.7 - Datenblatt Tabelle 6
  const byte SEGA  = 64;
  const byte SEGB  = 32;
  const byte SEGC  = 16;
  const byte SEGD  =  8;
  const byte SEGE  =  4;
  const byte SEGF  =  2;
  const byte SEGG  =  1;      // Bit.0
  const byte DIGIT0 = 0x01;   // Datenblatt kompatible Schreibweise
  const byte DIGIT1 = 0x02;
  const byte DIGIT2 = 0x03;
  const byte DIGIT3 = 0x04;
  const byte DIGIT4 = 0x05;

  void shift_out( byte adresse, byte daten )
  { // Bits rausschieben, MSB first
    unsigned int data = 0;                  // Datenpaket zusammenbauen
    data = (data | adresse) << 8;
    data = data | daten;

    digitalWrite(CS, LOW);

    for (byte i = 0; i < 16; i++) {
      if (data & 0x8000) {              // nur oberstes Bit betrachten
        digitalWrite(MOSI, HIGH);       // und Datenleitung entsprechend setzen
      }
      else {
        digitalWrite(MOSI, LOW);
      }
      digitalWrite(CLK, HIGH);          // Takt erzeugen
      data = data << 1;                 // nächstes Bit links schieben
      digitalWrite(CLK, LOW);
    }
    digitalWrite(CS, HIGH);
  }

  void wake_up () { 
    shift_out(0x0C, 1);  
  }
  
  void clear_all () { 
    shift_out(DIGIT0, 0);   
    shift_out(DIGIT1, 0);   
    shift_out(DIGIT2, 0);   
    shift_out(DIGIT3, 0);  
    shift_out(DIGIT4, 0);  
  }
  
  void all_ON_Test () { 
    shift_out(0x0F, 1);     // interne IC Funktion
  }

  void all_OFF_Test () { 
    shift_out(0x0F, 0);     // interne IC Funktion
  }
  
} MAX7221;


void setup() {
  
  digitalWrite(MAX7221.CS, HIGH);
  pinMode(MAX7221.CS, OUTPUT);
  pinMode(MAX7221.CLK, OUTPUT);
  pinMode(MAX7221.MOSI, OUTPUT);

  MAX7221.wake_up();  
  MAX7221.clear_all();          
  
}


void loop() {

  MAX7221.all_ON_Test();  
  delay(1000);
  MAX7221.all_OFF_Test();  
  delay(1000);
 
}