Hiho Leute,
ich hab heute endlich mal den MAX7219 in Angriff nehmen wollen, das
blieb aber nur teilweise von Erfolg.
Prinzipiell funktioniert mein kleiner Test-Code, das heißt die (meisten)
Ziffern werden wie gewünscht angezeigt. Bei den Ziffern 0, 6, 8, 9 und
vielleicht noch anderen, geht die 7-Segmentanzeige jedoch jedes mal,
immer wieder aus und der MAX ist nur durch nen kompletten reset wieder
aufzuwecken.
Könnt Ihr euch das irgendwie erklären? Ich habe ihn nach dem offenbar
durchaus erprobtem Schema aus dem Datenblat angeschlossen, mit dem Scope
sieht auch das Datenpaket der Ziffern 0, 6, 8 und 9 gut aus.
Das einzige was mir aufgefallen ist, das 0, 6, 8 und 9 als einzige
Zeichen zwischen 0-9 weniger als 2 ausbleibende Segmente haben. Könnte
das damit zusammenhängen? Ich versorge den MAX7219 mit 5V vom
Pollin-Atmel-Board..
Anbei nochmal der (ganz ganz hässliche, vorübergehende) Code. Er zählt
unten 4, 1, 2, 3, 4, 5, 7 - bei der 9 geht er dann aus. Auch wenn
dannach noch andere Ziffern kommen ist das ganze reproduzierbar. Den
Chip habe ich auch schonmal getauscht, nen zweiten habe ich da weil ich
Daisychaining geplant habe - der zeigt aber das gleiche verhalten.
Wäre echt super dankbar wenn jemand nen Tipp/Hinweis hat, bin schon seit
mind. 6 Stunden dabei das blöde Problem zu debuggen. Ohne Lösung bisher.
1 | #define F_CPU 8000000UL
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 | #define PDIN PC1
|
7 | #define LOAD PC2
|
8 | #define CLK PC3
|
9 |
|
10 | void write_max7219(char adresse,char wert) {
|
11 | PORTC |= (1<<PC0);
|
12 | //_delay_us(5);
|
13 | char x;
|
14 | // Bevor die Daten übertragen werden, wird zuerst der PIN LOAD auf LOW gesetzt.
|
15 | // Die Daten beginnen mit dem Bit D15, also MSB
|
16 | PORTC &= ~(1<<LOAD);
|
17 | //_delay_us(3);
|
18 |
|
19 | // Die Datenbits D15-D12 werden übertragen
|
20 | // Da diese nicht wichtig sind, wird eine 0 übermittelt
|
21 | for(x=0; x<4; x++){
|
22 | PORTC &= ~(1<<PDIN);
|
23 | //_delay_us(3);
|
24 | PORTC |= (1<<CLK);
|
25 | //_delay_us(3);
|
26 | PORTC &= ~(1<<CLK);
|
27 | //_delay_us(3);
|
28 | }
|
29 | // Die Datenbits D11-D8 beinhalten die Registeradresse des MAX7219
|
30 | for(x=4;x>0;x--){
|
31 | /*if(bit_test(adresse,x-1)){*/
|
32 | if(adresse & (1<<(x-1))){
|
33 | PORTC |= (1<<PDIN);
|
34 | //_delay_us(3);
|
35 | }else{
|
36 | PORTC &= ~(1<<PDIN);
|
37 | //_delay_us(3);
|
38 | }
|
39 | PORTC |= (1<<CLK);
|
40 | //_delay_us(3);
|
41 | PORTC &= ~(1<<CLK);
|
42 | //_delay_us(3);
|
43 | }
|
44 |
|
45 | // Die Datenbits D7-D0 sind die Daten an den MAX7219
|
46 | for (x=8;x>0;x--){
|
47 | /*#if (bit_test(wert,x-1)){*/
|
48 | if(wert & (1<<(x-1))){
|
49 | PORTC |= (1<<PDIN);
|
50 | //_delay_us(3);
|
51 | }else{
|
52 | PORTC &= ~(1<<PDIN);
|
53 | //_delay_us(3);
|
54 | }
|
55 | PORTC |= (1<<CLK);
|
56 | //_delay_us(3);
|
57 | PORTC &= ~(1<<CLK);
|
58 | //_delay_us(3);
|
59 | }
|
60 | // Zum Schluß wird der PIN LOAD auf HIGH gesetzt, damit ist die
|
61 | // Datenübertragung zu Ende
|
62 | PORTC |= (1<<LOAD);
|
63 | //_delay_us(3);
|
64 | PORTC &= ~(1<<PC0);
|
65 | //_delay_us(3);
|
66 | }
|
67 |
|
68 | int main(void){
|
69 | /* Disable JTAG */
|
70 | MCUCSR |= (1<<JTD);
|
71 | MCUCSR |= (1<<JTD);
|
72 |
|
73 | DDRC = 0xff;
|
74 | PORTC = 0x00;
|
75 | write_max7219(0x00,0x00); // 1 Digit
|
76 | write_max7219(0x0c,0x01); // Kein shutdown
|
77 | write_max7219(0x0f,0x00); // Kein Displaytest
|
78 | write_max7219(0x09, 0xff); // Decodemode für alle Digits
|
79 | write_max7219(0x0a,0x02); // Die Helligkeit der Digits wird hier eingestelltv
|
80 |
|
81 | while(1){
|
82 | int i;
|
83 | write_max7219(0x01, 0x04);
|
84 | for(i=0; i<49; i++)
|
85 | _delay_ms(50);
|
86 | write_max7219(0x01, 0x01);
|
87 | for(i=0; i<49; i++)
|
88 | _delay_ms(50);
|
89 | write_max7219(0x01, 0x02);
|
90 | for(i=0; i<49; i++)
|
91 | _delay_ms(50);
|
92 | write_max7219(0x01, 0x03);
|
93 | for(i=0; i<49; i++)
|
94 | _delay_ms(50);
|
95 | write_max7219(0x01, 0x04);
|
96 | for(i=0; i<49; i++)
|
97 | _delay_ms(50);
|
98 | write_max7219(0x01, 0x05);
|
99 | for(i=0; i<49; i++)
|
100 | _delay_ms(50);
|
101 | write_max7219(0x01, 0x07);
|
102 | for(i=0; i<49; i++)
|
103 | _delay_ms(50);
|
104 | write_max7219(0x01, 0x03);
|
105 | for(i=0; i<49; i++)
|
106 | _delay_ms(50);
|
107 |
|
108 | }
|
109 | return 0; /* Never reached */
|
110 | }
|