www.mikrocontroller.net

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


Autor: Robinayor_ (Gast)
Datum:

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


#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h> 
#include <stdlib.h>

#define PDIN PC1
#define LOAD PC2
#define CLK  PC3

void write_max7219(char adresse,char wert) {
   PORTC |= (1<<PC0);
   //_delay_us(5);
   char x;
   // Bevor die Daten übertragen werden, wird zuerst der PIN LOAD auf LOW gesetzt.
   // Die Daten beginnen mit dem Bit D15, also MSB
   PORTC &= ~(1<<LOAD);
   //_delay_us(3);

   // Die Datenbits D15-D12 werden übertragen
   // Da diese nicht wichtig sind, wird eine 0 übermittelt
   for(x=0; x<4; x++){
      PORTC &= ~(1<<PDIN);
   //_delay_us(3);
      PORTC |= (1<<CLK);
   //_delay_us(3);
      PORTC &= ~(1<<CLK);
   //_delay_us(3);
   }
   // Die Datenbits D11-D8 beinhalten die Registeradresse des MAX7219
   for(x=4;x>0;x--){
      /*if(bit_test(adresse,x-1)){*/
      if(adresse & (1<<(x-1))){
         PORTC |= (1<<PDIN);
   //_delay_us(3);
      }else{
         PORTC &= ~(1<<PDIN);
   //_delay_us(3);
      }
      PORTC |= (1<<CLK);
   //_delay_us(3);
      PORTC &= ~(1<<CLK);
   //_delay_us(3);
   }

   // Die Datenbits D7-D0 sind die Daten an den MAX7219
   for (x=8;x>0;x--){
      /*#if (bit_test(wert,x-1)){*/
      if(wert & (1<<(x-1))){
         PORTC |= (1<<PDIN);
   //_delay_us(3);
      }else{
         PORTC &= ~(1<<PDIN);
   //_delay_us(3);
      }
      PORTC |= (1<<CLK);
   //_delay_us(3);
      PORTC &= ~(1<<CLK);
   //_delay_us(3);
   }
   // Zum Schluß wird der PIN LOAD auf HIGH gesetzt, damit ist die
   // Datenübertragung zu Ende
   PORTC |= (1<<LOAD);
   //_delay_us(3);
   PORTC &= ~(1<<PC0);
   //_delay_us(3);
}

int main(void){
   /* Disable JTAG */
   MCUCSR |= (1<<JTD);
   MCUCSR |= (1<<JTD);

   DDRC = 0xff;
   PORTC = 0x00;
   write_max7219(0x00,0x00); // 1 Digit
   write_max7219(0x0c,0x01); // Kein shutdown
   write_max7219(0x0f,0x00); // Kein Displaytest
   write_max7219(0x09, 0xff); // Decodemode für alle Digits
   write_max7219(0x0a,0x02); // Die Helligkeit der Digits wird hier eingestelltv

   while(1){
   int i;
   write_max7219(0x01, 0x04);
   for(i=0; i<49; i++)
       _delay_ms(50);
   write_max7219(0x01, 0x01);
   for(i=0; i<49; i++)
       _delay_ms(50);
   write_max7219(0x01, 0x02);
   for(i=0; i<49; i++)
       _delay_ms(50);
   write_max7219(0x01, 0x03);
   for(i=0; i<49; i++)
       _delay_ms(50);
   write_max7219(0x01, 0x04);
   for(i=0; i<49; i++)
       _delay_ms(50);
   write_max7219(0x01, 0x05);
   for(i=0; i<49; i++)
      _delay_ms(50);
   write_max7219(0x01, 0x07);
   for(i=0; i<49; i++)
      _delay_ms(50);
   write_max7219(0x01, 0x03);
   for(i=0; i<49; i++)
      _delay_ms(50);

   }
   return 0; /* Never reached */
}

Autor: Michael U. (amiga)
Datum:

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

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.