Forum: Mikrocontroller und Digitale Elektronik MAX7219 geht bei manchen Zeichen aus.


von Robinayor_ (Gast)


Lesenswert?

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
}

von Michael U. (amiga)


Lesenswert?

Hallo,

hab nur flüchtig drübergeschaut, aber LOAD muß während der letzten 
H-Phase bereits auf H gehen.
Ich finde gerade meinen MAX7219-ASM-Code nicht wieder... :-((

Gruß aus Berlin
Michael

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.