Forum: Mikrocontroller und Digitale Elektronik MAX7219 Ansteuerung


von bän (Gast)


Lesenswert?

Hi ich habe Probleme den MAX7219 anzusteuern. Ich habe mir eine LED 
Matrix gebaut und versuche gerade die Matrix über den IC anzusteuern.

Für die Ansteuerung nehme ich einen Controller aus der 8051er Reihe. 
Hier ist das Programm welches ich für die Ansteuerung geschrieben habe:
1
#include <reg517a.h>
2
3
sbit CLOCK = P4 ^ 0x00;
4
sbit DIN = P4 ^ 0x01;
5
sbit LOAD = P4 ^ 0x02;
6
7
void sendData(unsigned char reg_adr, unsigned char daten);
8
9
void main(void)
10
{
11
  LOAD = 1;
12
  CLOCK = 0;
13
  DIN = 1;
14
  
15
  sendData(0x09, 0x00); // No Decode Mode
16
  sendData(0x0A, 0x0B); //mittlere Helligkeit einstellen
17
  sendData(0x0B, 0x07); //max. Scan Limit
18
  sendData(0x0C, 0x00); //Normal Operation
19
  sendData(0x0f, 0x00); //Test Normal Operation
20
21
  sendData(0x0C, 0x01);
22
23
  sendData(0x01, 0x00);
24
  sendData(0x02, 0x00);
25
  sendData(0x03, 0x00);
26
  sendData(0x04, 0x00);
27
  sendData(0x05, 0x00);
28
  sendData(0x06, 0x00);
29
  sendData(0x07, 0x00);
30
31
  while(1);
32
}
33
34
void sendData(unsigned char reg_adr, unsigned char daten)
35
  { 
36
  unsigned char Teiler = 128;      // Hilfsvariable zum maskieren der 8 Bit
37
  unsigned char i;          // Schleifenvariable
38
    LOAD = 0;              // Startsignal der seriellen Datenübertragung zum MAX7219!
39
  for(i=1; i<=8; i++)          // Schleife zum seriellen Ausgeben der 8 Adress-Bits!
40
    {
41
    if(reg_adr & Teiler) DIN = 1;  // Entsprechendes Bit mit Hilfe der bitweisen UND-Verknüpfung 
42
      else DIN = 0;          // maskieren und auf der DIN-Leitung ausgeben!
43
    CLOCK = 1;            // Takt auf Taktleitung ausgeben, also zuerst Taktleitung
44
    CLOCK = 0;            // auf log. 1, danach wieder auf log. 0 setzen!
45
    Teiler = Teiler / 2;      // Hilfsvariable für nächsten Schleifendurchlauf vorbereiten!
46
    }
47
  Teiler = 128;            // Hilfsvariable wieder auf Startwert setzen!
48
  for(i=1; i<=8; i++)          // Schleife zum seriellen Ausgeben der 8 Daten-Bits!
49
    {
50
    if(daten & Teiler) DIN = 1;    // Entsprechendes Bit mit Hilfe der bitweisen UND-Verknüpfung 
51
      else DIN = 0;          // maskieren und auf der DIN-Leitung ausgeben!
52
    CLOCK = 1;            // Takt auf Taktleitung ausgeben, also zuerst Taktleitung
53
    CLOCK = 0;            // auf log. 1, danach wieder auf log. 0 setzen!
54
    Teiler = Teiler / 2;      // Hilfsvariable für nächsten Schleifendurchlauf vorbereiten!
55
    }
56
  DIN = 0;              // Serielle Datenleitung auf log. 0!
57
  LOAD = 1;              // Stoppbedingung der seriellen Datenübertragung zum MAX7219!
58
  }

Durch Recherchen habe ich erfahren wie ich diesen IC Initialisieren 
muss. Ich hoffe ich habe soweit alles richtig gemacht. Da die LEDs 
immernoch permanent leuchten weiß ich nicht mehr weiter. Eigentlich habe 
ich sie per Programmcode ausgeschaltet.

Gruß
bän

von Vorsicht (Gast)


Lesenswert?

Der MAX7219 liest die Daten auf die poitive Clock Flanke ein.

Du erzeugst aber nach dem Ausgeben der Daten eine negative Flanke.

Ich schreibe so:
1
void max7219WriteReg( UInt8 reg, UInt8 value ) {
2
3
  UInt8 mask;
4
  
5
  //printf( "Register %02X\n", reg );
6
  //printf( "Value    %02X\n", value );
7
  
8
  PDR5_P50     =    0;  // load low
9
  
10
  mask = 0x80;
11
  while ( mask ) {
12
    PDR4_P47     =    0;  // clock low
13
    if ( mask & reg ) {
14
      PDR4_P46     =    1;  // data high
15
      //printf( "1", value );
16
    }
17
    else {
18
      PDR4_P46     =    0;  // data low
19
      //printf( "0", value );
20
    }
21
    PDR4_P47     =    1;  // clock high
22
    mask >>= 1;
23
  }
24
  //printf( "\n", value );
25
  
26
  mask = 0x80;
27
  while ( mask ) {
28
    PDR4_P47     =    0;  // clock low
29
    if ( mask & value ) {
30
      PDR4_P46     =    1;  // data high
31
      //printf( "1", value );
32
    }
33
    else {
34
      PDR4_P46     =    0;  // data low
35
      //printf( "0", value );
36
    }
37
    PDR4_P47     =    1;  // clock high
38
    mask >>= 1;
39
  }
40
  //printf( "\n", value );
41
  
42
  PDR5_P50     =    1;  // load high
43
  PDR4_P46     =    0;  // data low
44
  PDR4_P47     =    0;  // clock low
45
  
46
}

Damit klappt es bei mir wunderbar.

Gruss

von Peter D. (peda)


Lesenswert?

1
void displaywrite( uint dc )
2
{
3
  uchar i = 12;
4
  do{
5
    DISDAT = dc & 0x0800;
6
    dc <<= 1;
7
    DISCLK = 1;
8
    DISCLK = 0;
9
  }while( --i );
10
  DISDAT = 0;
11
  DISSTB = 1;
12
  DISSTB = 0;
13
}
14
15
16
void displayinit( void )
17
{
18
  DISCLK = 0;
19
  DISSTB = 0;
20
  displaywrite( 0xF00 );                // Testmode off
21
  displaywrite( 0x900 );                // Decode off
22
  displaywrite( 0xB07 );                // 8 Digits
23
  displaywrite( 0xC01 );                // Display on
24
  displaywrite( 0xA00 | BRIGHT );       // Brightness
25
}


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.