Hallo, Ich will mit dem MAX7221 8 7 Segment Anzeigen ansteuern. Als Mikroprozessor verwende ich einen ATmega162. Da ich sehr große Anzeigen ansteuern will habe ich zwischen dem MAX 7221 und den 7 Segment Anzeigen noch einen ITS4880R von Infineon eingebaut. Die Schaltung dürfte soweit stimmen. Programm: max7221.c:
1 | #include "max7221.h" |
2 | |
3 | int main( void ) { |
4 | segInit (); |
5 | |
6 | while ( 1 ) |
7 | ;
|
8 | |
9 | return 0; |
10 | }
|
11 | |
12 | void segWrite ( unsigned char data_out ) { |
13 | unsigned char loop, mask; |
14 | |
15 | for (loop = 0, mask = 0x80; loop < 8; loop++, mask = mask >> 1) { |
16 | PORT_SCK &= ~ ( 1 << PIN_SCK ); |
17 | |
18 | if ( data_out & mask ) |
19 | PORT_MOSI |= ( 1 << PIN_MOSI ); |
20 | else
|
21 | PORT_MOSI &= ~ ( 1 << PIN_MOSI ); |
22 | PORT_SCK |= ( 1 << PIN_SCK ); |
23 | }
|
24 | |
25 | PORT_SCK &= ~ ( 1 << PIN_SCK ); |
26 | }
|
27 | |
28 | |
29 | void segAusgabe ( unsigned char address, unsigned char data ) { |
30 | PORT_CS |= ( 1 << PIN_CS ); // Chip Select |
31 | segWrite( address ); |
32 | segWrite( data ); |
33 | PORT_CS &= ~ ( 1 << PIN_CS ); // Chip Unselect |
34 | }
|
35 | |
36 | void segInit ( void ) { |
37 | unsigned char loop; |
38 | |
39 | DDR_SCK |= ( 1 << PIN_SCK ); |
40 | DDR_MOSI |= ( 1 << PIN_MOSI ); |
41 | DDR_CS |= ( 1 << PIN_CS ); |
42 | |
43 | for ( loop = 0; loop < 4; loop++ ) { // 4 mal um Fehler zu eliminieren |
44 | segAusgabe( 0x0c, 0x01 ); // Shutdown aus |
45 | segAusgabe( 0x09, 0xff ); // Decode-Mode: alles auf Code B |
46 | segAusgabe( 0x0a, 0x01 ); // Intensität |
47 | segAusgabe( 0x0b, 0x01 ); // 6 digits |
48 | }
|
49 | |
50 | for ( loop = 0; loop < 4; loop++ ) { // 4 mal um Fehler zu eliminieren |
51 | for (loop = 1; loop <= 2; loop++ ) |
52 | segAusgabe( loop, 0x0A ); // "-" auf allen Anzeigen anzeigen |
53 | }
|
54 | }
|
max7221.h:
1 | #ifndef MAX7219_H
|
2 | #define MAX7219_H
|
3 | |
4 | #include <avr/io.h> |
5 | |
6 | #define PORT_SCK PORTB // Sck Port
|
7 | #define DDR_SCK DDRB // Sck DDR
|
8 | #define PIN_SCK PB7 // Sck Pin
|
9 | |
10 | #define PORT_MOSI PORTB // MOSI Port
|
11 | #define DDR_MOSI DDRB // MOSI DDR
|
12 | #define PIN_MOSI PB5 // MOSI Pin
|
13 | |
14 | #define PORT_CS PORTB // CS Port
|
15 | #define DDR_CS DDRB // CS DDR
|
16 | #define PIN_CS PB4 // CS Pin
|
17 | |
18 | void segWrite ( unsigned char data_out ); |
19 | void segAusgabe ( unsigned char address, unsigned char data ); |
20 | void segInit ( void ); |
21 | #endif
|
Es leuchtet nichts auf. Ich messe auch keinen Stromam Ausgang meines ITS4880R. Grüße Alex