Forum: Mikrocontroller und Digitale Elektronik MAX7219 programmier problem


von jeronimo (Gast)


Lesenswert?

Hallo,

ich habe leider ein problem mit dem Programieren meines MAX7219 über 
einen Atmega32.

Ich habe zwei Max7219 Kaskadiert und nach mehrmaligem kontrollieren 
korrekt angeschlossen.

Die Ports lassen sich allesammt beschalten, also auf 0 oder 1 setzen 
(nachgemessen).

Bin schon seit Tagen am suchen und ausprobieren.Verweifel.

Ich will die beiden erstmal nur Initialisieren.Ob sie ansprechen sieht 
man ja wenn ich shutdown an bzw. aus mache.

Achja angeschlossen sind je 6 7-Segmentanzeigen, die ich auch schon 
einzeln (mit einem max verbaut) ansprechen konnte.

Vielleicht kann mir jemand von euch helfen.

Hier der Quellcode

1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
#define NOOP    0x00
6
#define DIGIT_0    0x01
7
#define DIGIT_1    0x02
8
#define DIGIT_2    0x03
9
#define DIGIT_3    0x04
10
#define DIGIT_4    0x05
11
#define DIGIT_5    0x06
12
#define DEC_MOD    0x09
13
#define INTENS    0x0A
14
#define SCAN_LIM  0x0B
15
#define SHUTDOWN  0x0C
16
#define DSP_TEST  0x0F
17
#define max_load_0  PORTB &=~(1 << PB1)
18
#define max_load_1  PORTB |= (1 << PB1)
19
#define  clock_0    PORTB &=~(1 << PB7)
20
#define  clock_1    PORTB |= (1 << PB7)
21
#define  din_0    PORTB &=~(1 << PB5)
22
#define  din_1    PORTB |= (1 << PB5)
23
24
25
26
27
28
29
// Unterprogramme anmelden
30
void port(void);
31
void max_init(void);
32
void max_uebertragung(char Adr1, char Data1, char Adr2, char Data2);
33
34
void port(void)    // alle Ports deklarieren
35
{
36
    DDRA = 0xFF;                    // Alle Pins des Port A als Ausgang deklarieren
37
    DDRA &= ~((1<<PA0)|(1<<PA5)|(1<<PA6)|(1<<PA7));    // Eingänge des Port A deklarieren
38
    PORTA |= (1<<PA0);                  // Interne Pull-Up Widerstände einschalten
39
    
40
    DDRB = 0xFF;                    // Alle Pins des Port B als Ausgang deklarieren
41
    DDRB &= ~(1<<PB6);                  // Eingang des Port B deklarieren
42
    
43
    DDRC = 0xFF;                    // Alle Pins des Port C als Ausgang deklarieren
44
    DDRC &= ~(1<<PC4);                  // Eingang des Port C deklarieren
45
    
46
    DDRD = 0xFF;                    // Alle Pins des Port D als Ausgang deklarieren
47
}
48
49
int main(void)     // Hauptprogramm
50
{
51
  port();      // port aufrufen
52
  max_init();    // max_init aufrufen
53
}    
54
55
56
57
void max_init(void)
58
{
59
  // LOAD anfangs auf 1 setzen
60
  max_load_1;
61
  // clock anfangs auf 1 setzen
62
  clock_1;
63
64
    // Shutdown an beide MAX7219 senden
65
    max_uebertragung(SHUTDOWN, 0x00, SHUTDOWN, 0x00);
66
67
    // Intensität an beide MAX7219 senden
68
    max_uebertragung(INTENS, 0x0F, INTENS, 0x0F);
69
70
  // Decode Mode aus an beide MAX7219 senden
71
  max_uebertragung(DEC_MOD, 0x00, DEC_MOD, 0x00);
72
73
    // Scanlimit an beide MAX7219 senden
74
    max_uebertragung(SCAN_LIM, 0x05, SCAN_LIM, 0x05);
75
76
    // Shutdown aus an beide MAX7219 senden
77
    max_uebertragung(SHUTDOWN, 0x01, SHUTDOWN, 0x01);
78
79
    // Displaytest aus an beide MAX7219 senden
80
  max_uebertragung(DSP_TEST, 0x00, DSP_TEST, 0x00);
81
82
}
83
84
void max_uebertragung(char Adr1, char Data1, char Adr2, char Data2)
85
{
86
    char i, maske;
87
88
  max_load_0;
89
  maske = 0x80;
90
91
    for (i=0; i<8; i++)
92
    {
93
        clock_0;
94
        if ((maske & Adr1) !=0)
95
    {
96
      din_1;
97
    }
98
    else
99
    {
100
      din_0;
101
    }
102
103
        // Takt erzeugen
104
        clock_1;
105
        // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
106
        maske = maske >> 1;
107
    }
108
109
  maske = 0x80;
110
111
    for (i=0; i<8; i++)
112
    {
113
        clock_0;
114
        if ((maske & Data1) !=0)
115
    {
116
      din_1;
117
    }
118
    else
119
    {
120
      din_0;
121
    }
122
123
        // Takt erzeugen
124
        clock_1;
125
        // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
126
        maske = maske >> 1;
127
    }
128
129
  for (i=0; i<8; i++)
130
    {
131
        clock_0;
132
        if ((maske & Adr2) !=0)
133
    {
134
      din_1;
135
    }
136
    else
137
    {
138
      din_0;
139
    }
140
141
        // Takt erzeugen
142
        clock_1;
143
        // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
144
        maske = maske >> 1;
145
    }
146
147
  for (i=0; i<8; i++)
148
    {
149
        clock_0;
150
        if ((maske & Data2) !=0)
151
    {
152
      din_1;
153
    }
154
    else
155
    {
156
      din_0;
157
    }
158
159
        // Takt erzeugen
160
        clock_1;
161
        // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
162
        maske = maske >> 1;
163
    }
164
  max_load_1;
165
}

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.