PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MAX7221



BoondockDuck
11.01.2008, 00:34
Morgen



Vorgeschichte, Prolog, Gelaber... eigentlich unwichtig also wer es eilig hat springt lieber zum zweiten Teil 8-[

Ich bastele schon seit geraumer Zeit mit ein paar 5*7 Dotmatrix LED Displays rum. Das ganze leider nur sehr sporadisch aber inzwischen habe ich mich von "garkein Plan" soweit entwickelt dass ich zwei Matrizen via LPT am PC ansteuern kann. Das ganze läuft über Schieberegister, ULN2803 und UDN2981. Softwaremäßig programmiere ich alles noch mit Borland Delphi. Funktioniert zwar aber wirklich praktisch verwendbar ist diese Methode nicht.
Sind sozusagen die sprichwörtlichen Kanonen auf Spatzen.

Deswegen habe ich mir von Maxim ein paar ICs zukommen lassen.
Den MAX6953 sowie den MAX7221.

Den Max9653 kann ich noch nicht verwenden weil mir viel elektronischer Krimskrams fehlt... mein Kleinzeugsortiment ist einfach noch nicht ausgereift genug. :-s



Zweiter Teil ... darum geht's:

>>> http://www.myguestbook.org/images/smileys/usersmileys/21.schaf.gif Datasheep MAX7219/7221 ... http://www.myguestbook.org/images/smileys/usersmileys/21.schaf.gif <<< (http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf)

Ich habe den MAX >>hier bei Maxim beschrieben<< (http://www.maxim-ic.com/appnotes.cfm/an_pk/2782) an den LPT angechlossen und an den MAX wiederum ordnungsgemäß nach Datenblatt eine 5*7LED-Matrix.
Gleich eine Frage zuerst: Auf der Webseite ist es ein 100pF Kondensator an Pin12 des SUB-D-Steckers. Im Programm vom Maxim ist die gleiche Skizze mit einem 100kOhm Widerstand an Stelle des Kondensators. Was ist denn nun richtig?
http://media.maxim-ic.com/images/appnotes/2782/2782Fig01.gif

Ich kam aber nach dem Anschließen zu keinem Ergebnis. Ich dachte es könnte an meinem "zusammengeschusterten" Aufbau liegen denn mir fehlts gerade an passenden Elektrokleinteilen weswegen ich die Kondensatoren und Widerstände relativ freizügig zusammengestückelt habe.
Deswegen habe ich den MAX jetzt direkt an den LPT angeschlossen. Ich weiß, das ist nicht intelligent aber bei meiner anderen Variante habe ich es auch so gemacht und es funktioniert wunderbar... den Risiken bin ich mir aber schon bewusst. Funktioniert aber trotzdem noch nicht.


Ich frage mich was ich jetzt noch falsch mache. "Angesteuert" wird der MAX doch eigentlich wie einen normalen Schieberegister, oder sehe ich das Falsch?

Also in diesem spezifischen Fall ist LOAD normal auf High.
Zum Ansteuern setze ich LOAD auf Low, an DIN nacheinander die 16 Zustände (also High/Low).
Nach jeden Bit muss dann noch CLK einmal auf High und wieder auf Low gesetzt werden. Nach den 16 Bit wird LOAD wieder High und der Zauber ist vorbei.
Oder sehe ich das falsch?

Im Datenblatt steht noch das hier:
"The data is then latched into either the digit or control registers on the rising edge of LOAD/CS. LOAD/CS must go high concurrently with or after the 16th rising clock edge, but before the next rising clock edge or data will be lost."
Das heißt doch nur dass ich nach dem 16 Bit am besten gleichzeitig mit dem 16.CLK LOAD/CS wieder auf High setzen muss, mindestens aber bevor CLK wieder geschaltet wird??


Es könnte durchaus sein dass ich einen kleinen Logikfehler in meinem Delphiprogramm eingebaut habe, aber das erklärt nicht warum das Programm vom Maxim nicht funktioniert.

JonnyP
11.01.2008, 07:09
Direkt angeschlossen, heist das, das das Widerstandsnetzwerk um die Pins 2-4 einfach weggelassen wurden? Dann wird es nicht gehen, weil über die 4k7 Widerstände die Hi-Pegel für den Max vorgegeben werden.

the_Ghost666
11.01.2008, 09:34
Moin, ich arbeite auch mit dem MAX7221/7219, allerdings mit nem Microcontroller. Da der allerdings in C programmiert ist, kann dir das vielleicht weiterhelfen:


// MAX7221 LED-Treiber-IC

//MAX7221.h
#define CLK PIN_B1
#define CS PIN_B2
#define DATA PIN_B3
#define NOOP 0
#define DIG0 1
#define DIG1 2
#define DIG2 3
#define DIG3 4
#define DIG4 5
#define DIG5 6
#define DIG6 7
#define DIG7 8
#define DECODE 9
#define INTENSITY 10
#define SCANLIMIT 11
#define SHUTDOWN 12
#define TEST_REG 15

void max_ausgabe(int adresse,int wert);
void init_max (int Digits, int Brightness);


void max_ausgabe(int adresse,int wert)
{
int i;

adresse&=0x0F; //higher nibble =0
OUTPUT_LOW(CLK);
OUTPUT_LOW(DATA);
OUTPUT_LOW(CS);
for (i=8;i>0;i--)
{
OUTPUT_LOW(CLK);
OUTPUT_BIT(DATA, BIT_TEST(adresse,i-1));
OUTPUT_HIGH(CLK);
}
for (i=8;i>0;i--)
{
OUTPUT_LOW(CLK);
OUTPUT_BIT(DATA, BIT_TEST(wert,i-1));
OUTPUT_HIGH(CLK);
}
OUTPUT_HIGH(CS);
OUTPUT_LOW(CLK);
OUTPUT_LOW(DATA);

}


void init_max (int Digits, int Brightness)
{
int i;

max_ausgabe(SHUTDOWN,0); //Shutdown on
max_ausgabe(TEST_REG,0); //Testmode off
max_ausgabe(SCANLIMIT,Digits-1); //Number of Digits
max_ausgabe(INTENSITY,Brightness-1); //Set Brightness
max_ausgabe(DECODE,0); //No Decode-Mode

for(i=1;i<9;i++) //All Digits to Zero
{
max_ausgabe(i,0);
}

max_ausgabe(SHUTDOWN,1); //Shutdown off
}


Ausserdem findest du auf unter http://www.hanf-elektrotechnik.de/ bei den Projekten einen Weihnachtsstern, der ebenfalls mit dem MAX7219/7221 und einem µC aufgebaut wurde.
Ich bin mir nicht sicher, ob der Parallelport nur OpenCollector Ausgänge hat, wenn ja, brauchst du die Widerstände, wenn nicht würde ich das Timing vom PC mal genauer ansehen oder die Zustandsänderungen am Port einzeln machen und mit vielen Pausen zupflaster und sowas auszuschließen.
Hast du mal die Spannungen der Low und High Pegel am 7221 gemessen?

BoondockDuck
11.01.2008, 09:35
wieso reicht denn da nicht der high-pegel vom LPT selbst aus? Das tat er bis jetzt doch auch immer.
aber ich werde es nochmals so aufbauen und testen

BoondockDuck
11.01.2008, 14:25
he the_ghost wie hat sich denn dein beitrag hier reingeschlichen ... den habe ich ja garnicht gesehen.

Erst einmal ein kleines Update:
Ich bin doof, habe ich mal wieder festgestellt. Ein Grundlegender Fehler ist es wohl Anode und Kathode zu verwecheln, sprich die Matrix war verkehrt an den MAX angeschlossen.
Nachdem ich das geändert habe zeigt das Display gelegentlich etwas an, macht aber ziemlich viel Unfug.

Das einzige was ich bewusst steuern kann ist dass der Test-Modus läuft. Sonst reagiert der MAX auf nichts.

Ich dachte mir das könnte an der LOW-Spannung des LPTs vom 0.8V liegen. Desshalb habe ich als eine art "Treiber" einen UDN2981 vorgeschaltet. Das funktioniert super, ich habe jetzt klare Zustände für LOAD, DIN und CLK. (High=5V , Low = 0V).
Aber seltsamerweise reagiert der MAX nun auf garnichts mehr.
Woran liegt das denn jetzt?
MUSS ein Low-Zustan auch eine gewisse Mindestspannung haben? Ich dachte bis jetzt Low ist am besten wenn es 0V sind.


Zum Thema Spannung messen: An LOAD liegen wie es sein soll die Versorgungspannung an. Und soweit ich das mit meinem Multimeter auch durchmessen kann werden die Daten auch korrekt geschrieben. (D.h. beim Schreiben sinkt die Spannung an LOAD ab und an den anderen beiden Pins geht sie hoch... genauer kann ich das in der Zeit aber wirklich nicht messen ;))

Ich bin ratlos :-#
Bin zwar froh dass ich meinen doofen Fehler bemerkt habe aber irgendwie versteh ich das Problem jetzt nicht mehr.



Nachtrag:
ach ... jetzt schlagt ihr mich bestimmt auch gleich ... ich benutze übrigens ein 3-4m langes Kabel vom Parallelport zur Schaltung. Das machte mir bis jetzt noch nie Probleme. Ich habe es deswegen auch mit einem Laptop (Kabellänge 15cm) getestet, da passiert der selbe Unfug.

Habe ich vielleicht noch irhendwo einen Grundlegenden Denkfehler???


Nachtrag2:
Was ich gerade merke:
Wenn ich den MAX resette (also Spannung weg und wieder dran) dann befindet er sich ja im Shutdown-Status. Dieser muss laut Datenblatt erst aufgehoben werden bevor man mit dem MAX ernsthaft spielen kann.
Der Test-Modus übergeht das allerdings von selbst.
D.h. wenn ich dann wieder auf "Write Test Mode" in dem Prgramm von Maxim klicke leuchtet die ganze Matrix.

Das tut sie auber auch wenn ich auf irgendeine der anderen "Write-Buttons" klicke, immer leuchtet die ganze Matrix und dann reagiert er auf nichts mehr.

the_Ghost666
11.01.2008, 15:55
Maxim hat ein Programm für das Ding geschrieben? Also er hat den Shutdown modus, in dem alle LEDs abgeschaltet sind, nur der Test-Modus kann das überlagern, das stimmt.
Hast du die Pullup Widerstände drin? der UDN2981 kann nur auf Masse ziehen, aber nicht auf Vcc. Dafür brauchst du dann die Pullups von 4,7k.
Beim Pegelmessen dachte ich daran, dein Port dauerhaft low zu schalten, in Ruhe zu messen, high zu schalten und wieder in Ruhe zu messen.
Low ist bei TTL normalerweise 0-0,6V und high 2,8-Vcc. Dazwischen ist Niemandsland und du kannst nicht definitiv sagen, wie ein IC schaltet. Wenn deine Spannungen nicht hoch genug sind, oder ungünstig einbrechen, kann es sein, dass genau so fehler in der Übertragung entstehen.

BoondockDuck
11.01.2008, 17:16
Das ist doch umgedreht. Der ULN2803 zieht auf Masse und der UDN2981 ist ein "8Bit Channel-Driver" ???

Das Programm von Maxim gibts hier:
http://www.maxim-ic.com/appnotes.cfm/an_pk/2782
Ist zum Testen ideal.

Ja die Pullups sind auch wieder dran.

LPT:
LOW 0.08V
HIGHT 4.12V


Irgendwie spielt das voll verrückt.
Inzwischen bekomme ich manchmal eine Anzeige die ich auch etwas beeinflussen kann, aber meistens gehts schief.


Kann es schlicht an der Datenübertragung liegen? Also dass mein weg einfach zu störanfällig ist. Wenn ja wie kann ich das denn verbessern bzw. entstören?

Ich habe ja auch noch ein MiniControl-Board. Das war eigentlich mein nächstes ziel wenn es vom LPT geklappt hat.
Aber vom Atmel zum MAX muss es ja Störfrei funktionieren?
Weil dann wäre es ein versuch wert den MAX über den Atmel anzusprechen ... obwohl ich jetzt mal garkeinen Plan habe wie ich das mache

the_Ghost666
11.01.2008, 17:36
Argh, jaja hast ja recht!

Die Pegel sollten ausreichen, vielleicht ist das lange Kabel wirklich das Problem, oder du senderst einfach stuss...mhhh


Ist den dein LED Array sinnvoll verkabelt bzw kannst du ein Muster erkennen, wenn du einen Parameter änderst, auch wenn das keinen Sinn ergibt? Den MAX kann man in einen Modus schalten, der die Zeichen direkt decodiert ausgibt, ein anderer Modus schickt einfach nur die Daten, wie sie Binär vorliegen.

BoondockDuck
11.01.2008, 18:25
ja ich habe doch immer recht =D>

ne in diesem fall war ich mir sicher weil ich die beiden bauteile ja bereits verwendet hatte, sonst weiß ichs auch nie auswendig.


Das Array ist natürlich sinnvoll verkabelt.
Also Anode an SegA-SegG und Kathode an Dig0-Dig4


Ich habe gerade mal die Pullupwiderstände verdoppelt
Und... wohoo... es funktioniert. Allerdings ganz durchblicken kann ich nach wie vor nicht.


Meine Vermutung: Ist es möglich dass sich der MAX aufhängt wenn er Daten für Digits ausgeben soll die nicht angeschlossen sind? Bei mir hier ist ja nur Digit0-4 gefragt, beim rumtesten habe ich die Begrenzung der Digits, also das Scanlimit wild hoch und runtergeschoben.
Wenn ich Scanlimit nicht über "4" setze funktioniert es soweit sogar... glaube ich. Mal schauen wie lange :-s




nachtrag:
hey es scheint wirklich zu funktionieren ... d.h.: Jetzt bloß nichts mehr anfassen 8-[

the_Ghost666
11.01.2008, 20:30
Hehe, never change a running system.
Ich hab mir das ding mal mit 8 großen 7Seg Anzeigen aufgebaut, nette Sache, ausserdem den oben genannten Weihnachtsstern für meine Freundin gebaut, echt feines Teil, vor allem weils bei einfachen Formen von der Verkabelung echt simpel ist und nicht viel Strom verbraucht. Nur der Stern ist echt horror, weil die LEDs so verteilt sind.

BoondockDuck
11.01.2008, 22:16
so ich habe jetzt versucht einen zweiten MAX7221 hinten dran zu hängen, und das funktioniert ja irgendwie garnicht.

Der Aufbau ist der Selbe, nur dass der zweite MAX seine Daten an DIN vom DOUT des ersten MAX bekommt.

Die Software von Maxim ist sogar führ kaskadierte Schaltungen ausgelegt, nur bis jetzt geht es nicht.
Wenn ich den ersten MAX alleine laufen lasse funktioniert es.
Allein wenn ich DOUT vom ersten mit DIN vom zweiten verbinde spielen beide verrückt.
Zumindestens der erste müsste sich noch noch normal verhalten, was am DOUT gelesen wird ist ihm doch reichlich egal??

BoondockDuck
17.01.2008, 11:42
hi... es geht mal wieder weiter


Ich habe inzwischen ein kleines Delphiprogramm zusammen dass den einen MAX7221 ansteuert.

Jetzt habe ich versucht einen zweiten MAX an den ersten zu hängen, also zu kaskadieren. Das funktioniert leider garnicht.
Ich dachte wenn man zwei MAX hintereinander hängt muss man nichts anderes machen als schlicht zwei 16Bit words auszugeben und dann Load CS wieder high zu setzen.

Im Datenblatt steht allerdings das hier und ich vermute dass hier irgendwie Bits verloren gehen.
Data at DIN is propagated through the shift register and appears at DOUT 16.5 clock cycles later. Data is clocked out on the falling edge of CLK.
Diese "16.5" irritiert mich und ich weiß nicht so recht wie ich das beachten muss.

the_Ghost666
17.01.2008, 19:48
Das bedeutet, dass der zweite MAX aber der Mitte des 16. Clocks diese Daten annimmt, das macht er, damit du bei einem Fehler im Takt nach Rechts und Links eine möglichst hohe Toleranz hast. Das selbe Prinzip nutzt auch eine serielle Schnittstelle, die Bits werden nicht direkt bei Pegelwechsel gelesen, sondern erst nen halben Takt später.
Für dich bedeutet das garnichts, du musst nichts ändern oder beachten.
Hast du alle Max an der gleichen CS Leitung, sodass die gleichzeitig low gezoge werden?

BoondockDuck
18.01.2008, 10:53
ja cs und clock sind die gleichen leitungen. Data geht zu Din vom Max1 und von diesem geht Dout zu Din des zweiten Max.