Forum: Mikrocontroller und Digitale Elektronik Probleme bei der Ansteuerung MAX7219 mit 8x8 Dot Matrix


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jürgen S. (jrgen_s633)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für ein aktuelles Projekt habe ich mir bei ebay ein Punkt Matrix Display 
8x8 mit MAX7219 zugelegt
Ebay-Artikel Nr. 322337412484

Und Irgendwie verhalten sich die Module sehr komisch.

Selbst beim Display Test leuchtet nur die 1ste und 4te Zeile.
Bei inaktivem Display Test, zeigen die Displays ein statisches Muster, 
siehe Bild anbei "dotmatrix.jpg".

Auf dem Bild sieht man die 4 Displays, jeweils Display Test An, Aus, An, 
Aus.
Gut erkennt man auch, das bei aktivem Display Test die "Statischen 
Muster" immer noch leicht glimmen.
Ich habe 2 Displays die sich identisch verhalten.

Als erst hatte ich die ganze Ansteuerung "von Hand" programmiert und nun 
auf SPI umgestellt. Timing "so langsam" wie möglich.
Mit dem Oszi alle Pegel und Signale geprüft.
CS/LOAD als erstes low, dann Daten rausschieben und CS wieder high.

Sogar die Übertragenen Daten, Flanken usw habe ich geprüft am Oszi und 
"Nachgerechnet" passt alles.
Siehe Bild anbei "oszi.jpg"

Nachdem ich den Display Test ja auch an und aus bekomme, glaube ich 
nicht mehr an einen Ansteuerungs Fehler.

Jemand eine Idee was hier schief gehen könnte ?
Zur Sicherheit mal den codeteil zur Ansteuerung ebenfalls anbei, der wie 
unten zu sehen alle 3 Sekunden aufgerufen wird.
1
       static uint8_t displayData = 0;
2
      static uint8_t displayRow = 0;
3
      
4
      displayData++;
5
      if (displayData>1)
6
        displayData = 0;
7
      
8
      display.startTransfer();
9
      display.sendCmdData(cmdDisplayTest, displayData);
10
      display.stopTransfer();
11
      
12
      
13
      sendMessage_p ( ADDR_BROADCAST, rx.myAddress, PSTR ( "led" ) );
14
      uartPuts ( uint8ToAh ( ( char* ) buffer, displayData ) );
15
      uartPuts_p ( PSTR ( "\r" ) );
16
      uartWaitTXEmpty();

Besten Dank shcon mal für die Bemühungen.

von Robin S. (der_r)


Bewertung
0 lesenswert
nicht lesenswert
Du hast Pins vertauscht, schau mal ins Datenblatt...

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
Robin S. schrieb:
> Du hast Pins vertauscht, schau mal ins Datenblatt...

Welche sollen das sein ?
Ich habe alle doppelt geprüft und sowohl VCC, GND, DIN, CLK und CS mit 
dem Oszi geprüft.
Da kommt das an was ich erwarte.
Mehr gibt es ja nicht, oder meinst Du am Prozessor?
Dann wären obige Messergebnisse ja auch falsch.

Zum Prüfen habe ich z.B.
Oszi Kanal 1 an CS
Oszi Kanal 2 an SCK
und ich sehe den start des Chip Select und die Takte.
oder
Oszi Kanal 1 an SCK
Oszi Kanal 2 an DIN
und ich kann die übertragenen Daten mitlesen und verifizieren.

Gemessen hab ich jeweils auf dem CPU Board und direkt hinten an den 
Platinen der Displays.

Wenn Pins vertauscht wären, könnte ich doch den Display Test nicht 
aktivieren?!

Gruss
Juergen

von guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> CS/LOAD als erstes low, dann Daten rausschieben und CS wieder high.

Wenn ich Deinen Code richtig lese, ist es da genau verkehrt rum:
1
void max7219::startTransfer ( void )
2
{
3
  CS_HIGH;
4
}
5
6
void max7219::stopTransfer ( void )
7
{
8
  //_delay_ms(1);
9
  CS_LOW;
10
  //_delay_ms(1);
11
}

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
guest schrieb:
> Jürgen S. schrieb:
>> CS/LOAD als erstes low, dann Daten rausschieben und CS wieder high.
>
> Wenn ich Deinen Code richtig lese, ist es da genau verkehrt rum:
>
1
> void max7219::startTransfer ( void )
2
> {
3
>   CS_HIGH;
4
> }
5
> 
6
> void max7219::stopTransfer ( void )
7
> {
8
>   //_delay_ms(1);
9
>   CS_LOW;
10
>   //_delay_ms(1);
11
> }
12
>
Danke, das ist aber an der Stelle Absicht.
Da das Display mit 5V läuft, mein ATmega328p aber mit 3,3V habe ich 
einen Pegel Wandler dazwischen, der Dummerweise Invertiert.
Hatte das aber auch ohne den Pegel Wandler versucht, mit dem gleichen 
Ergebnis. Dann natürlich ohne Invertierung.

Gruss
Juergen

von guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> Da das Display mit 5V läuft, mein ATmega328p aber mit 3,3V habe ich
> einen Pegel Wandler dazwischen, der Dummerweise Invertiert.

Hast Du auf der Clock- und Datenleitung auch invertierende Pegelwandler?

von void (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

display.initPort() möchtest du aber schon auch noch aufrufen, oder?
Das setzt mehr als nur die Ports, wie man vermuten würde...

Und anstatt  display.sendCmdData() + start/stopTransfer
zu benutzten ist einfach nur display.sendAllCmdData() gleich einfacher. 
Dann spielst du auch gleich mit allen vier LED modulen.

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
guest schrieb:
> Jürgen S. schrieb:
>> Da das Display mit 5V läuft, mein ATmega328p aber mit 3,3V habe ich
>> einen Pegel Wandler dazwischen, der Dummerweise Invertiert.
>
> Hast Du auf der Clock- und Datenleitung auch invertierende Pegelwandler?

Nein, dort sind nicht Invertierende Pegelwandler.
Zum Hintergrund, ich benutze den BCA8-BTM222 von BLuecontroller.
Der hat für die ISP Schnittstelle Pegelwandler 5V auf 3,3V.

Bei meinem ersten Versuch den SPI Manuell zu programmieren, hatte ich
MISO für CS am Display
MOSI für DIN am Display
SCK für CLK am Display
verwendet. Nachdem ich immer zum gleichen Ergebnis kam wie jetzt, dachte 
ich, jetzt mach es mal mit Hardware SPI.
Da kann ich aber den MISO Pin für "CS" nicht mehr nutzen, da der im 
Master Mode bei SPI ja fest ein Eingang ist.
Daher bin ich auf den SS Pin am Prozessor ausgewichen, ist ja durch den 
Hardware SPI ja eh Blockiert.
Der geht über einen 2803 mit Pullup auf 5V. Hierdurch kommt auch die 
Invertierung nur bei CS zu Stande.
Hat sich so aber durch die Existierende Schaltung ergeben.

Das Ergebnis ist aber immer das gleiche.

Was mich irritiert ist das der Display Test schon so komische Ergebnisse 
liefert und Manche LEDs leicht glimmen.

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
void schrieb:
> Hallo Jürgen,
>
> display.initPort() möchtest du aber schon auch noch aufrufen, oder?
> Das setzt mehr als nur die Ports, wie man vermuten würde...
>
> Und anstatt  display.sendCmdData() + start/stopTransfer
> zu benutzten ist einfach nur display.sendAllCmdData() gleich einfacher.
> Dann spielst du auch gleich mit allen vier LED modulen.

display.initPort() wird weiter oben aufgerufen.
Sorry vergessen in den Code Schnipsel zu kopieren.

Das mit dem display.sendAllCmdData() ist richtig, das war auch der 
Hintergrund für die Funktion.

Nur zum Testen bin ich dann umgestiegen auf
> display.sendCmdData() + start/stopTransfer
Da so weniger Daten übertragen werden und es sich leichter nachprüfen 
lässt am Oszi.

Macht Funktionell beim Ergebnis keinen Unterschied (getestet)

: Bearbeitet durch User
von Jürgen S. (jrgen_s633)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Noch so als Hinweis, was mich auch Stutzig macht.

Lege ich nur +5V und GND an das Display, kommt es schon nach dem Powerup 
mit einem Konstanten LED Muster. Siehe Bild anbei.

Laut Datenblatt sollte der Chip ja im Sleep Mode sein und das Display 
aus.

Ich werde den Verdacht nicht los, dass das LED Modul nicht zur 
Leiterplatte und deren Belegung passt...

von void (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> Sorry vergessen in den Code Schnipsel zu kopieren.

Gut. Denn das Init ist wichtig.

Jürgen S. schrieb:
> Da so weniger Daten übertragen werden und es sich leichter nachprüfen
> lässt am Oszi.

Deine Übertragung sieht schon gut aus. Nach deinem Oszi-Bild übernimmst 
du die Daten mit der positive Clock-Flanke, was korrekt ist. Die 
gesendeten Daten sind 0x0F 0x01 -> CMD: cmdDisplayTest DATA: "AN"
(CS ist leider nicht gezeigt.)

Jürgen S. schrieb:
> Was mich irritiert ist das der Display Test schon so komische Ergebnisse
> liefert und Manche LEDs leicht glimmen.

Komplett ohne init zeigt die 8x8 LED Matrix auch unmotiviert glimmende 
LEDs. Das scheint ein power-up Feature des max7219 zu sein. - Keine 
definierten reset Werte.


Würde dir ein laufendes Minimal-Beispiel auf einem ähnlichen Controller 
helfen?

P.S.: Und damit du es gleich weißt, die Anordnung der einzelnen 8x8 
Matrix-Module ist ungünstig zueinander. Die Zeile eines Einzel-Moduls 
ist bezogen auf das Gesamtkonstrukt eine Spalte...

von Jürgen S. (jrgen_s633)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Fehler gefunden...

Ich habe die LED Matrix mit dem Plan von hier geprüft :
http://megtestesules.info/hobbielektronika/adatlapok/LED8x8_1088AS.pdf

Und ebenso den Schaltplan von hier mit der Leiterplatte durchgemessen:
https://cdn.instructables.com/ORIG/FVW/W6ZL/HJ1XP591/FVWW6ZLHJ1XP591.jpg

Fazit:
- Die Belegung passt, aber die LED Matrix sitzt um 180° gedreht im 
Sockel
- Auf der Leiterplatte ist auch eine Pin 1 Markierung unter der 
Stiftleiste zu sehen. Das Modul ist demnach auch Verkehrt aufgesetzt.
Siehe im Beigefügten Bild. Hier habe ich die LED Matrix daneben schon 
gedreht. Der kleine Zipfel am Modul in der Mitte ist die Markierung für 
Pin 1, Links unter der Stiftleiste Sieht man die Markierung für Pin 1.

Kurze Prüfung ein Modul gedreht und es tut wie es soll.
Dann alle Matrix Module gedreht und Jubel...

Nur so ca 8-10 Stunden vergraben an einer fehlerhaften Bestückung.

Mal sehen was der Lieferant dazu sagt...

Gruss
Juergen

von void (Gast)


Bewertung
0 lesenswert
nicht lesenswert
void schrieb:
> keine definierten reset Werte.
Jürgen S. schrieb:
> Lege ich nur +5V und GND an das Display, kommt es schon nach dem Powerup
> mit einem Konstanten LED Muster. Siehe Bild anbei.

Da muss ich mich korrigieren. Korrekt ist nach power-up ist das Ding 
aus. Aber 1) nach disablen des shutdown mode, welcher nach power-up an 
ist, könnte es undefinierte LEDs geben. Also schön alle LEDs ausschalten 
am Anfang. Wird auch in der oben verlinkten max7219.cpp gemacht.
Und 2) scheint der Max7219 auf meinem Schreibtisch super mit offenen 
Eingängen (CLK, Data, CS) auf meine Hand zu reagieren. -> Nur 5V+GND 
anlegen + Meine Hand gibt tolle Effekte. ;-)


Jürgen S. schrieb:
> Fazit:
> - Die Belegung passt, aber die LED Matrix sitzt um 180°
> gedreht im Sockel

Glückwunsch! Schön, dass du das gefunden hast.
Jetzt sind die Module eben nur noch um 90° verdreht. Aber das ist ja per 
Design...

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bist du dir sicher mit dem um 90° gedreht ?
1
      display.sendAllCmdData(cmdDigit0, 0x80);
2
      display.sendAllCmdData(cmdDigit1, 0x40);
3
      display.sendAllCmdData(cmdDigit2, 0x20);
4
      display.sendAllCmdData(cmdDigit3, 0x10);
5
      display.sendAllCmdData(cmdDigit4, 0x08);
6
      display.sendAllCmdData(cmdDigit5, 0x04);
7
      display.sendAllCmdData(cmdDigit6, 0x02);
8
      display.sendAllCmdData(cmdDigit7, 0x01);
ergibt auf jedem Modul eine von links oben nach rechts unten laufende 
Linie.
So hätte ich das auch erwartet...

Gruss
Juergen

von void (Gast)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo Jürgen,

mit dem um 90° gedreht ist vielleicht eine Ansichtssache. Ich sehe 
gerade dein Code ist ja praktisch aus der Arduino "Lib" kopiert, aber 
nicht mit allen Funktionen. So hatte ich es auch gemacht, nur dann von 
C++ nach C refaktorisiert. Deshalb sind die Funktionsaufrufe in meinen 
Beispielen unten leicht anders.

Zurück zum Thema. Praktisch alle kopierten Arduino-Beispiele mit Text 
gehen halt immer davon aus, dass die Module von links nach rechts 
nebeneinander angeordnet sind. Beispielsweise hier:
https://oneguyoneblog.com/2016/10/20/max7219-arduino-ticker-8x8-led-modules/

Aber die vier Module wie du sie gekauft hast, sind immer von oben nach 
unten angeordnet. Deshalb scheint die oft gezeigte Lösung hier zu sein 
die Module auseinander zu sägen und dann wieder zusammen zu setzten. 
Drehen des Inhaltes um 90° würde zwar auch gehen, aber dann muss man 
programmieren können...

Hier dann drei Beispiele.
1
    // Beispiel 1:
2
    Max7219setColumnAll(0, 0xff);
3
    Max7219setColumn(   7, 0x10);
4
5
    // Beispiel 2:
6
    Matrix_printString("Void");
7
8
    // Beispiel 3:
9
    char bufferArrow[10] = {
10
         8, 8,
11
         0B00010000, 
12
         0B00111000, 
13
         0B01111100,
14
         0B11111110, // arrow up 8x8
15
         0B00111000, 
16
         0B00111000, 
17
         0B00111000, 
18
         0B00111000};
19
    Max7219writeSprite(0,  0, bufferArrow);
20
    Max7219writeSprite(8,  0, bufferArrow);
21
    Max7219writeSprite(16, 0, bufferArrow);
22
    Max7219writeSprite(24, 0, bufferArrow);

Ergebnis ist im angehängten Bild "Beispiel_123.jpg".
Beispiel 1: Spalte 0 ist demnach bei allen vier Modulen ganz links und 
die Module übereinander gestapelt. Modul 0 ist unten.
Beispiel 2: Text "Void", wird nativ so ausgegeben, dass rechter Rand von 
Modul 0 in darüber liegendes Modul 1 vom linken Rand reinläuft.
Beispiel 3: Sprite "Pfeil nach oben" zeigt in die Richtung links.

Ich kann mit dieser Modul-Anordnung leben und verstehe vom 
Leiterplatten-Layout her auch warum das so gemacht wurde. Nur hatte ich 
die Anordnung eben anders erwartet.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> Der hat für die ISP Schnittstelle Pegelwandler 5V auf 3,3V.

Dann dürfte der Pegelwandler die falsche Richtung haben.
Für ISP gilt:
MISO:  Ausgang
MOSI:  Eingang
SCK:   Eingang
RESET: Eingang
Du brauchst aber 3 Ausgänge mit 5V.

Als Wandler 3,3V nach 5V eignen sich HCT-Gatter, z.B. 74HCT08, 74HCT32, 
74HCT125, 74HCT04.

von Jsachs (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

Der level shifter ist quasi bidirektional.
Siehe Plan unter https://rf-store.eu/bca8-btm_schem.pdf

Wie gesagt seit die LED Matrix richtig im Sockel sitzt geht alles...

Gruss
Jürgen

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
void schrieb:
> Hallo Jürgen,
>
> mit dem um 90° gedreht ist vielleicht eine Ansichtssache. Ich sehe
> gerade dein Code ist ja praktisch aus der Arduino "Lib" kopiert, aber
> nicht mit allen Funktionen. So hatte ich es auch gemacht, nur dann von
> C++ nach C refaktorisiert. Deshalb sind die Funktionsaufrufe in meinen
> Beispielen unten leicht anders.
Eigentlich dachte ich, ich habe die komplett neu geschrieben.
Aber es kommt ja immer auf eine Ähnliche Lösung raus.
Was ich jetzt kopiert habe, ist die Fontdatei von 
"https://github.com/ridercz/Altairis-ESP8266-FC16/blob/master/FC16_Font.h";

> Zurück zum Thema. Praktisch alle kopierten Arduino-Beispiele mit Text
> gehen halt immer davon aus, dass die Module von links nach *rechts*
> nebeneinander angeordnet sind. Beispielsweise hier:
> https://oneguyoneblog.com/2016/10/20/max7219-arduino-ticker-8x8-led-modules/
Aaah, ja so nutze ich die auch. Links nach rechts. Sehe auch, dass du 
die von oben nach unten nutzt, klar dann sind die gedreht.
Würde das aber auch einfach im Code drehen und nicht auseinander 
schneiden :-)

Wo ich eben etwas hänge, ist, dass ich Scrolltext mit Proportional Font 
machen möchte und scrollen Pixelweise....

Das ist aber Stufe 2 :-)

Erst mal scheint es so zu gehen.

Leider hat sich der Lieferant bisher nicht gemeldet.
5 Tage hat er Zeit, dann gibt es eine Negative Bewertung auf EBAY wegen 
liefern fehlerhafter Ware ohne Antwort.
Schade eigentlich.

Gruss
Juergen

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Jsachs schrieb:
> Wie gesagt seit die LED Matrix richtig im Sockel sitzt geht alles...

Jürgen S. schrieb:
> Leider hat sich der Lieferant bisher nicht gemeldet.
> 5 Tage hat er Zeit, dann gibt es eine Negative Bewertung

Warum, es geht doch.
Für Probleme in Deinem Programm kann er ja nichts.

von Jürgen S. (jrgen_s633)


Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Jsachs schrieb:
>> Wie gesagt seit die LED Matrix richtig im Sockel sitzt geht alles...
>
> Jürgen S. schrieb:
>> Leider hat sich der Lieferant bisher nicht gemeldet.
>> 5 Tage hat er Zeit, dann gibt es eine Negative Bewertung
>
> Warum, es geht doch.
> Für Probleme in Deinem Programm kann er ja nichts.
Es lag nicht an meinem Programm.
Die Module saßen um 180° verdreht im Sockel, quasi verpolt. Pin 1 vom 
Modul saß nicht auf Pin 1 vom Sockel.
Negative Bewertung für die nicht Reaktion, aber er hat ja noch Zeit :-)

Das darf nicht passieren, wenn es einen Endtest gab.

Er liefert fehlerhafte Ware aus... Nachdem alle meine bestellten 
Displays mit dem gleichen Fehler ausgeliefert wurden, sicherlich ein 
Serienfehler.

Kann er ja einfach beheben, muss man ja nur in die Artikel Beschreibung 
schreiben, vor dem Betrieb sind die Module aus dem Sockel zu nehmen und 
um 180° gedreht ein zu setzen :-)
Noch 1€ runter im Preis und Zack, Problem gelöst.

von Marcus Sonntag (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Deinen Beitrag:

ich habe auch ein 4fach 8x8 Modul gekauft und hatte genau wie Du 
"komische Effekte".

Durch Deinen Beitrag kam ich auf die Idee die LED-Module um 180° zu 
drehen und nun funktionieren sie korrekt.

von Jürgen S. (jsachs)


Bewertung
0 lesenswert
nicht lesenswert
Schön zu lesen, das es anderen geholfen hat.

Gruß
Jürgen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.