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.
Morgen
Vorgeschichte, Prolog, Gelaber... eigentlich unwichtig also wer es eilig hat springt lieber zum zweiten Teil
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.
Zweiter Teil ... darum geht's:
>>> Bild hier Datasheep MAX7219/7221 ... Bild hier <<<
Ich habe den MAX >>hier bei Maxim beschrieben<< 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?
Bild hier
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.
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
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.
Moin, ich arbeite auch mit dem MAX7221/7219, allerdings mit nem Microcontroller. Da der allerdings in C programmiert ist, kann dir das vielleicht weiterhelfen:
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.Code:// 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 }
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?
...
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
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
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.
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
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.
...
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
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
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.
...
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
nachtrag:
hey es scheint wirklich zu funktionieren ... d.h.: Jetzt bloß nichts mehr anfassen
nit resigniert nur reichlich desillusioniert
e bessje jet hann ich kapiert
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.
...
Lesezeichen