Problem mit Programm für MAX7219 Baustein
-
Hallo, ich hoffe ihr könnt mir helfen.
Ich habe ein vorgeschriebenes Programm bekommen, das Werte, mit Hilfe des MAX7219 Bausteins, auf 7 Segment Displays ausgeben soll.
Nun habe ich den Maxbaustein mit 2 Displays (er kann bis zu 8 ansteuern) und dem Microcontroller verbunden. Wenn ich das Programm nun per Keil µVision 2 auf den MCU lade und das Programm dann durch den Debugger starte, blinken die beiden Anzeigen nur in kurzen Abständen auf (wie ich sie durchgehend leuchten lasse, weiß ich schon).
Aber das Programm sollte eigentlich die Zahlen von 0-255 ausgeben (da es nur zwei Displays sind wird er wohl nur 0-99 ausgeben können).
Könnt ihr mir vielleicht helfen und sagen was ich falsch mache? Vielleicht mache ich mit den Ports ja was falsch oder das Programm ist fehlerhaft. Wär auch nett wenn ihr mir das Hauptprogramm mal erklären könnt, ich weiß z.B. nicht für was P1=i; gut sein soll.
Hier sind dann noch ein mal, mein MCU-Board und der Plan wie ich die Sachen verbunden habe.
Board: http://home.arcor.de/bockybocky/MCU-board1.jpg
(da ich nicht genau wusste wo die Ports 3.x liegen, habe ich einfach im Programm die Ports 5.x für Clock, Data_In und Load genommen, das sind ja (auf dem Bild) Zeile c jeweils die grünen Punkte, oder?)Plan: http://home.arcor.de/bockybocky/plan.jpg
Hier it nun das Programm:
#include <reg515.h> //Definitionen der 80535-Variablen //************************* Konstanten ****************************** //* Definition der Register des MAX7219 *** #define NO_OP 0x00 // NO-OP */ #define DIGIT0 0x01 // DIGIT 0 */ #define DIGIT1 0x02 // DIGIT 1 */ #define DIGIT2 0x03 // DIGIT 2 */ #define DIGIT3 0x04 // DIGIT 3 */ #define DIGIT4 0x05 // DIGIT 4 */ #define DIGIT5 0x06 // DIGIT 5 */ #define DIGIT6 0x07 // DIGIT 6 */ #define DIGIT7 0x08 // DIGIT 7 */ #define DECODE 0x09 // DECODE MODE */ #define INTENS 0x0A // INTENSITY */ #define SCAN_L 0x0B // SCAN LIMIT */ #define SHUTDN 0x0C // SHUTDOWN */ #define D_TEST 0x0F // DISPLAY TEST */ #define SHUTDN_ON 0x00 // Display aus */ #define SHUTDN_OFF 0x01 // Display ein */ #define D_TEST_ON 0x01 // Display Test ein */ #define D_TEST_OFF 0x00 // Display Test aus */ //********************** globale Variablen *************************** unsigned char anzeige[4]; // Anzeigedaten BCD-Kodiert unsigned char bdata adr; // bitadressierbare Variable unsigned char bdata dat; // bitadressierbare Variable sbit adr0 = adr^0; sbit adr1 = adr^1; sbit adr2 = adr^2; sbit adr3 = adr^3; sbit adr4 = adr^4; sbit adr5 = adr^5; sbit adr6 = adr^6; sbit adr7 = adr^7; sbit dat0 = dat^0; sbit dat1 = dat^1; sbit dat2 = dat^2; sbit dat3 = dat^3; sbit dat4 = dat^4; sbit dat5 = dat^5; sbit dat6 = dat^6; sbit dat7 = dat^7; // Serielle Anschlussleitungen des MAX 7219 am 80535 µC // Werte müssen angepasst ggfsx werden !!! sbit CLOCK = P3^2; //0xB2; // Port 3.2 - INT0 sbit DATA_IN = P3^5; //0xB5; // Port 3.5 sbit LOAD = P3^4; //0xB4; // Port 3.4 ///************************* Funktionen ******************************** void MAX7219_send(unsigned char adress, unsigned char daten){ CLOCK = 0; DATA_IN = 0; LOAD = 0; adr = adress; // Adresse in bitadressierbare Variable speichern DATA_IN = adr7; // Adresse übertragen CLOCK = 1; CLOCK = 0; DATA_IN = adr6; CLOCK = 1; CLOCK = 0; DATA_IN = adr5; CLOCK = 1; CLOCK = 0; DATA_IN = adr4; CLOCK = 1; CLOCK = 0; DATA_IN = adr3; CLOCK = 1; CLOCK = 0; DATA_IN = adr2; CLOCK = 1; CLOCK = 0; DATA_IN = adr1; CLOCK = 1; CLOCK = 0; DATA_IN = adr0; CLOCK = 1; CLOCK = 0; dat = daten; // Datum in bitadressierbare Variable speichern DATA_IN = dat7; // Daten übertragen CLOCK = 1; CLOCK = 0; DATA_IN = dat6; CLOCK = 1; CLOCK = 0; DATA_IN = dat5; CLOCK = 1; CLOCK = 0; DATA_IN = dat4; CLOCK = 1; CLOCK = 0; DATA_IN = dat3; CLOCK = 1; CLOCK = 0; DATA_IN = dat2; CLOCK = 1; CLOCK = 0; DATA_IN = dat1; CLOCK = 1; CLOCK = 0; DATA_IN = dat0; CLOCK = 1; CLOCK = 0; LOAD = 1; // Übernahmeimpuls LOAD = 0; return; } void MAX7219_init(void){ unsigned int zeit; MAX7219_send(DECODE,0xFF); // Alle Anzeigen BCD Code B MAX7219_send(SCAN_L,0x02); // 4 Stellen anzeigen MAX7219_send(INTENS,0x0F); // Volle Helligkeit MAX7219_send(SHUTDN,SHUTDN_OFF); // Anzeige einschalten // Display-Test fr ca. 0,5 sec an MAX7219_send(D_TEST,D_TEST_ON); for (zeit = 30000; zeit > 0; zeit--); MAX7219_send(D_TEST,D_TEST_OFF); return; } //*********************** Hauptprogramm ****************************** void zeitschleife(char sekunden){ unsigned char m; unsigned long i; for(m=1;m<=sekunden;m++) for(i=0;i<=7141;i++); // Wert für ca. 1 Sekunde } void main(void){ unsigned char i, temp; MAX7219_init(); // MAX7219 initialisieren while(1){ for(i=0;i<=255;i++){ P1=i; anzeige[0] = i / 100; // Einer-Stelle ermitteln temp = i % 100; // in Anzeigenpuffer anzeige[1] = temp / 10; // Zehner-Stelle ermitteln anzeige[2] = temp % 10; // Hunderte-Stelle ermitteln MAX7219_send(DIGIT0,0x0f); MAX7219_send(DIGIT1,anzeige[0]); // Wert anzeigen MAX7219_send(DIGIT2,anzeige[1]); MAX7219_send(DIGIT3,anzeige[2]); zeitschleife(1); } } }
Also, ich hoffe euch reichen die Infos hier und hoffe ihr könnt mir helfen, ich bedanke mich schon mal
-
hi,
deine send-funktion sieht etwas komisch aus. auch sind da keine delays d.h. die clock-impulse sind vielleicht zu kurz? vielleicht hilft dir das weiter: http://www.hagi-online.org/picmicro/max7219.html
-
hm, na wirklich weiter hat mich das auch nich gebracht,die send funktion muss ja funktionieren, sonst würde er doch gar nichts anzeigen. aber die displays blinken ja (und wenn ich im code beim hauptprogramm in der 2. for-schleife die zahl verkleiner, dann leuchten sie auch konstant). eigentlich könnte ich doch einfach schreiben i=9; anstelle von der for-schleife, dann müsste er mir doch eigentlich einfach nur ne 9 ausgeben. aber eben, dann frag ich mich für was P1=i; gut sein soll, heißt das also, der wert der bei P1 anliegt, muss ja 0 oder 1 sein, ist i?
irgendwie is das komisch..
-
Ich habe jetzt noch mal rumprobiert und diesmal 3 Displays angeschlossen, komischerweise leuchtet jetzt bei jedem debug-start ein lämpchen kurz auf.
und bei jedem neustart das nächste. ich hoffe ich bin dem ganzen schon näher, denn der max7219 soll die anzeigen ja nacheinander ansteuern, das tut er ja, aber jetzt nur noch ein kurzes blinken und vorallem leuchten alle 7 segmente...also, ich glaube anfangs habe ich die ports falsch angeschlossen, deswegen auch dieses ständige blinken, aber wie bekomme ich jetzt das hin, dass die anzeigen mir die werte von 0-255 ausgeben?
hoffe ihr wisst rat... danke
-
ok, es hat sich alles geklärt
der fehler war, dass das MCU-board und der Maxbaustein nicht mit der selben Masse bzw Spannung verbunden waren.
Aber trotzdem danke für deine Hilfe net!
bis dann
-
Bocky schrieb:
der fehler war, dass das MCU-board und der Maxbaustein nicht mit der selben Masse bzw Spannung verbunden waren.
tja, wo der lötkolben gefragt ist kann software selten was ausrichten
Bocky schrieb:
Aber trotzdem danke für deine Hilfe net!
kein problem. hast es ja selber hingekriegt...