Max7219 - LED Matrix 8x8 (4 Stk.)

Hallo Community,

hat jemand hier schon Erfahrungen mit den LED Anzeigen machen können?
Ich habe diese Boards vom freundlichen bekommen ->>> LINK <<

Nun versuche ich vergebens mal etwas anzeigen zu lassen. Mal funktioniert es mal funktioniert es nicht richtig..

Das ganze habe ich auf einem ESP32C3 (SuperMini Board) getestet.
Sicherheitshalber habe ich an die I/O´s LED´s angeschlossen um sicher zu gehen das sie auch das tun was ich verlange :stuck_out_tongue:

Hat jemand eine Idee woran das liegen könnte?

enum _MAX7219_REGS
{
    NO_OP,
    DIGIT_0,
    DIGIT_1,
    DIGIT_2,
    DIGIT_3,
    DIGIT_4,
    DIGIT_5,
    DIGIT_6,
    DIGIT_7,
    DECODE_MODE,
    INTENSITY,
    SCAN_LIMIT,
    SHUTDOWN,
    DISPLAY_TEST = 0x0F
};

enum _MAX7219_SHUTDOWN
{
    SHUTDOWN_MODE,
    NORMAL_OPERATION
};


enum _MAX7219_DECODE_MODE
{
    MODE_1,
    MODE_2,
    MODE_3 = 0x0F,
    MODE_4 = 0xFF
};


enum _MAX7219_INTENSITY
{
    INTENSITY_1_32,
    INTENSITY_3_32,
    INTENSITY_5_32,
    INTENSITY_7_32,
    INTENSITY_9_32,
    INTENSITY_11_32,
    INTENSITY_13_32,
    INTENSITY_15_32,
    INTENSITY_17_32,
    INTENSITY_19_32,
    INTENSITY_21_32,
    INTENSITY_23_32,
    INTENSITY_25_32,
    INTENSITY_27_32,
    INTENSITY_29_32,
    INTENSITY_31_32,
};


enum _MAX7219_SCAN_LIMIT
{
    SL_DIGIT_0,
    SL_DIGIT_0_1,
    SL_DIGIT_0_1_2,
    SL_DIGIT_0_1_2_3,
    SL_DIGIT_0_1_2_3_4,
    SL_DIGIT_0_1_2_3_4_5,
    SL_DIGIT_0_1_2_3_4_5_6,
    SL_DIGIT_0_1_2_3_4_5_6_7,
};

#define MAX7219_BUILD_WORD(addr, cmd)     (uint16_t)( ( addr << 8 ) | cmd )
#define MAX7219_GPIO_DOUT_PIN             0
#define MAX7219_GPIO_CS_PIN               1
#define MAX7219_GPIO_CLK_PIN              2
#define DISPLAY_SIZE                      4

struct Digit
{
    uint8_t Addr;
    uint8_t Data[8];
};



void setup() {

  GPIO_FUNC0_OUT_SEL_CFG_REG |= 0x80;
  GPIO_FUNC1_OUT_SEL_CFG_REG |= 0x80;
  GPIO_FUNC2_OUT_SEL_CFG_REG |= 0x80;
  GPIO_FUNC8_OUT_SEL_CFG_REG |= 0x80;

  GPIO_ENABLE_REG |= (1<<0 | 1<<1 | 1<<2 | 1<<8);

  Max7219_Init();

}


void loop() {

  test();

}

void Max7219_CS_High()
{
  GPIO_OUT_REG |= 1<<MAX7219_GPIO_CS_PIN;
}

void Max7219_CS_Low()
{
  GPIO_OUT_REG &= ~1<<MAX7219_GPIO_CS_PIN;
}

void Max7219_Send( uint16_t Data )
{
    for ( uint8_t i = 0 ; i < 16; i++ )
    {
        GPIO_OUT_REG |= 1<<MAX7219_GPIO_CLK_PIN;
        
        if ( Data & 0x8000 )
        {
            GPIO_OUT_REG |= 1<<MAX7219_GPIO_DOUT_PIN;
        }
        else
        {
            GPIO_OUT_REG &= ~1<<MAX7219_GPIO_DOUT_PIN;
        }

        GPIO_OUT_REG &= ~1<<MAX7219_GPIO_CLK_PIN; 

        Data <<= 1;  
    }
}

void Max7219_Init()
{
  struct Digit Cnfg[4];

  Cnfg[0].Addr = DECODE_MODE;
  Cnfg[0].Data[0] = MODE_1;

  Cnfg[1].Addr = INTENSITY;
  Cnfg[1].Data[0] = INTENSITY_1_32;

  Cnfg[2].Addr = SCAN_LIMIT;
  Cnfg[2].Data[0] = SL_DIGIT_0_1_2_3_4_5_6_7;

  Cnfg[3].Addr = SHUTDOWN;
  Cnfg[3].Data[0] = NORMAL_OPERATION;

  Cnfg[4].Addr = DISPLAY_TEST;
  Cnfg[4].Data[0] = 0;

  
  for ( uint8_t x = 0 ; x < 4 ; x++ )
  {
      Max7219_CS_Low();
      Max7219_Send( MAX7219_BUILD_WORD( Cnfg[x].Addr , Cnfg[x].Data[0] ) );
      Max7219_CS_High();
  }
  

  for (uint8_t x = 0 ; x < 8 ; x++ )
  {
    Cnfg[x].Addr = DIGIT_0 + x;

    for (uint8_t y = 0 ; y < 8 ; y++ )
    {
      Cnfg[x].Data[y] = 0xc3;

      Max7219_CS_Low();
      Max7219_Send( MAX7219_BUILD_WORD( Cnfg[x].Addr, Cnfg[x].Data[y] ) );
      Max7219_CS_High();
    }
    
  }

}

void Max7219_Dsp_Test_On()
{
  Max7219_CS_Low();
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x01) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x01) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x01) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x01) );
  Max7219_CS_High();  
}

void Max7219_Dsp_Test_Off()
{
  Max7219_CS_Low();
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x00) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x00) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x00) );
  Max7219_Send( MAX7219_BUILD_WORD( DISPLAY_TEST, 0x00) );
  Max7219_CS_High();  
}

void test()
{
  struct Digit Cnfg[4];

  for (uint8_t x = 0 ; x < 8 ; x++ )
  {
    Cnfg[x].Addr = DIGIT_0 + x;

    Max7219_CS_Low();
    for (uint8_t y = 0 ; y < 8 ; y++ )
    {
      Cnfg[x].Data[y] = 0x00;
      Max7219_Send( MAX7219_BUILD_WORD( Cnfg[x].Addr, Cnfg[x].Data[y] ) );
    }
    Max7219_CS_High();
  }
}

Verwenden Sie Worte.

Verwenden Sie auch den "common" Pin der Matrizen richtig? Liefern Sie ausreichend Strom?

Es ist ein fertiges PCB.
Ich habe lediglich: SCK, DATA, CS angeschlossen.

This is an English-only section of the forum. All posts and all replies should be in English. I will move this topic to the appropriate section for German. Please read the forum guide in the sticky posts before more rules get broken.

Beschreiben Sie das gewünschte Ergebnis und das beobachtete Ergebnis.

Describe your desired result and your observed result.

5V und GND ?

Hehe, klar sonst würde ich keine LEDs von meinen Daten leuchten sehen..

Hier könnte nicht die Lösung versteckt sein?

Grüße Uwe

ist ja eine interessante Übung das ganze SPI-Bus Bitbanging zu Fuß zu Programmieren.

Ich benutze dafür fertige Bibliotheken.

Hier ein Demo-Code der von dem Beispiel auf das uwefed verlinkt hat abgeleitet ist.

Seltsamerweise werden die Buchstaben seitenverkehrt angezeigt.
Da muss man den SPI-Bus des ESP32-C3 wohl irgendwie umkonfigurieren.

Es tut sich aber auf jedenfall etwas auf dem Display

Für das Teil gibt es eine prima LIBs.

Beachte das du bei den Beispielen max-device auf 4 setzen musst, da dein Block aus 4 Teilen besteht. Die LED-Blöcke kann man nämlich verbinden und durchadressieren.

Du musst in der Ini der Libs nur einstellen das du 4 Module hast.

Fertig ist.

Gruß

Pucki

Mir fehlt leider eine Glaskugel, daher kann ich nur raten, daß es sich um einen Wackelkontakt oder eine mangelnde Stromversorgung handelt. Vermutlich benötigst Du ein eigenes Netzteil.

Nein, mit dem SPI-Bus hat das nichts zu tun, sondern mit einer unterschiedlichen Verdrahtung der Hardware, siehe nächsten Link.

Zusätzlich eventuell noch den Hardwaretyp:

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

jepp :wink:

Gruß

Pucki

Also diese Dokumentationen sind unvergleichlich ... --- ... knapp.
Wo um alles in der Welt wird jetzt dieser enumeration-type eingestellt ???

Wieso muss man dazu jetzt die lib auf "moduleType_t" durchsuchen?
Wieso können die nicht einfach ein paar Zeilen dazu schreiben wie und wo man das macht?

// hardware-types
// GENERIC_HW 	Use 'generic' style hardware modules commonly available.
// FC16_HW 	    Use FC-16 style hardware module.
// PAROLA_HW    Use the Parola style hardware modules.
// ICSTATION_HW Use ICStation style hardware module.

#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW //FC16_HW

Ich konnte es selbst lösen.
Es lag einfach daran das ich zu viele Bytes gesendet hatte.
Danke an alle :+1:

Poste als Dankeschön noch den funktionierenden Sketch als Coe-section und markiere den thread als gelöst.

ESP32C3_GPIO.ino (17,9 KB)
Anbei der Code.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.