7 Segment Ansteuerung mit MAX7221

Gast #773184
Lesenswert?

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
Gast #773221
Lesenswert?

Bzw. Noch ne Frage, im Datenblatt von dem ITS4880R steht, dass Vbb an 
TAB angeschlossen wird? Wo ist das? Ich hab jetzt gedacht, das ist die 
kleine Platte die er unten dran hat (sieht aus wie ein Kühlkörper).

Alex
Gast #773350
Lesenswert?

Hab das Programm jetzt nochmal vereinfacht. Ich will einfach am ersten 
Segment eine 7 anzeigen lassen.
1
#include <avr/io.h>
2
int main( void ) {
3
  unsigned char loop, mask;
4

5
  while ( 1 ) {
6
    PORTB |= ( 1 << PB4 );
7
    
8
    for (loop = 0, mask = 0x80; loop < 16; loop++, mask = mask >> 1) {
9
        PORTB &= ~ ( 1 << PB7 );
10
    
11
        if ( 0x0107 & mask )
12
            PORTB |= ( 1 << PB5 );
13
        else
14
            PORTB &= ~ ( 1 << PB5 );
15
         PORTB |= ( 1 << PB7 );
16
    }
17
  
18
    PORTB &= ~ ( 1 << PB7 );
19
    PORTB &= ~ ( 1 << PB4 );  
20
  }
21

22
  return 0;
23
}
#774495
Lesenswert?

das hier ist Blödsinn, zuviel optimiert:
1
    for (loop = 0, mask = 0x80; loop < 16; loop++, mask = mask >> 1) {
mask ist nur 8Bit breit, das 16 mal zu schieben ist nicht...

übrigens kannst du für die 8Bit schleife "loop" einsparen:
1
  for(mask = 0x80; mask; mask = mask >> 1) {
Gast #774584
Lesenswert?

@ Niels Hüsken mag sein, dass ich was falsch gemacht habe, will mich 
dafür auch entschuligen, nur blöd wenn ich ned weiß was :-/. Wenn man 
einen Menschen ned auf seine Fehler hinweist wirds oft schwer diese 
Fehler zu korrigieren.

@ Ernst ja hab ich schon geändert. Es liegt aber an was anderem :-/. Ich 
scan mal mein Schaltplan ein, vielleicht hilft das ja etwas. Und evt. 
noch Ausdrucke vom Oszilloskop. Hab mal die Ausgänge vom Mikrokontroller 
aufgenommen.

Grüße Alex
Gast #821846
Lesenswert?

1. Wenn ich deinen Quellcode so sehe, frage ich mich, ob deine 
Entwicklungsumgebung dir irgendwie verbietet das Zeichen "/" zweimal 
hintereinander zu benutzen bzw. es dir nur in begrenztem Umfang zur 
Verfügung stellt. Soll heißen: Du solltest deinen Code mal ein wenig 
kommentieren. Hier macht sich sicher kaum einer die Mühe für dich, sich 
dadurch zu quälen.

2. Eine Sache, die mir beim Blick über den Quellcode aufgefallen ist. 
Was denkst du machen diese Codezeilen?
1
for ( loop = 0; loop < 4; loop++ ) {  // 4 mal um Fehler zu eliminieren
2
    for (loop = 1; loop <= 2; loop++ )
3
        segAusgabe( loop, 0x0A );   // "-" auf allen Anzeigen anzeigen
4
}

Ich würde es mal Endlosschleife nennen, denn dein loop wird die 
Abbruchbedingung der äußeren Schleife wohl nie erreichen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren