Forum: Mikrocontroller und Digitale Elektronik MAX7219: einzelne LED ansteuern


von Marco G. (flaschenpost)


Lesenswert?

Hi,

ich scheitere an etwas, das zu einfach ist, um irgendwo genauer erklärt 
zu werden.

Gegeben: ein Arduino Microcontroller, ein MAX7219, 3 LED (sollen dann am 
Ende 14 werden).

Gesucht: Wie steure ich die LED einzeln an?

Wenn ich nicht alles komplett falsch verstanden habe, bedeutet "Common 
Cathode", dass Pin 2 ("DIG0") mit den Kathoden aller drei LED verbunden 
sein muss, und Pin 14 ("SEG A") mit der Anode der ersten, Pin 16 ("SEG 
B") mit der Anode der zweiten und Pin 20 ("SEG C") mit der Anode der 
dritten LED.

Die Kathode, also der "-" Pol, ist die kurze Seite. Der Code schaltet 
per
1
  lc.setLed(0,i,j,stat);

alle LED einzeln erst an, dann wieder aus.
1
  #include <LedControl.h> // Library for LED control with MAX72XX
2
  
3
  /*
4
  Pins of Arduino Nano for LedControl:
5
  Pin #7 is connected to DataIn (DIN)
6
  Pin #8 is connected to CLK (CLK)
7
  Pin #9 is connected to LOAD (CS)
8
  There is only one display with MAX72XX
9
  */
10
  
11
LedControl lc = LedControl(7, 8, 9, 1); // LedControl(dataPin, clkPin, csPin, numDevices)
12
  
13
void setup(){
14
    
15
  lc.shutdown(0, false); // The MAX72XX is in power-saving mode on startup, we have to do a wakeup call
16
  lc.setIntensity(0, 8); // Set the brightness of display between 0 and 15
17
  lc.clearDisplay(0); // Clear the display
18
  lc.setScanLimit(0,1);
19
}
20
21
  int i=0;
22
  int j=0;
23
  int stat=1;
24
  
25
void loop() {
26
  lc.setLed(0,i,j,stat);
27
  j++;
28
  if(j>7){
29
    j=0;
30
    i++;
31
    delay(100);
32
  }
33
  if(i>7){
34
    stat=1-stat;
35
    i=0;
36
    j=0;
37
  }
38
  delay(150);
39
   
40
}

Wenn ich die LED andersrum einstecke, leuchten sie, und ihre Helligkeit 
verändert sich auch. Wenn ich die LED richtigrum reinstecke, bleiben sie 
dunkel. Widerstand an ISET hab ich 10 kOhm eingestellt.

Umgekehrt eingesteckt leuchten die LED fleißig vor sich hin und ändern 
auch ihre Helligkeit schön. Vermutlich ist das die Sperrspannung, von 
der schon die Rede war?

Theoretisch müsste ich doch mit SPITransfer schauen können, ob der 
Arduino und der MAX sich verstehen. Hab ich aber noch nicht wirklich 
ausprobiert.

Hat irgendwer einen einfachen Tipp?

Danke!

: Verschoben durch Moderator
von Veit D. (devil-elec)


Lesenswert?

MAX Pins:
Segmente A...G, DP >> Anode
Digits 0...7 >> Kathode

Edit:
Wenn du die Bsp. der Lib nimmst muss irgendwas passieren. Haste dich 
damit schon näher befasst?

Übrigens gehört der Thread nach "µC & Elektronik", fällt mir gerade auf.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Ich denke es würde nicht schaden die Eigenschaften des MAX7219 nochmals 
zu Gesichte führen.

Der MAX7219 ist optimiert um 64 einzelne LEDS mit jeweils acht 
gemeinsamen Kathodenanschlüssen oder acht Common Anode 7-Segment 
Anzeigen und Dezimalpunkt anzusteuern. Im Falle von einzelnen LEDS 
müssen jeweils acht LEDS mit ihren Anoden zusammengeschaltet werden und 
einen der Digit Treiber Ausgänge angeschlossen werden. Die Anoden kommen 
in der Reihenfolge a-g und Dp dran. Da Acht Digittreiberausgänge 
vorhanden sind kann min bis zu 64 einzelne LEDs oder acht Sieben Segment 
Anzeigen mit gemeinsamer Anode ansteuern.

Intern unterscheidet der MAX7219 zwischen dekodiertem Modus und frei 
ansteuerbaren Matrix Modus. Im Falle von einzelnen LEDs muß auf frei 
ansteuerbarem Modus durch entsprechende Programmierung des Control 
Registers umgeschaltet werden. Programmiertechnisch muß man dann acht 
Bytes schreiben um alle LEDs mit ihrem Inhalt ansteuern zu können. Jedes 
der acht Datenregister ist einem Digittreiberausgang zugeordnet. Aber 
das steht ja alles im Datenblatt...

Es sind fünf Konfigurier Register vorhanden die anwendungsspezifisch 
eingestellt werden müssen. Da mußt Du nun das Datenblatt dazu genau 
studieren um alle Registereinstellungen richtig benützen zu können.

Shutdown register sollte bei Dir den Wert 0x01 haben
Decode Mode Register den Wert 0x00
Intensity register 0x0F
Scanlimit register den Wert 0x07
Displaymode Register sollte 0x00 sein
Schreib 0xFF in alle LED Register, dann sollten alle LEDs an sein. 
Umgekehrt, bei 0x00 sollte nichts an sein.

Vorausgesetzt, der MAX7219 wurde richtig konfiguriert, liest er nun den 
Inhalt der internen Datenregister in einer bestimmten Reihenfolge ab und 
steuert selbständig im Multiplexbetrieb nacheinander alle acht LED 
Gruppen nacheinander ab, begrenzt den individuellen LED Arbeitsstrom 
durch den festgelegten Wert des externen Widerstands und macht das bis 
neue Daten eingeschrieben werden. Nebenbei bemerkt ist es unbedingt 
notwendig so nahe wie möglich zum MAX7219 an den Vdd und Vss Anschlüssen 
einen Elko von 100-220uF zu legen um sicherzustellen, daß genügend 
Spitzenstrom zur Verfügung steht. Der Spitzen Stromverbrauch ist durch 
das Multiplexen viel höher als der Mittelwert. Ohne C verseucht das die 
5V Stromversorgung durch hohen Ripple.

Jedenfalls, vorausgesetzt, daß die Arduino Bibliothek funktioniert, der 
MAX7219 richtig angeschlossen ist, müßtest beim Schreiben von "Einsen" 
und korrektem Controlregister Inhalt alle angeschlossenen LEDs zum 
Leuchten bringen.

Bei den ControlRegistern muß man aufpassen, alle Bits richtig zu 
verstehen und zu setzen, sonst macht der MAX etwas anderes was Du 
willst.

Hoffe, es hilft Dir ein bischen.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

gar nicht so einfach mit einer fremdem Lib.
So gehts für den TO zum reinkommen, einfaches Bsp.
1
// Arduino Mega2560
2
3
#include <LedControl.h> // Library for LED control with MAX72XX
4
5
const byte pinMOSI = 51; // is connected to DataIn (DIN)
6
const byte pinCLK = 52;  // is connected to CLK (CLK)
7
const byte pinCS = 26;   // is connected to LOAD (CS)
8
9
10
LedControl lc = LedControl(pinMOSI, pinCLK, pinCS, 1); // MOSI, CLK, CS, number of device
11
12
bool state = true;
13
14
void setup()
15
{
16
  lc.shutdown(0, false);  // The MAX72XX is in power-saving mode on startup, we have to do a wakeup call
17
  lc.setIntensity(0, 8);  // Set the brightness of display between 0 and 15
18
  lc.clearDisplay(0);     // Clear the display
19
  lc.setScanLimit(0, 1);
20
}
21
22
23
void loop()
24
{
25
  lc.setLed(0, 0, 1, state);    // Digit.0 + Seg.A
26
  delay(500);
27
  lc.setLed(0, 0, 2, state);    // Digit.0 + Seg.B
28
  delay(500);
29
  lc.setLed(0, 0, 3, state);    // Digit.0 + Seg.C
30
  delay(500);
31
  lc.clearDisplay(0); 
32
  delay(500);
33
}

von Marco G. (flaschenpost)


Lesenswert?

Bei den Beispielen der Arduino- Lib tut sich leider nichts. :-(

Im Datenblatt steht "Common Cathode", nicht "Common Anode". Einen 
7-Segment Baustein hab ich, aber der ist Common Anode. Er ergibt eine 
Art inverses Verhalten. Vielleicht kann ich den aber trotzdem benutzen, 
indem ich SEG A als common nehme und dann die einzelnen Digits 
ansteuere.

Ich danke erst mal für die Hilfe und bastele weiter.

von Gerhard O. (gerhard_)


Lesenswert?

Marco G. schrieb:
> Bei den Beispielen der Arduino- Lib tut sich leider nichts. :-(
>
> Im Datenblatt steht "Common Cathode", nicht "Common Anode". Einen
> 7-Segment Baustein hab ich, aber der ist Common Anode. Er ergibt eine
> Art inverses Verhalten. Vielleicht kann ich den aber trotzdem benutzen,
> indem ich SEG A als common nehme und dann die einzelnen Digits
> ansteuere.
Oh jeh! Da hast Du recht. Tut mir leid Dir was Falsches gesagt zu haben. 
Das ändert nichts daran, als das die LEDs natürlich mit jeweils acht 
Cathoden zusammen auf einen Digit Treiber gehören. Auf keinen Fall 
umgekehrt. Der MAX steuert ja alle Common Cathode Gruppen sequenziell 
an.
>
> Ich danke erst mal für die Hilfe und bastele weiter.

Bezüglich der Library kann ich nichts sagen. Ich habe mir immer eigenen 
Code geschrieben. Für Arduino habe ich nichts Eigenes weil ich da früher 
nur mit PICs und 8051er gerarbeitet habe.

Generell funktionieren die publizierten Arduino Bibliotheken. Lies 
nochmals die Doku und Beispielcode für die MAX7219 Bib genau durch um 
etweige Abweichungen zu erkennen.

Wenn Du einen Oszi hast, lass Dein Programm wiederholt den MAX ansteuern 
und monitore alle SPI Leitungen für Aktivität. Am DO Pin solle das vom 
Arduino gesendete Datenpaket bei Anfang der nächsten Sendung von 16 
Taktimpulsen wieder bitweise herauskommen.

Wenn das nicht der Fall ist, mußt Du das zuerst beseitigen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

immer schön wichtige Informationen Häppchenweise verteilen, so macht das 
am meisten Spaß.   :-(

Wenn dein "Display" Common Anode hat, dann musste je ein Segement zu 
Common Anode machen und per Digits einzeln ansteuern. Sollte ja nun kein 
Problem sein. Du machst nur die Segmente zu Digits und die Digits zu 
Segmente - gedanklich.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> immer schön wichtige Informationen Häppchenweise verteilen, so macht das
> am meisten Spaß.   :-(
>
> Wenn dein "Display" Common Anode hat, dann musste ein je Segement zu
> Common Anode machen und per Digits einzeln ansteuern. Sollte ja nun kein
> Problem sein. Du machst nur die Segmente zu Digits und die Digits zu
> Segmente.

Das ist falsch weil ja die Digittreiberausgänge hart schalten und nur 
die Segmentausgänge für konstanten Strom sorgen. Umgekehrt kann das 
nicht richtig funktionieren.

CA LED Displays sind nicht machbar mit dem 7219.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Die Arduino publizierten Bibliotheken kann man als eine Art Referenz 
Design betrachten die als eine Art Beispielslösung für Arduino und 
spezifizierte externe HW dienen soll. Bei genauer Einhaltung der 
publizierten Rahmenbedingungen machen sie was der Designer vorhatte und 
verifizieren das Beispiel.

Erst wenn dieses Beispiel funktioniert sollte man eigene Änderungen wenn 
notwendig anbringen.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> immer schön wichtige Informationen Häppchenweise verteilen, so macht das
> am meisten Spaß.   :-(
>
> Wenn dein "Display" Common Anode hat, dann musste je ein Segement zu
> Common Anode machen und per Digits einzeln ansteuern. Sollte ja nun kein
> Problem sein. Du machst nur die Segmente zu Digits und die Digits zu
> Segmente - gedanklich.

Vergiß meinen ersten Beitrag. Ich habe es falsch verstanden.

: Bearbeitet durch User
von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

bist du dir da sicher das es nicht funktionieren soll?
Ich steuere mit einem MAX7221 31 einzelne LEDs an.
Dabei sind immer 4 Led Anoden an einem Segment verbunden.
Die Kathoden letztlich an den Digits.
Das heißt es gibt immer gemeinsame Anoden und gemeinsame Kathoden.
Man kann das so strickt nicht trennen. Die Leds müssen nur richtig herum 
angeklemmt sein. Welche Led am Ende leuchten soll bestimmt man mit dem 
Digit und Segment. Man hat keinerlei Einschränkung.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> bist du dir da sicher das es nicht funktionieren soll?
> Ich steuere mit einem MAX7221 31 einzelne LEDs an.
> Dabei sind immer 4 Led Anoden an einem Segment verbunden.
> Die Kathoden letztlich an den Digits.
> Das heißt es gibt immer gemeinsame Anoden und gemeinsame Kathoden.
> Man kann das so strickt nicht trennen. Die Leds müssen nur richtig herum
> angeklemmt sein. Welche Led am Ende leuchten soll bestimmt man mit dem
> Digit und Segment. Man hat keinerlei Einschränkung.

Das ist bei Dir schon in Ordnung. Es geht ja aber um die zeitliche 
Steuerung der CC Leitungen.

Allerdings hat man die von mir erwähnte Einschränkung nur bei Displays 
mit interner CC oder CA Verbindungen. Bei einzelnen LEDs spielt das ja 
keine Rolle.

So wie ich das sehe ist ja jeweils immer nur ein DigitTreiber Ausgang 
für eine bestimmte Zeitperiode aktiv. Das erlaubt jedem Segment den mit 
dem Rset Widerstand bestimmten Strom für gleichmäßige Helligkeit nach 
Masse hin über den O.D Treiber Ausgang zu sourcen. Die 
DigitTreiberAusgänge sind einfache Open Drain Ausgänge ohne irgendwelche 
LED spezifische Strombegrenzung für das einzelne gerade betriebene LED.

Siehst Du das nicht ähnlich?



P.S Jedenfalls sehe ich selber, daß ich mich da mit meinen Einwände in 
eine falsche Strasse verrannt hatte;-)

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

um die Sache rund zu machen soll Marco seine 3 Leds richtig anklemmen 
zwischen Segment A und Digits 0 bis 2 und folgende Code testen. 
Zubeachten ist das man das Scanlimit anpassen muss! Bezieht sich auf die 
Anzahl der benötigten Digits.
1
// Arduino Mega2560
2
3
#include <LedControl.h> // Library for LED control with MAX72XX
4
5
const byte pinMOSI = 51; // is connected to DataIn (DIN)
6
const byte pinCLK = 52;  // is connected to CLK (CLK)
7
const byte pinCS = 26;   // is connected to LOAD (CS)
8
9
10
LedControl lc = LedControl(pinMOSI, pinCLK, pinCS, 1); // MOSI, CLK, CS, number of device
11
12
bool state = true;
13
14
void setup()
15
{
16
  lc.shutdown(0, false);  // The MAX72XX is in power-saving mode on startup, we have to do a wakeup call
17
  lc.setIntensity(0, 8);  // Set the brightness of display between 0 and 15
18
  lc.clearDisplay(0);     // Clear the display
19
  lc.setScanLimit(0, 3);
20
}
21
22
23
void loop()
24
{
25
  lc.setLed(0, 0, 1, state);    // Digit.0 + Seg.A
26
  delay(500);
27
  lc.setLed(0, 1, 1, state);    // Digit.1 + Seg.A
28
  delay(500);
29
  lc.setLed(0, 2, 1, state);    // Digit.2 + Seg.A
30
  delay(500);
31
  lc.clearDisplay(0); 
32
  delay(500);
33
}

von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

es kann natürlich sein das ich auch etwas gedanklich verhaue.  :-)

Ich sehe es jedoch wie du das die Digit Leitungen vom Max gemultiplext 
werden. Ich sehe jedoch auch das mich das als Programmierer nur am Rande 
interessiert. Bei programmieren meiner Lib.  :-)

Bei Common Kathode Anzeigen werden alle Segmentleitungen zu allen 
Displaysegmenten durchgeschliffen und nur die Digits gehen zu den 
gemeinsamen Anzeige-Kathoden. Das wäre der Idealfall, wie im Datenblatt 
gezeigt.

Hat man eine Common Anode Anzeige, dann kann man die Digits nicht 
getrennt zuführen, man muss wie bei einzelnen Leds alles verbinden. Wie 
bei mir ein komplettes Leitungsgitter machen. Segmente und Digits müssen 
jeweils durchgeschliffen werden. Dann werden die Segmente gedanklich - 
im Programm - zu Digits umfunktioniert und umgekehrt. Man baut sich am 
Ende eine große Led Matrix. Nur eben mit fertigen CA Anzeigen. Wenn das 
nicht funktionieren würde, so denke ich, würden meine einzelnen Leds 
nicht funktionieren.

Soweit korrekt oder falsch verstanden?

von Veit D. (devil-elec)


Lesenswert?

@ Marco:
ich weiß nicht was du für Led Anzeigen hast, aber 10k für Rset sind 
schon sehr sportlich in meinen Augen. Rset sollte den maximalen Strom 
begrenzen bei maximaler Helligkeit in der Software. Ansonsten besteht 
die Gefahr das du per Software übers Led Limit schießt.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> es kann natürlich sein das ich auch etwas gedanklich verhaue.  :-)
>
> Ich sehe es jedoch wie du das die Digit Leitungen vom Max gemultiplext
> werden. Ich sehe jedoch auch das mich das als Programmierer nur am Rande
> interessiert. Bei programmieren meiner Lib.  :-)
>
> Bei Common Kathode Anzeigen werden alle Segmentleitungen zu allen
> Displaysegmenten durchgeschliffen und nur die Digits gehen zu den
> gemeinsamen Anzeige-Kathoden. Das wäre der Idealfall, wie im Datenblatt
> gezeigt.
>
> Hat man eine Common Anode Anzeige, dann kann man die Digits nicht
> getrennt zuführen, man muss wie bei einzelnen Leds alles verbinden. Wie
> bei mir ein komplettes Leitungsgitter machen. Segmente und Digits müssen
> jeweils durchgeschliffen werden. Dann werden die Segmente gedanklich -
> im Programm - zu Digits umfunktioniert und umgekehrt. Man baut sich am
> Ende eine große Led Matrix. Nur eben mit fertigen CA Anzeigen. Wenn das
> nicht funktionieren würde, so denke ich, würden meine einzelnen Leds
> nicht funktionieren.
>
> Soweit korrekt oder falsch verstanden?

Hmm...

Wenn ich Dich richtig verstehe könnte man CA Displays verwenden solange 
man die Zuordnung der Segmente der FW überläßt und im nicht dekodierten 
Modus operiert. D.h. Anstatt dass jedes Display einzeln aktiviert wird, 
sind dann die Digit Leitungen dann die "Segment Aktivierungs Busse". Das 
Display wird als von a-dp reihenweise gescannt anstatt als Digit 1-n. 
Wenn man das mit einer Zeitlupenkameta photographieren würde, könnte man 
sehen, daß alle Displays ihre Segmente gleichzeitig von abis dp 
sequenziell durchlaufen.

Das würde bedeuten, daß sich die Zuordnung der Datenregister um 90 Grad 
dreht. Also, daß das erste Datenregister für alle "a" Segmente
verantwortlich wäre. Das zweite dann "b" u.s.w.

Das hätte übrigens den Vorteil, daß man bei einer schnellen seitlichen 
Kopfbewegung keinen Stroboskop Effekt mehr sehen würde.

So gesehen verstehe ich Deinen Einwand. Sehe ich das richtig?

von Marco G. (flaschenpost)


Lesenswert?

Offenbar hatte ich beim Reset des Arduino nicht den MAX7219 nicht 
ordentlich resettet.

Jetzt läuft es jedenfalls, den ganzen Nachmittag ging nichts.


Die 6511BH (CA) hab ich testweise andersrum verwendet, "SEG A" bzw "SEG 
B" sind jetzt die Common Anode, evtl kann man das in irgendeine FAQ mal 
rein.

Natürlich kann man dann nicht die fertigen Buchstaben und Zahlen 
verwenden, aber das ist ja per Software leicht lösbar.

Da bei einem 8-digit ja ohnehin an SEG X 8 LED hängen und an DIG Y auch, 
kann ich mir beim besten Willen nicht vorstellen, dass es einen 
qualitativen Unterschied macht. Beide sind ja "common".

Danke für die Hilfe beim Denken und alle detaillierten Hinweise! 
Verschieben konnte ich den Thread nicht mehr, ich hatte aus der Suche 
nach MAX7219 heraus einen neuen Post gemacht und nicht auf den richtigen 
Bereich aufgepasst.

Ich vermute, ein Foto/Video vom entstandenen "Kabelsalat" ist eher nicht 
so spannend. Falls doch jemand will, hier das vorläufige Resultat 
(photos.app.goo . gl/892Thz1awFYSLpPTA). Die + und - Schiene am 
Breadboard sind die "common cathode". j und i jetzt vertauscht.

Code
1
  lc.setLed(0,j,i,stat);
2
  j++;
3
  if(j>7){
4
    j=0;
5
    i++;
6
    delay(100);
7
  }
8
  if(i>2){
9
    stat=1-stat;
10
    i=0;
11
    j=0;
12
  }
13
  delay(150);

von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

ich würde sagen das siehst du richtig. Also du verstehst mich.

Ich habe in meinen beiden Bsp. für Marco auch nur Segment mit Digit 
vertauscht. Einmal wurden 3 Leds senkrecht und das andere mal 3 Leds 
waagerecht angesteuert. Wie du sagst um 90° verdreht.

Wenn man zum Bsp. Buchstaben mit 7-Segment Anzeigen darstellen möchte 
muss man diese sowieso in seiner Software abbilden. Welche 
Anzeigensegment-Leds für welche Buchstabendarstellung angesteuert werden 
müssen. Diese Zuordnung kann man in Software machen wie man möchte. 
Dadurch spielt common Anode/Kathode in der Hinsicht keine Rolle mehr. 
Wenn man Common Kathode Anzeigen nimmt wirds vielleicht etwas leichter, 
mag sein.

Ich habs für meine einzelnen Leds gemacht, andere machen Laufschriften 
und bauen sich Buchstaben zusammen und rufen diese nur noch auf.

In der hier verwendeten LedControl Lib gibts zum Bsp. im Header ein 
binäres charTable Array. Das müßten vordefinierte Zahlen und Buchstaben 
sein. Was möglicherweise nur mit common Kathode funktioniert, falls die 
vorhandenen Funktionen nicht noch eine 90° Drehung/Umsortierung 
erlauben. So genau habe ich nun auch nicht reingeschaut. Ich hatte/habe 
mir auch eine eigene Lib geschrieben.



Hallo Marco,

schön das es nun klappt. Hardreset muss man eigentlich nicht machen. 
Richtig initialisieren reicht aus.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> ich würde sagen das siehst du richtig. Also du verstehst mich.
>
> Ich habe in meinen beiden Bsp. für Marco auch nur Segment mit Digit
> vertauscht. Einmal wurden 3 Leds senkrecht und das andere mal 3 Leds
> waagerecht angesteuert. Wie du sagst um 90° verdreht.
>
> Wenn man zum Bsp. Buchstaben mit 7-Segment Anzeigen darstellen möchte
> muss man diese sowieso in seiner Software abbilden. Welche
> Anzeigensegment-Leds für welche Buchstabendarstellung angesteuert werden
> müssen. Diese Zuordnung kann man in Software machen wie man möchte.
> Dadurch spielt common Anode/Kathode in der Hinsicht keine Rolle mehr.
> Wenn man Common Kathode Anzeigen nimmt wirds vielleicht etwas leichter,
> mag sein.
>
> Ich habs für meine einzelnen Leds gemacht, andere machen Laufschriften
> und bauen sich Buchstaben zusammen und rufen diese nur noch auf.
Das hört sich interessant an. Mit Laufschrift Design habe ich noch keine 
Erfahrungen.
>
> In der hier verwendeten LedControl Lib gibts zum Bsp. im Header ein
> binäres charTable Array. Das müßten vordefinierte Zahlen und Buchstaben
> sein. Was möglicherweise nur mit common Kathode funktioniert, falls die
> vorhandenen Funktionen nicht noch eine 90° Drehung/Umsortierung
> erlauben. So genau habe ich nun auch nicht reingeschaut. Ich hatte/habe
> mir auch eine eigene Lib geschrieben.
>
> Hallo Marco,
>
> schön das es nun klappt. Hardreset muss man eigentlich nicht machen.
> Richtig initialisieren reicht aus.

Hallo Veit,

Vielen Dank für Deine zusätzlichen Ausführungen. Bischen komplizierter 
wird die Ansteuerung natürlich schon weil nun jedes bit in den Digit 
Registern nun ein Segment der vorhandenen Anzeigen representiert. Das 
dürfte ein Bitgeschupse werden. Auch muß man dann notgedrungen den 
8-Digit Modus wählen. Andrerseits, der uC ist schnell...

Ich werde es irgendwann ausprobieren weil ich einige sehr schöne 
vierstelligen CA Anzeigen habe und ich den MAX7219 gern habe. An die 
besprochenen Möglichkeiten dachte ich eigentlich nicht. Da sieht man 
wieder, man darf NEIN nicht immer für die bare Münze nehmen.

wenn man keinen 7219 verwenden möchte funktionieren übrigens auch zwei 
164er SR als LED Ansteuerung ganz gut. Ich machte das mal um 56 LEDs 
(4-Dig Anzeige, Bargraph und 6 LEDs) mit einem Arduino anzusteuern. Im 
T2 ISR CTC Betrieb mit 8Mb lief das ganze autonom und robust im 
Hintergrund. Allerdings war eine Zeichentabelle notwendig. Eine Tastatur 
mit 8 Tasten konnte übrigens transparent noch mitbetrieben werden.

Auch die alten MC14589B 5-stelligen SPI Treiber sind noch nützlich.

Ich finde LEDs in manchen Anwendungen visuell immer noch optimal wenn es 
auf gute Sichtbarkeit mit weiten Ablesewinkel ankommt.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

komplizierter wird es, ja, muss ja eine Herausforderung sein.  :-)

Für meine Led Animation merke ich mir für jedes Digit den alten 
Segmentwert.
Zu diesem addiere oder subtrahiere ich den neuen Segmentwert der 
gewünschten Led.
Danach schicke ich Digit- und Segmentwert zum IC.

Mein Grundaufbau sieht wie folgt aus - laut meinem Schaltplan.
1
struct Matrix
2
{
3
  enum seg {
4
    DP = 128,     // Bit.7 - Datenblatt Tabelle 6
5
    A  = 64,
6
    B  = 32,
7
    C  = 16,
8
    D  =  8,
9
    E  =  4,
10
    F  =  2,
11
    G  =  1       // Bit.0
12
  };
13
14
  enum digit {
15
    D0 = 0x01,
16
    D1 = 0x02,
17
    D2 = 0x03,
18
    D3 = 0x04
19
  };
20
};
21
constexpr Matrix MATRIX;
22
23
// ----------------------------------------------------
24
25
struct Led
26
{
27
  const byte digit;
28
  const byte segment;
29
};
30
31
const Led LED[] PROGMEM = {
32
  {MATRIX.D0, MATRIX.A},  // LED  1
33
  {MATRIX.D1, MATRIX.A},
34
  {MATRIX.D2, MATRIX.A},
35
  {MATRIX.D3, MATRIX.A},
36
  {MATRIX.D0, MATRIX.B},  // LED  5
37
  {MATRIX.D1, MATRIX.B},
38
  {MATRIX.D2, MATRIX.B},
39
  {MATRIX.D3, MATRIX.B},
40
  {MATRIX.D0, MATRIX.C},
41
  {MATRIX.D1, MATRIX.C},  // LED 10
42
  {MATRIX.D2, MATRIX.C},
43
  {MATRIX.D3, MATRIX.C},
44
  {MATRIX.D0, MATRIX.D},
45
  {MATRIX.D1, MATRIX.D},
46
  {MATRIX.D2, MATRIX.D},  // LED 15
47
  {MATRIX.D3, MATRIX.D},
48
  {MATRIX.D0, MATRIX.E},
49
  {MATRIX.D1, MATRIX.E},
50
  {MATRIX.D2, MATRIX.E},
51
  {MATRIX.D3, MATRIX.E},  // LED 20
52
  {MATRIX.D0, MATRIX.F},
53
  {MATRIX.D1, MATRIX.F},
54
  {MATRIX.D2, MATRIX.F},
55
  {MATRIX.D3, MATRIX.F},
56
  {MATRIX.D0, MATRIX.G},  // LED 25
57
  {MATRIX.D1, MATRIX.G},
58
  {MATRIX.D2, MATRIX.G},
59
  {MATRIX.D3, MATRIX.G},
60
  {MATRIX.D0, MATRIX.DP},
61
  {MATRIX.D1, MATRIX.DP}, // LED 30
62
  {MATRIX.D2, MATRIX.DP}  // LED 31
63
};
64
65
...
66
...
67
68
MAX7221.transfer(pgm_read_byte(&LED[i].digit), segmValue[x]);

Statt einzelner Segmente in "const Led LED[]", kann man sich zum Bsp. 
durch Segmentwertaddierung alle benötigten Segmente für Buchstaben als 
Summenwert vorkonfigurieren. Ähnlich wie die binäre charTable.

Wenn man alle Segmentwerte für jedes Digit hintereinander berechnet um 
danach alles hintereinander zu übertragen, sollte das Auge nicht die 
geringste Chance haben falsche Muster erkennen zu können, bedingt durch 
den Digitübergang, falls fürs Auge überhaupt möglich.

https://youtu.be/IzfOqHBgZcg

Wenn du es irgendwann aufgebaut hast, kannste ja mal Erfolg vermelden. 
:-)

von Crazy Harry (crazy_h)


Lesenswert?

Sorry wenn ich das jetzt einwerfe, aber um nur 14 LEDs anzusteuern gibt 
es besser geeignete Treiber (PCA9532, PCA9555,...). Wieso den MAX7219?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

sind sicherlich weitere Alternativen, vorallen der mit Dimming.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> komplizierter wird es, ja, muss ja eine Herausforderung sein.  :-)

Hallo Veit,

danke für Dein Beispiel. Sieht recht elegant aus.

Werde bei Gelegenheit damit spielen.

Habe jetzt aber leider keine Forum Zeit wegen Arbeit.

Gruß,
Gerhard

von Marco G. (flaschenpost)


Lesenswert?

Crazy H. schrieb:
> Sorry wenn ich das jetzt einwerfe, aber um nur 14 LEDs anzusteuern gibt
> es besser geeignete Treiber (PCA9532, PCA9555,...). Wieso den MAX7219?

Ziemlich einfach: ich hatte mir irgendwann einen 10er Pack davon gekauft 
und jetzt gab es einen Anwendungsfall dafür. Klar sind 43 Cent pro Stück 
Overkill, aber ganz so knapp war es damals bei mir nicht.

Ich hoffe, jetzt konnte ich alle Vorurteile der echten MyCe- Veteranen 
gegenüber den Arduinisten erfüllen. :-)

von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

drängelt ja nicht, hast alle Zeit der Welt.

Beim Code anschauen fiel mir auf das ich das damals mit enum gemacht 
habe. Funktioniert zwar hier, nur leider kann man nicht sizeof anwenden. 
Deswegen habe ich das etwas modernisiert und möchte das noch zeigen. 
Dann kann man die Anzahl der Digits automatisch ermitteln lassen und 
überall verwenden. Man darf nur nicht im struct die Datentypen mischen, 
dann gehts wirklich schief. Man könnte beide struct der Matrix auch 
einzeln definieren. Wie einem beliebt.
1
struct Matrix
2
{
3
  struct Segmente
4
  {
5
    const byte DP = 128;     // Bit.7 - Datenblatt Tabelle 6
6
    const byte A  =  64;
7
    const byte B  =  32;
8
    const byte C  =  16;
9
    const byte D  =   8;
10
    const byte E  =   4;
11
    const byte F  =   2;
12
    const byte G  =   1;      // Bit.0
13
  } segment;
14
15
  struct Digits
16
  {
17
    const byte D0 = 0x01;
18
    const byte D1 = 0x02;
19
    const byte D2 = 0x03;
20
    const byte D3 = 0x04;
21
  } digit;
22
};
23
constexpr Matrix MATRIX;
24
25
// ----------------------------------------------------
26
27
struct Led
28
{
29
  const byte digit;
30
  const byte segment;
31
};
32
33
const Led LED[] PROGMEM = {
34
  {MATRIX.digit.D0, MATRIX.segment.A},  // LED  1
35
  {MATRIX.digit.D1, MATRIX.segment.A},
36
  {MATRIX.digit.D2, MATRIX.segment.A},
37
  {MATRIX.digit.D3, MATRIX.segment.A},
38
  {MATRIX.digit.D0, MATRIX.segment.B},  // LED  5
39
  {MATRIX.digit.D1, MATRIX.segment.B},
40
  {MATRIX.digit.D2, MATRIX.segment.B},
41
  {MATRIX.digit.D3, MATRIX.segment.B},
42
  {MATRIX.digit.D0, MATRIX.segment.C},
43
  {MATRIX.digit.D1, MATRIX.segment.C},  // LED 10
44
  {MATRIX.digit.D2, MATRIX.segment.C},
45
  {MATRIX.digit.D3, MATRIX.segment.C},
46
  {MATRIX.digit.D0, MATRIX.segment.D},
47
  {MATRIX.digit.D1, MATRIX.segment.D},
48
  {MATRIX.digit.D2, MATRIX.segment.D},  // LED 15
49
  {MATRIX.digit.D3, MATRIX.segment.D},
50
  {MATRIX.digit.D0, MATRIX.segment.E},
51
  {MATRIX.digit.D1, MATRIX.segment.E},
52
  {MATRIX.digit.D2, MATRIX.segment.E},
53
  {MATRIX.digit.D3, MATRIX.segment.E},  // LED 20
54
  {MATRIX.digit.D0, MATRIX.segment.F},
55
  {MATRIX.digit.D1, MATRIX.segment.F},
56
  {MATRIX.digit.D2, MATRIX.segment.F},
57
  {MATRIX.digit.D3, MATRIX.segment.F},
58
  {MATRIX.digit.D0, MATRIX.segment.G},  // LED 25
59
  {MATRIX.digit.D1, MATRIX.segment.G},
60
  {MATRIX.digit.D2, MATRIX.segment.G},
61
  {MATRIX.digit.D3, MATRIX.segment.G},
62
  {MATRIX.digit.D0, MATRIX.segment.DP},
63
  {MATRIX.digit.D1, MATRIX.segment.DP}, // LED 30
64
  {MATRIX.digit.D2, MATRIX.segment.DP}  // LED 31
65
};
66
67
const byte ANZAHL_LED = sizeof(LED) / sizeof(Led);
68
const byte ANZAHL_DIGIT = sizeof(MATRIX.digit);


So, genug gequatscht.  :-)

von Marco G. (flaschenpost)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> komplizierter wird es, ja, muss ja eine Herausforderung sein.  :-)


Bei mir mit der Lib war es einfach nur ein Aufruf von setLed. Dahinter 
steckt
(LedControl.cpp)
1
    int offset;
2
    byte val=0x00;
3
4
    if(addr<0 || addr>=maxDevices)
5
        return;
6
    if(row<0 || row>7 || column<0 || column>7)
7
        return;
8
    offset=addr*8;
9
    val=B10000000 >> column;
10
    if(state)
11
        status[offset+row]=status[offset+row]|val;
12
    else {
13
        val=~val;
14
        status[offset+row]=status[offset+row]&val;
15
    }
16
    spiTransfer(addr, row+1,status[offset+row]);

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> drängelt ja nicht, hast alle Zeit der Welt.
>
> Beim Code anschauen fiel mir auf das ich das damals...

Hallo Veit,

ich werde mich bei Gelegenheit aus Neugier damit befassen. Wie gesagt, 
Dein Lösungsansatz gefällt mir und dürfte auch ziemlich schnell laufen.

Einen Nachteil hat diese Art der Verwendung: Der 7219 muss immer für 
alle 8 Stellen konfiguriert sein. Auch wenn man z.B. nur 4 Stellen 
benötigt. Aber das macht nicht zu viel aus. Schade, daß es nicht eine 
Art 7219 mit CA Ausgängen gibt.

Und nun, die Arbeit ruft:-)

Gruß,
Gerhard

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

bin gerade am grübeln ob meine Theorie noch stimmt.
Bin nachdenklich gewurden bei den Common Anode Anzeigen.

Durch die CA Pins fließt der Summenstrom der Segmente.
Ebenso sind die Digit Pins vom MAX dafür gedacht diesen Summenstrom zu 
liefern bzw. zu schalten.
Wenn man das jetzt rumdreht wie oben gedacht, dann müssen die Segment 
Pins vom MAX den Summenstrom der Segmente vertragen/liefern.
Allerdings regeln diese ja intern auf den eingestellten Segmentstrom ein 
der mittels Rset bzw. Register vorgegeben wird. Mein Gedanke ist derzeit 
der das es zwar bestimmt funktioniert, nur die Segmenthelligkeit total 
unterschiedlich sein wird. Weil sich je nachdem wieviel Segmente aktuell 
aktiv sind diese den Rset Segmentstrom teilen müssen.

Bist du der gleichen Ansicht?
Oder bringe ich mich selbst durcheinander?  :-)

Edit:
habs nochmal aufgemalt, sollte doch funktionieren, werde das bei 
Gelegenheit auch ausprobieren, Forscherdrang ist geweckt.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> bin gerade am grübeln ob meine Theorie noch stimmt.
> Bin nachdenklich gewurden bei den Common Anode Anzeigen.
>
> Durch die CA Pins fließt der Summenstrom der Segmente.
> Ebenso sind die Digit Pins vom MAX dafür gedacht diesen Summenstrom zu
> liefern bzw. zu schalten.
> Wenn man das jetzt rumdreht wie oben gedacht, dann müssen die Segment
> Pins vom MAX den Summenstrom der Segmente vertragen/liefern.
> Allerdings regeln diese ja intern auf den eingestellten Segmentstrom ein
> der mittels Rset bzw. Register vorgegeben wird. Mein Gedanke ist derzeit
> der das es zwar bestimmt funktioniert, nur die Segmenthelligkeit total
> unterschiedlich sein wird. Weil sich je nachdem wieviel Segmente aktuell
> aktiv sind diese den Rset Segmentstrom teilen müssen.
>
> Bist du der gleichen Ansicht?

Hallo Veit,

P.S.: Bitte zuerst am Ende lesen.

Auf Grund Deines Einwands habe ich mir es noch mal durchgedacht. Es kann 
aber überhaupt nicht funktionieren. Es ist richtig, dass D1-D8 die 
Segmente sequenziell abgescannt. Es kann aber doch nicht richtig 
funktionieren so wie mir das jetzt vorkommt.

OK. Wir haben 8 LED Anzeigen mit ihren CA Anschlüssen an 
Segmentausgängen a-g+dp angeschlossen. Die Segment Sinking Treiber sind 
nun Display Digit Treiber. Jeder Open Drain Digit Ausgang ist an einen 
Segment aller LED Displays angeschlossen (D1-8 wird a-g+dp). Damit nun 
jedes Display einzeln aufleuchten kann müssten die Datenregister einmal 
so fest eingestellt werden:

00000001
00000010
00000100
.
.
10000000

Es passiert nur, dass von den Digitausgaengen die Segmente a-dp 
sequenziell angesteuert werden solange das jeweilige Bit im 
Datenregister gesetzt wird. Davon werden aber alle Displays gleichzeitig 
betroffen weil die übrigen Datenregister auch sequenziell programmiert 
werden müssen.

Aber dann müssten ja die Digit Treiber Ausgänge den Dateninhalt 
bereitstellen, was sie aber nicht können weil die ja nur sequenziell von 
D1-D8 durchschalten können. Also werden die Segmente nicht so wie 
gewünscht angesteuert.  Ein individuelle Display Bit/Segment Zuordnung 
ist offensichtlich nicht mehr wirklich möglich da ja da interne Logik im 
7219 den Scan autonom intern bewerkstelligt.

Dein Einwand bezüglich der Helligkeit ist übrigens auch nicht zutreffend 
weil ja immer nur ein LED wegen der sequenziellen Arbeitsweise der 
Digitausgänge angesteuert werden kann.

So wie es aussieht, ist das Konzept leider ein "Glorious Failure" und 
kann überhaupt nicht funktionieren. Tut mir leid.

Es sei denn ich stehe jetzt gerade wirklich satt auf dem Schlauch und 
missverstehe etwas Grundlegendes...

Gruss,
Gerhard

P.S. Nach weiterem Überlegen stellte ich doch fest, daß ich etwas 
übersehen hatte und tatsächlich auf dem Schlauch stehe. Peinlich so 
etwas. Ich nehme vorerst das vorher gesagte offiziell zurück...

Das von Dir erwähnte Problem mit der Helligkeit dürfte zutreffen da ja 
jedes LED das eine "1" Zuordnung im Datenregister hat, eingeschaltet 
sein wird. Im Extremfall halt alle 8 gleiche Segmente
bei allen Stellen.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

kann ich nachvollziehen. Je mehr man überlegt umso mehr Gedanken 
schießen einem durch den Kopf. Das letzte Promille Zweifel kann nur ein 
praktischer Test widerlegen oder bestätigen.  :-)  Mal sehen was die 
Bastelkiste hergibt.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> kann ich nachvollziehen. Je mehr man überlegt umso mehr Gedanken
> schießen einem durch den Kopf. Das letzte Promille Zweifel kann nur ein
> praktischer Test widerlegen oder bestätigen.  :-)  Mal sehen was die
> Bastelkiste hergibt.

Hallo Veit,

Ja, das würde mich auch sehr interessieren wenn Du das mal aufbauen 
könntest. Bin zur Zeit mit Arbeit eingedeckt und da bin ich daheim für 
Hobby weniger motiviert.

Schade übrigens, daß Maxim nicht eine 7219 Version für CA Displays 
konzipierte. Ich habe da ein paar sehr schöne Multi-Digit CA LED 
Displays in der Bastelkiste.

In meinem UV Belichter verwendete ich CA Multi-Digit Displays und eine 
Bargraph Anzeige neben einigen diskreten LEDs als 56 LED Matrix mit 
Hilfe von SPI und 164er SR von einem AVR betrieben. Das funktionierte 
als ISR wirklich gut. Alle LEDs ließen sich dann transparent ansteuern 
weil die ISR den Refresh bewerkstelligte. War mit dem Ergebnis sehr 
zufrieden. Im aktuellen Betrieb war es dann so auch nicht viel anders 
als mit dem MAX7219. Interessant war, wenn man den Kopf seitlich schnell 
bewegte, daß man dann einen Stroboskop Effekt beobachten konnte obwohl 
der Refresh rund 60 Mal/s war.

Bin mal gespannt was Dein Experiment erbringen wird.

Gerhard

von Marco G. (flaschenpost)


Lesenswert?

Ich verstehe den Unterschied nicht, ob in einem 1x CC Display alle 8 
Segmente von D0 an sind oder in einem 8x CA Display alle "SEG A".

Letzlich steuert der Chip 8x8 Dioden an. Die gemeinsamen Kathoden hängen 
an D0-D7, die gemeinsamen Anoden an SEG_A bis SEG_G.

Da man in einem 8x8 Feld ganze Zeilen oder ganze Spalten anschalten 
kann, kann das für ein CA 7-Seg nicht anders sein.

In einem 8x 7-Seg kann ich ja auch alle F-Seg anschalten.

Es ist nur Vertauschung von Spalten und Zeilen.

Oder steckt in einem 7-Seg mehr als nur die gemeinsame Anode bzw 
Kathode?

von Veit D. (devil-elec)


Lesenswert?

Hallo Gerhard,

habe 4 Stück VQE24 gefunden. Ich würde jetzt ungern Eine davon auf 
Lochraster nur zum testen "verschandeln", deswegen fertige ich eine 
Leiterplatte für alle 4 an usw.. Bitte Zeitmäßig um Geduld. Bin kein 
echter Freund von Lochrasteraufbau.

Laut Internetrecherche sind wir mir Common Anode nicht die Ersten.  :-)
https://marco-difeo.de/2013/02/21/drive-max7219max7221-with-common-anode-displays/
Deswegen bin ich guter Dinge das es klappt.


Hallo Marco,

muss ich dir wirklich den Unterschied zwischen Common Anode vs. Kathode 
erklären? Ich denke nicht. Der Rest wurde schon ausführlich diskutiert 
denke ich.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> habe 4 Stück VQE24 gefunden. Ich würde jetzt ungern Eine davon auf
> Lochraster nur zum testen "verschandeln", deswegen fertige ich eine
> Leiterplatte für alle 4 an usw.. Bitte Zeitmäßig um Geduld. Bin kein
> echter Freund von Lochrasteraufbau.
>
> Laut Internetrecherche sind wir mir Common Anode nicht die Ersten.  :-)
> 
https://marco-difeo.de/2013/02/21/drive-max7219max7221-with-common-anode-displays/
> Deswegen bin ich guter Dinge das es klappt.
>
> Hallo Marco,
>
> muss ich dir wirklich den Unterschied zwischen Common Anode vs. Kathode
> erklären? Ich denke nicht. Der Rest wurde schon ausführlich diskutiert
> denke ich.

Guten Morgen!

Faszinierend! Würde Spock entgegnet haben.

Dann bin ich mal auf Deine Ergebnisse schon gespannt. Mit dem Beispiel 
Code ist die meiste Arbeit die Verdrahtung der Displays. Da hatte ich 
mich mit meinen Gedanken ganz schön verfahren und anfänglich nur 
Pferdefüsse gesehen.

Der Code dazu ist natürlich relativ aufwendig.

Ein Leser hat da übrigens auch Bedenken wegen der Stromaufteilung und 
möglichen Überlastung. Ich denke andrerseits, daß die Strombegrenzung 
der Segmenttreiber das verhindert. Es würde nur ungleiche Helligkeit zur 
Folge haben. In seinem Bild sehen die Segmente aber doch nicht zu 
ungleich aus.

Was mir auffällt: Es ist in dieser unsrigen Welt schwer der Erste zu 
sein;-)

Zeit zu Frühstück...

: Bearbeitet durch User
von Marco G. (flaschenpost)


Lesenswert?

Veit D. schrieb:

> muss ich dir wirklich den Unterschied zwischen Common Anode vs. Kathode
> erklären? Ich denke nicht. Der Rest wurde schon ausführlich diskutiert
> denke ich.

In einem 8x8 Feld aus einzelnen LED ist SEG_A eine von acht Common 
Anoden und DIG_0 eine von acht Common Cathoden.

In einem aus 8 7-Segment-Anzeigen bestehenden Display ist SEG_A eine 
Common Anode (Aller A-Segmente) und DIG_0 eine Common Cathode (der 
letzten Stelle).

Wenn deine aus 8 Stellen bestehende Anzeige 8.8.8.8.8.8.8.8. ausgeben 
kann, sind alle SEG_A (nacheinander) aktiv.

Der wichtigste Unterschied, wenn ich ein Common Anode auf SEG_A als 
Anode und DIG_0 bis DIG_7 als Kathoden laufen lasse, ist die genaue 
Reihenfolge der mit 500(?) MHz durchlaufenden Anzeigen.

Mit einem extrem schnellen Filmverfahren würde man den Unterschied 
erkennen können. Ein extrem schnelles Filmverfahren würde ja auch 
erkennen, was in einem 8x8 Diodenfeld die "Zeilen" und was die Spalten 
sind.

Aber wenn der MAX7219 alle 2^64 Muster aus 8x8 LED anzeigen kann, kann 
er auch (mit SEG_A ... SEG_F als Common Anode) alle 8-stelligen Zahlen 
auf einem CA Display darstellen. Natürlich nur mit einer ziemlich 
nervigen transponierten Matrix, das streite ich ja nicht ab.

Die "8." auf einer einzelnen Common Anode unterscheidet sich nicht von 
der Anzeige von 8 Oberstrichen auf einem achtfach Common Cathode.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

kurzes Lebenszeichen von mir.
Platine habe ich bei elecrow in Auftrag gegeben, jetzt heißt es warten. 
In der Zwischenzeit fummel ich am Code rum. Dabei habe ich mir eine 
zusätzliche Hürde eingebaut. Da ich den MAX IC zwischen die Beinchen 
eines Digit gequetscht habe, musste ich die quasi 1:1 Hardware 
Segment-Digit Zuordnung aufgeben. Das muss ich zusätzlich im Code 
korrigieren. Wäre sonst zu einfach.  :-)  Geht aber bis jetzt ganz gut 
voran. Ich melde mich wieder wenn es läuft bzw. nicht läuft. Das muss 
und wird laufen.  :-)

von Veit D. (devil-elec)



Lesenswert?

Hallo Gerhard,

habe es heute nicht lassen können mein Steckbrett mit einer Anzeige zu 
bestücken und den Datalogger anzuklemmen für erste praktische Tests. 
Klappt. Mit juckte es in den Finger.  :-)

Ausgegeben wird der Wert -8301. Das '-' wandert mit je nach 
Stellenanzahl. Wenn ich mit dem Jumperkabel von Common Anode an die 
entsprechenden Segmente vom MAX7221 gehe, werden alle "Ziffern" korrekt 
dargestellt. Habs in die Screenshots eingezeichnet. Die Zuordnungen sind 
bei mir nicht nach Reihenfolge, weil das Layout optimiert ist. Links 
Beschriftung laut VQE Anzeige und in Klammern die Beschriftung laut 
MAX7221.

Die Digits vom MAX7221 (im Bild die Treppenstufen) ackern mit 727Hz bei 
voller Helligkeit mit 12,1% Duty Cycle.

Jetzt bleibt mir wirklich nur noch warten fürs große Ganze ...  :-)

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo Gerhard,
>
> habe es heute nicht lassen können mein Steckbrett mit einer Anzeige zu
> bestücken und den Datalogger anzuklemmen für erste praktische Tests.
> Klappt. Mit juckte es in den Finger.  :-)
>
> Ausgegeben wird der Wert -8301. Das '-' wandert mit je nach
> Stellenanzahl. Wenn ich mit dem Jumperkabel von Common Anode an die
> entsprechenden Segmente vom MAX7221 gehe, werden alle "Ziffern" korrekt
> dargestellt. Habs in die Screenshots eingezeichnet. Die Zuordnungen sind
> bei mir nicht nach Reihenfolge, weil das Layout optimiert ist. Links
> Beschriftung laut VQE Anzeige und in Klammern die Beschriftung laut
> MAX7221.
>
> Die Digits vom MAX7221 (im Bild die Treppenstufen) ackern mit 727Hz bei
> voller Helligkeit mit 12,1% Duty Cycle.
>
> Jetzt bleibt mir wirklich nur noch warten fürs große Ganze ...  :-)

Hallo Veit,

Habe Deine Nachricht erst jetzt bemerkt. Das ist ja toller Fortschritt. 
Glückwunsch! Hoffe, daß die LP bald ankommen. Wenn das mal alles 
funktioniert kann man den Treiber abkapseln und nur übers API 
ansprechen. Der Rest geschieht dann im Hintergrund. Ich werde das auch 
ausprobieren. Ich habe da einige schöne 4-Digit CA Anzeigen die ich auch 
gerne mit dem MAX7219 betreiben wollte. Bis jetzt betrieb ich diese 
Anzeigen mittels 74HC164 SR und Timer ISR wie ich es im UV Belichter 
gemacht hatte wo ich 56 LEDs im MUX Betrieb ansteuern mußte.  Mit dem 
7219 ist das bequemer.

Bin schon gespannt auf weitere Erfolgsnachrichten...

Gruß,
Gerhard

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

Schaltplan für Jörg falls er hier vorbeischaut.
Für andere natürlich auch.

elecrow muss wohl erst den Neujahrsfestferienbestellrückstand abarbeiten 
bevor ich dran bin.  ;-)  Habe noch keine Produktionsbestätigung.

von Jörg R. (solar77)


Lesenswert?

Veit D. schrieb:
> Schaltplan für Jörg falls er hier vorbeischaut.

Ja;-)

Hat die Schaltung nicht den Nachteil das der Strom für ein Digit (bei 
einer 8 sind es 7 Segmente) vom Chip von einem Segmentanschluss 
geliefert werden muss? Die Segmentausgänge liefern doch vermutlich 
Konstantstrom. Ich vermute dass die Segmente daher nicht gleich hell 
leuchten, je nachdem welche Ziffer dargestellt wird. Verständlich 
beschrieben?

: Bearbeitet durch User
von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

mit diesem Gedankenfehler bist du nicht alleine. Hatte ich auch - aber 
nur ganz kurz.  :-)
Kannst dir ja noch die Post weiter oben durchlesen. Ich handel das im 
Übrigen nicht nur theoretisch ab, ein Steckbrettaufbau mit Doppeldigit 
läuft schon. Nur wie soll ich das mit Worten erklären?

Es ist im Grunde doch so, egal was man an den MAX anschließt, es muss 
elektrisch richtig herum angeschlossen werden. Der Segmentport ist und 
bleibt (+) und der Digitport ist und bleibt (-).

Wir stellen uns einen vollbeschaltenen MAX vor mit einer großen LED 
Matrix bestehend aus Einzel-LEDs. Nichts anderes sind die 
7-Segmentanzeigen elektrisch gesehen, egal ob CK oder CA. Der 
Zusammenhang bzw. der Unterschied zwischen CK und CA besteht praktisch 
nur darin ob man die Ziffer zugehörigen Segmente einer 7-Segmentanzeige 
senkrecht oder waagerecht betrachtet. Nur das macht den Unterschied 
zwischen CK und CA aus.

Entweder werden alle benötigten Segmente einer Ziffer Position für 
Position mittels Digitmultiplexing durchgeschalten. CK! Oder wird 
Segment für Segment per Multiplexing auf allen Positionen 
durchgeschalten wo dieses Segment benötigt wird. Egal wie man das dreht. 
Pro MAX Segmentleitung ist immer nur eine Led aktiv und die MAX 
Digitleitung muss den Summenstrom schalten. Nur das bei CA die 
Digitleitungen die Segmente darstellen und umgedreht.

Anders formuliert. Wir wollen auf allen Stellen eine 1 darstellen. Dazu 
wird Segment B + C benötigt. Jetzt leuchten mit CA Anzeigen immer im 
Wechsel wegen Multiplexing alle "B" Segmente auf allen Stellen und 
danach alle "C" Segmente auf allen Stellen. Es bleibt jedoch dabei, dass 
immer nur eine LED am MAX pro Segmentleitung leuchtet. Man muss das 
versuchen im Kopf zu trennen oder sich das Schaltbild anschauen.

Für das Auge ist es egal wie herum das Multiplexing stattfindet. 
Hauptsache es wechselt schnell genug damit es flimmerfrei erscheint. Es 
ist im Grunde nur eine andere Verteilung der Segmente auf der Anzeige wo 
was gleichzeitig leuchtet.

Der zweite Trick den man bei der Programmierung machen muss ist, man 
kann und darf nicht mehr Segmentweise pro Einzelziffer pro Digitadresse 
denken. Man darf nicht mehr einfach pro Ziffer die Segmentwertigkeiten 
addieren und der einen Digitadresse zuordnen. Man muss den Bedarf eines 
Segmentes über alle darzustellenden Ziffern ermitteln und damit die 
benötigten Segmentwertigkeiten addieren und einer "Digitadresse" 
zuordnen. Die Digitadresse stellt ja jetzt ein Segment dar und nicht 
mehr eine Position. Diesen 2. Knoten muss man gedanklich lösen bevor man 
anfängt. Bedeutet man muss immer alle Digitadressen in einem Rutsch 
beackern wenn man auf der Anzeige irgendwas ändern möchte. Ändert sich 
die Anzeige nicht muss man nichts übertragen.

Ich hoffe das ist verständlich formuliert. Am besten parallel den 
Schaltplan betrachten und immer daran denken das der MAX immer seine 
Digits weiterschaltet, egal was wie dranhängt.

: Bearbeitet durch User
von Jörg R. (solar77)


Lesenswert?

Veit D. schrieb:
> Ich hoffe das ist verständlich formuliert.

Es ist das erste mal dass ich mir einen Kommentar nebst Bildern 
ausgedruckt habe. Das muss ich mir mal in Ruhe ansehen;-) Vermutlich 
kommt dann noch die ein oder andere Frage.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

vielleicht hilft dir eine andere Erklärung vorweg.

CK Anzeige.
Man möchte alle 8 Segmente inkl. Punkt des ersten Digits einschalten.
Dann schreibt man in das erste Digitregister den Wert 255. Fertig.

CA Anzeige.
Alles ist in der Matrix um 90° verdreht. Siehe Bilder.
Die erste Anzeige, ist meinetwegen der Segmentleitung A zugehörig. CA 
Pin.
Die MAX Digitleitungen stellen die Segmente A-G-DP dar und führen zu den 
Segmentpins der Anzeige. Um jetzt alle Segmente dieser ersten Anzeige 
einzuschalten muss man in jede Digitadresse den Wert 64 schreiben. Der 
Wert für das Segment A aus Sicht des MAX. Seine Digitleitungen pulst der 
MAX alleine durch. Fertig.

Belässt man das Progamm so und wechselt von CA zurück auf CK, würde auf 
allen Anzeigen/Digits nur das Segment A leuchten. Statt auf einer 
Anzeige alle Segmente.

von Jörg R. (solar77)


Lesenswert?

Veit D. schrieb:
> mit diesem Gedankenfehler bist du nicht alleine. Hatte ich auch - aber
> nur ganz kurz.  :-)

Mein Gedankenfehler war anzunehmen das ein Segmentanschluss ein 
komplettes Display treiben muss. Als Maximum also eine 8...bzw. 7 
Segmente. Das ist bei Deiner Umsetzung natürlich nicht so.


> Kannst dir ja noch die Post weiter oben durchlesen.

Das habe ich, es hat etwas gedauert bis der Groschen gefallen ist. 
Manchmal hat man aber auch ein Brett vor dem Kopf.

Vielen Dank für die Erklärungen und den Aufwand den Du betrieben hast;-)

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

gern geschehen.

Meine Leiterplatte ist übrigens bei elecrow aktuell in der Fertigung, 
dauert also noch etwas ... man muss derzeit Geduld haben.  :-)

Beitrag #6173678 wurde vom Autor gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Hoffnung die heute gelieferten Platinen zu retten sind gescheitert, 
habe einen Fehler in der IC Pad-Layerebene gemacht und muss neu 
bestellen. Pads sind statt im Layer 2 im Layer 7 gelandet. Wo kein 
Kupfer kein löten. :-)

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

Platine ist da und gleich bestückt ... funktioniert.  :-)
Werde bei Gelegenheit noch ein kleines Video machen.

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> Platine ist da und gleich bestückt ... funktioniert.  :-)
> Werde bei Gelegenheit noch ein kleines Video machen.

Sieht sehr gut gelungen aus! Glückwunsch.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke.  :-)  Hier 3 Videos. Der "Counter" zeigt kein flimmern oder 
ähnliches. Die anderen Videos sind Effektspielereien mit etwas Fading 
in/out.

https://youtu.be/-RYIpMU0msA
https://youtu.be/Q_wLsrhFIvo
https://youtu.be/zYd8Bc2vmeA

von Gerhard O. (gerhard_)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> Danke.  :-)  Hier 3 Videos. Der "Counter" zeigt kein flimmern oder
> ähnliches. Die anderen Videos sind Effektspielereien mit etwas Fading
> in/out.
>
> Youtube-Video "VQE24 Counter cut"
> Youtube-Video "VQE24 SegmentFading schnell cut"
> Youtube-Video "VQE24 SegmentFading langsam cut"

Das sind sehr schöne Anzeigen. Jedenfalls scheinen alle Segmente sehr 
gleichmäßig hell zu sein. Das funktioniert wirklich einwandfrei. Welcher 
uC steuert den 7221er?

OT:
Ich bin versucht mich auch irgendwann damit zu befassen. Aber zur Zeit 
muß erst das LNG302 ganz fertig werden...

Habe bei der LCD Anzeige im LNG302 das greuliche blaue Backlight gegen 
ein gelbgrünes LED ausgetauscht. Sieht jetzt viel schöner aus. Da wurde 
intern eine 0603 LD verwendet das leicht austauschbar ist. Man muß wegen 
der kleineren Spannung den Vorwiderstand vergrößern damit die LED im 
Vergleich zur blauen LD nicht zu viel Strom zieht.

I hate blue LEDs;-)

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

blaue Leds sind wirklich gewöhnungsbedürftig, vorallendingen dürfen sie 
einem nicht zu hell und nicht direkt anstrahlen, da wird man sonst 
blöde. Wenn ich in eine helle blaue Led zu lange "reinschaue" wird mir 
immer schlecht. Irgendwas passiert da.  :-)

Der µC ist ein ATmega2560 mittels Arduino IDE programmiert.

Falls du mehr verraten darfst, was ist ein "LNG302"? Irgendeine 
Baugruppe die mit Erdgas zu tun hat?

von Jörg R. (solar77)


Lesenswert?

Veit D. schrieb:
> Falls du mehr verraten darfst, was ist ein "LNG302"? Irgendeine
> Baugruppe die mit Erdgas zu tun hat?

Ich vermute ein Labornetzgerät Typ 302;-)

von Gerhard O. (gerhard_)


Lesenswert?

Jörg R. schrieb:
> Veit D. schrieb:
>> Falls du mehr verraten darfst, was ist ein "LNG302"? Irgendeine
>> Baugruppe die mit Erdgas zu tun hat?
>
> Ich vermute ein Labornetzgerät Typ 302;-)

Ja. Siehe Kunstwerk Thread 2020...

Ich habe schon gehofft blaue LEDs brennen sich langsam in den Reihen der 
Vermarkter aus. Falsch gehofft, denn blau scheint immer noch die "Color 
of Choice" zu sein..

von Roland F. (rhf)


Lesenswert?

Hallo,
Gerhard O. schrieb:
> Jedenfalls scheinen alle Segmente sehr gleichmäßig hell zu sein.
> Das funktioniert wirklich einwandfrei.

Ja, tut es. Egal wie viel Segmente (oder einzelne LEDs) angezeigt 
werden, die Helligkeit (ohne jedes Geflimmer) ist immer die Gleiche. Und 
das bei minimalem Schaltungsaufwand und großer Flexibilität.

> I hate blue LEDs;-)

Ich nicht, wie Veit schon gesagt hat, ist das Problem, das die meisten 
blauen LEDs viel zu hell eingestellt sind. Wenn man das richtige Maß 
findet kann das sehr gut aussehen.

rhf

von Veit D. (devil-elec)


Lesenswert?

Hallo,

> LNG302 ... Labornetzgerät Typ 302
schmunzel   :-)

> im Kunstwerk Thread 2020
sieht verdammt gut aus.  :-)

von Jörg R. (solar77)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
>> LNG302 ... Labornetzgerät Typ 302
> schmunzel   :-)

Weshalb schmunzel, ich lag doch richtig;-)
War übrigens geraten, ich kannte den Beitrag mit dem NT bisher nicht.

https://www.mikrocontroller.net/attachment/448635/LNG302.jpg

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

keine Sorge, ich musste schmunzeln wegen der Mehrfachbedeutung von LNG.
Flüssigerdgas vs. Labornetzgerät   :-)
Du hast gut geraten.  :)

Meine Kiste gibt noch folgendes her.
9x VQB28F, gA
5x VQB27E, gK
3x VQE23F, gK
1x VQE23E, gK
1x VQE21F, gK
und noch einen kleinen Schatz von VQB71.

Weiß jemand was 'F' für einen µcd Bereich hat?

von Reinhard R. (reirawb)


Angehängte Dateien:

Lesenswert?

Guggst Du :-)

Reinhard

von Veit D. (devil-elec)


Lesenswert?

Hallo,

hab geguggd - Danke. Im Minidatenblattbuch von 1987 Teil 2 gehts nur von 
B bis E.

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.