mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7 Segment Ansteuerung mit MAX7221


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "max7221.h"

int main( void ) {
  segInit ();

  while ( 1 )
    ;
  
  return 0;
}

void segWrite ( unsigned char data_out ) {
  unsigned char loop, mask;
  
  for (loop = 0, mask = 0x80; loop < 8; loop++, mask = mask >> 1) {
      PORT_SCK &= ~ ( 1 << PIN_SCK );
    
      if ( data_out & mask )
          PORT_MOSI |= ( 1 << PIN_MOSI );
      else
          PORT_MOSI &= ~ ( 1 << PIN_MOSI );
       PORT_SCK |= ( 1 << PIN_SCK );
  }
  
  PORT_SCK &= ~ ( 1 << PIN_SCK );
}


void segAusgabe ( unsigned char address, unsigned char data ) {
  PORT_CS |= ( 1 << PIN_CS );    // Chip Select
    segWrite( address );
   segWrite( data );
  PORT_CS &= ~ ( 1 << PIN_CS );   // Chip Unselect
}

void segInit ( void ) {
  unsigned char loop;

   DDR_SCK |= ( 1 << PIN_SCK );
    DDR_MOSI |= ( 1 << PIN_MOSI );
    DDR_CS |= ( 1 << PIN_CS );

  for ( loop = 0; loop < 4; loop++ ) {  // 4 mal um Fehler zu eliminieren
      segAusgabe( 0x0c, 0x01 );  // Shutdown aus
      segAusgabe( 0x09, 0xff );  // Decode-Mode: alles auf Code B
      segAusgabe( 0x0a, 0x01 );  // Intensität
     segAusgabe( 0x0b, 0x01 );  // 6 digits
    }
    
  for ( loop = 0; loop < 4; loop++ ) {  // 4 mal um Fehler zu eliminieren
      for (loop = 1; loop <= 2; loop++ )
        segAusgabe( loop, 0x0A );   // "-" auf allen Anzeigen anzeigen
    }
}

max7221.h:
#ifndef MAX7219_H
  #define MAX7219_H

  #include <avr/io.h>

  #define PORT_SCK  PORTB     // Sck Port
  #define DDR_SCK   DDRB      // Sck DDR
  #define PIN_SCK   PB7       // Sck Pin

  #define PORT_MOSI PORTB     // MOSI Port
  #define DDR_MOSI  DDRB      // MOSI DDR
  #define PIN_MOSI  PB5       // MOSI Pin

  #define PORT_CS   PORTB     // CS Port
  #define DDR_CS    DDRB      // CS DDR
  #define PIN_CS    PB4       // CS Pin

  void segWrite ( unsigned char data_out );
  void segAusgabe ( unsigned char address, unsigned char data );
  void segInit ( void );
#endif

Es leuchtet nichts auf. Ich messe auch keinen Stromam Ausgang meines 
ITS4880R.

Grüße Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

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

  while ( 1 ) {
    PORTB |= ( 1 << PB4 );
    
    for (loop = 0, mask = 0x80; loop < 16; loop++, mask = mask >> 1) {
        PORTB &= ~ ( 1 << PB7 );
    
        if ( 0x0107 & mask )
            PORTB |= ( 1 << PB5 );
        else
            PORTB &= ~ ( 1 << PB5 );
         PORTB |= ( 1 << PB7 );
    }
  
    PORTB &= ~ ( 1 << PB7 );
    PORTB &= ~ ( 1 << PB4 );  
  }

  return 0;
}

Autor: Niels Hüsken (monarch35)
Datum:

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

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

Autor: Alex (Gast)
Datum:

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

Gruß Alex

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nope, daran liegts auch nicht...

....komm, drei versuche haste noch.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hier ist Blödsinn, zuviel optimiert:
    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:
  for(mask = 0x80; mask; mask = mask >> 1) {

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
for ( loop = 0; loop < 4; loop++ ) {  // 4 mal um Fehler zu eliminieren
    for (loop = 1; loop <= 2; loop++ )
        segAusgabe( loop, 0x0A );   // "-" auf allen Anzeigen anzeigen
}

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.