Hallo Community,
ich habe gerade eine 4 x (8x8) Anzeige vor mir auf Basis vom MAX7219.
Sprich für jede 8x8 Anzeige einen MAX7219, das was man halt so aus China
bekommen kann.
Das sind die Daten die, die 4 x MAX7219 (kaskadiert) bekommen (laut
Code..)
Auf dem Foto "snip_1" ist ein Datenpaket mitgeschnitten.
Auf dem anderen Foto sieht man die Anzeige was sie mit dem Code anzeigt.
Anzeige_1: buff[0]
Anzeige_2: buff[1]
Anzeige_3: buff[2]
Anzeige_4: buff[3]
Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was
eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?
Jan H. schrieb:> Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was> eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?
Du solltest Dich erstmal mit einem MAX7219 beschäftigen und den voll
beherrschen, erst danach kann man zu einem zweiten greifen und sich
überlegen, wie die Datenpakete dann verschickt werden müssen.
Darüberhinaus muss jeder MAX vor dem Gebrauch entsprechend initialisiert
bzw. auf den entsprechenden Betriebsmodus eingestellt werden – den
Scanlimit, die Helligkeit und vor allem den Dekodiermodus sollte man
schon vorher einstellen. Das richtige Latchen der Daten ist sehr wichtig
– wenn man von einem MAX auf zwei wechselt, wird man den Denkfehler in
der Regel selbst erkennen, aber – wie ich bereits sagte – erstmal nur
einen MAX gut in den Griff bekommen.
Gregor J. schrieb:> Jan H. schrieb:>> Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was>> eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?>> Du solltest Dich erstmal mit einem MAX7219 beschäftigen und den voll> beherrschen, erst danach kann man zu einem zweiten greifen und sich> überlegen, wie die Datenpakete dann verschickt werden müssen.> Darüberhinaus muss jeder MAX vor dem Gebrauch entsprechend initialisiert> bzw. auf den entsprechenden Betriebsmodus eingestellt werden – den> Scanlimit, die Helligkeit und vor allem den Dekodiermodus sollte man> schon vorher einstellen. Das richtige Latchen der Daten ist sehr wichtig> – wenn man von einem MAX auf zwei wechselt, wird man den Denkfehler in> der Regel selbst erkennen, aber – wie ich bereits sagte – erstmal nur> einen MAX gut in den Griff bekommen.
Mehr als Geschwafel lese ich jetzt hier nicht.
Initialisiert sind sie, Testmodus kann ich auch für alle aktivierten
bzw. deaktivieren.
Nur gezielt einzeln halt nicht.
Schicke ich zwei Byte raus (Adresse und Kommando) fühlen sich trotzdem
alle angesprochen obwohl es nur 16 Takte gibt..
Jan H. schrieb:> Initialisiert sind sie, Testmodus kann ich auch für alle aktivierten> bzw. deaktivieren.> Nur gezielt einzeln halt nicht.> Schicke ich zwei Byte raus (Adresse und Kommando) fühlen sich trotzdem> alle angesprochen obwohl es nur 16 Takte gibt..
Ein Schaltplan wäre jetzt gut.
Normalerweise sind die MAX7219 so verdrahtet, dass CS und SCK parallel
zu allen vieren geht. MOSI vom uC geht zum DIN vom ersten, DOUT vom
ersten zum DIN vom zweiten etc, und DOUT vom letzten geht zum MISO vom
uC.
Schreiben:
CS=0
spi_write(address); spi_write(data_4);
spi_write(address); spi_write(data_3);
spi_write(address); spi_write(data_2);
spi_write(address); spi_write(data_1);
CS=1
Also: CS=0 startet den Zyklus. Die Daten (Adresse und Daten) vom letzten
Display müssen zuerst gesendet werden, und dann reihum die anderen. Mit
einem abschließenden CS=1 werden alle Daten übernommen.
So. Das war der erste große Fehler. Der zweite war, dass ich in Deinem
Code keine Zugriffe auf Register 9 bis 12 gesehen habe. Die müssen
beschrieben werden, bevor Du daran denken kannst, überhaupt etwas
anderes zu machen.
fchk
Schaltplan habe ich leider nicht. Ist auch nicht so einfach zu bekommen
von den China Männern. Die sind wie Du schon beschrieben hast verdrahtet
und kaskadiert.
Um es zu verstehen >
Das erste Byte was gesendet wird ist die Register Adresse, das zweite
sind die eigentlichen Daten.
Das ganze ist für das letzte Display bzw. MAX7219. Nach den zwei Bytes
muss ein Latch erfolgen.
Möchte ich jetzt die erste Anzeige und die letzte mit Pixel Daten
versorgen, sollte das ganze so aussehen
1
2
D_1.D_2.D_3.D_4
3
0x01FF,0x0000,0x0000,0x01FF;//0x0000 = Chip soll nichts machen
4
0x08FF,0x0000,0x0000,0x08FF;// letzte Reihe (0x08FF) einschalten
Frank K. schrieb:> So. Das war der erste große Fehler. Der zweite war, dass ich in Deinem> Code keine Zugriffe auf Register 9 bis 12 gesehen habe. Die müssen> beschrieben werden, bevor Du daran denken kannst, überhaupt etwas> anderes zu machen.
In dem zweiten Bild kann man die Funktionen sehen die, die 4 x IC´s
initialisieren, ob sie richtig init. werden habe ich mit der "Display
Test" Funktion gegen geprüft.
Jan H. schrieb:> Habe ich das richtig verstanden?
Nein. Deine Betrachtung gilt nur für einen Chip.
Bei kaskadierten Chips musst Du immer alle auf einmal mit Daten
versorgen und dann latchen, dh 4*16 bit=64 bit senden. SPI ist quasi ein
Schieberegister. Wenn Du mehr als 16 bit sendest, kommen die zuerst
gesendeten Bit bei DOUT vom ersten Chip wieder raus und in den zweiten.
Nach 64 Bits sind alle Schieberegister mit frischen Daten versorgt. Erst
jetzt darfst Du CS wieder hochnehmen.
fchk
Frank K. schrieb:> Jan H. schrieb:>>> Habe ich das richtig verstanden?>> Nein. Deine Betrachtung gilt nur für einen Chip.>> Bei kaskadierten Chips musst Du immer alle auf einmal mit Daten> versorgen und dann latchen, dh 4*16 bit=64 bit senden. SPI ist quasi ein> Schieberegister. Wenn Du mehr als 16 bit sendest, kommen die zuerst> gesendeten Bit bei DOUT vom ersten Chip wieder raus und in den zweiten.> Nach 64 Bits sind alle Schieberegister mit frischen Daten versorgt. Erst> jetzt darfst Du CS wieder hochnehmen.>> fchk
Super, jetzt scheint es zu funktionieren. Das latchen war ein Problem.
Vielen Dank!
Jan H. schrieb:> Super, jetzt scheint es zu funktionieren. Das latchen war ein Problem.
Soviel zum "überheblichen Geschwafel" das hier von den Leuten kommt.
Jan H. schrieb:> Mehr als Geschwafel lese ich jetzt hier nicht.