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 fr 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...


Anmelden zum Antworten