Hallo,
für ein aktuelles Projekt habe ich mir bei ebay ein Punkt Matrix Display
8x8 mit MAX7219 zugelegt
http://www.ebay.de/itm/322337412484?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
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.
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
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:
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
>voidmax7219::startTransfer(void)
2
>{
3
>CS_HIGH;
4
>}
5
>
6
>voidmax7219::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
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?
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.
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.
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)
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...
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...
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
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...
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
charbufferArrow[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.
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.
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
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
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.
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.
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.