Forum: Mikrocontroller und Digitale Elektronik MAX7219 > Bytes und Timing


von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

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..)
1
uint8_t buff[][16] = 
2
{
3
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
4
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
5
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
6
  {0x01, 0x81, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, 0x05, 0x81, 0x06, 0x81, 0x07, 0x81, 0x08, 0x81},
7
};
8
9
for (size_t i = 0; i < 4; i++)
10
{
11
  for (size_t x = 0; x < 16; x = x+2 )
12
  {
13
    spi_write_word( buff[i][x] << 8 | buff[i][x+1] );
14
  }
15
}

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?

: Bearbeitet durch User
von Gregor J. (Firma: Jasinski) (gregor_jasinski)


Lesenswert?

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.

von Jan H. (janiiix3)


Lesenswert?

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

von Wastl (hartundweichware)


Lesenswert?

Jan H. schrieb:
> Mehr als Geschwafel lese ich jetzt hier nicht.

Mehr als keinen Schaltplan sehe ich jetzt hier nicht.

von Frank K. (fchk)


Lesenswert?

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

: Bearbeitet durch User
von Jan H. (janiiix3)


Lesenswert?

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

Habe ich das richtig verstanden?

von Jan H. (janiiix3)


Lesenswert?

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.

von Frank K. (fchk)


Lesenswert?

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

von Gerald B. (gerald_b)


Lesenswert?

Guck dir an, wie es in der Arduino Lib gemacht wird, da funktioniert es.

von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

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!

von Wastl (hartundweichware)


Lesenswert?

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.

: Bearbeitet durch User
von Crazy Harry (crazy_h)


Angehängte Dateien:

Lesenswert?

Funktioniert auch mit mehreren der 4er-Module

von Jan H. (janiiix3)


Lesenswert?

Crazy Harry schrieb:
> Funktioniert auch mit mehreren der 4er-Module

Sieht echt cool aus !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.