Forum: Mikrocontroller und Digitale Elektronik 7 Segment Ansteuerung mit MAX7221


von Alex (Gast)


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

von Alex (Gast)


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

von Alex (Gast)


Lesenswert?

Habe es gerade getestet, also der Vbb Anschluss des IST4880R ist an dem 
kleinen Kühlkörper (TAB).

Ich messe an den PINS SEGA-SEGG des MAX7221 nur eine Spannung von ca. 50 
- 100 mV. Es sollten aber 5 V anliegen.

Alex

von Alex (Gast)


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
}

von Niels H. (monarch35)


Lesenswert?

Hast du dich noch nicht gefragt, warum dir keiner Helfen kann?

Kleiner Tipp: es liegt nicht daran, das niemand Hilfsbereit wäre...

von Alex (Gast)


Lesenswert?

Najo,
Ich denke, dass ich 3 mal hintereinander gepostet habe :-/. Ich muss 
mich mal anmelden, dass ich meine Posts editieren kann.

Gruß Alex

von Niels H. (monarch35)


Lesenswert?

Nope, daran liegts auch nicht...

....komm, drei versuche haste noch.

von Εrnst B. (ernst)


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) {

von Alex (Gast)


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

von Thorsten (Gast)


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.

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.