mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit max7219 und Atmega8


Autor: H. Gruner (hgruner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich noch ein Frischling im Umgang mit Mikrocontrollern und habe ein 
Problem, für das ich keine wirklich Lösung finde.

Der Aufbau als Link unter:
http://img141.imageshack.us/my.php?image=zeichnungledt.jpg

Ich habe mir, wie im Plan aufgezeigt, eine Anzeige mit fünf 7-Segment 
Digits und einem max7219 als Treiber aufgebaut. Die Schaltung entspricht 
eigentlich dem Datenblatt des max7219. Die einzige Änderung zum 
verlinkten Plan im realisierten Aufbau ist, dass ein zusätzlicher 
zweiter keramischer Kondensator zwischen V+ und GND nach dem Abzweig zu 
Iset eingesetzt wurde. (ich habe gerade kein Visio zum ändern hier)
Als Microprozessor benutze ich ein Atmega8 ohne externen Quarz auf einem 
STK500, welches mit dem PC über ein [USB <-> Adapter <-> RS232]- Kabel 
verbunden ist . Als Programm nutze ich AVR-Studio mit WINAVR. Die 
Sprache ist C und ich beschreibe immer den Flashspeicher des Prozessors.
Später soll dieses Display eine Drehzahl mit Komma anzeigen.

(Das Problem erwähne ich weiter unten)


Das Programm zur eigentlichen Ansteuerung befindet sich im Anhang (ein 
paar includes sind zuviel und nur wegen des aktuellen bastelzustandes 
drin)



Nun habe ich zum Anzeigen konstanter Zahlen folgendes in die main 
hinzugefügt:

_Beispiel 1:_
transmit(0x01,1);
transmit(0x02,2);
transmit(0x03,131);
transmit(0x04,4);
transmit(0x05,5);

oder auch mit entsprechendem Aufruf in der main Funktion: (dem Forum 
hier entnommen)

_Beispiel 2:_
void ausgabe3()
{
long t[10];
t[2]=56322;

long c, ziffer;  

c = t[2];
ziffer = c/10000;
transmit(0x01,(char)ziffer); // die Zehntausenderstellen
c -= ziffer*10000;
ziffer = c/1000;
transmit(0x02,(char)ziffer);  // die Tausenderstelle
c -= ziffer*1000;
ziffer = c/100;
transmit(0x03,(char)ziffer+128);  // die Hunderterstelle
c -= ziffer*100;
ziffer = c/10;
transmit(0x04,(char)ziffer);  // die Zehnerstelle
c -= ziffer*10;
transmit(0x05,(char)ziffer);  // die Einerstelle

}

bis hierhin klappt auch alles wunderbar und das Display zeigt die Zahlen 
auch über Stunden ohne jedes Mucken an.

Wenn ich jetzt allerdings eine Abzählfunktion wie diese einsetze:

_Beispiel 3:_
LED_Ausgabe2(ausgabe2);
  _delay_ms(500);   
  while(1)            
  {
  
    if (updown==0)
    {
      LED_Ausgabe2(ausgabe2);
      _delay_ms(500);
      while(ausgabe2>0)
      {
        ausgabe2=ausgabe2-1;
        LED_Ausgabe2(ausgabe2);
        _delay_ms(500);
      }
    updown=1;
    }        
    else
    {    
        while(ausgabe2<9)
      {
        ausgabe2=ausgabe2+1;
        LED_Ausgabe2(ausgabe2);
        _delay_ms(500);
      }
      updown=0;
    }
    
  }

sowie die dazugehörige Ausgabefunktion
void LED_Ausgabe2 (char ausgabe2)
{
  char z1,z2,z3,z3dp,z4,z5;

  


  z1=ausgabe2/10000;              //10000er Stelle
  transmit(0x01,z1);          //Display 0

  ausgabe2=ausgabe2-(z1*10000);
  z2=ausgabe2/1000;              //1000er Stelle
  transmit(0x02,z2);           //Display 1

  ausgabe2=ausgabe2-(z2*1000);
  z3=ausgabe2/100;                //100er Stelle
  z3dp=z3+128;                //128 dazu addieren um dp (Komma) am Display zu aktivieren -> siehe Tabelle
  transmit(0x03, z3dp);         //Display 2 

  ausgabe2=ausgabe2-(z3*100);
  z4=ausgabe2/10;                //10er Stelle
  transmit(0x04,(char) z4);           //Display 3

  ausgabe2=ausgabe2-(z4*10);
  z5=ausgabe2;              //1er Stelle
  transmit(0x05, z5);           //Display 4
}

funtioniert das auch erstmal, allerdings erscheinen auf dem Display 
ziemlich schnell, kurzzeitig andere Zahlen und nach unterschiedlich 
langen Zeiten wird es dunkler, geht ganz aus oder sinnlose Segmente 
leuchten im in einem bestimmten Muster und im Abzähltakt auf.
Das gleiche passiert wenn man intern eine while- Schleife zum abzählen 
laufen lässt, aber an das Display eine feste Zahl mit dem Beispiel 1 
ausgibt. Die Zeit bis zum erscheinen der Fehler lässt sich hinauszögern, 
wenn man das STK500 vom PC trennt.

Am Anfang hatte ich noch eine Zahl des Formates long (99999) abzählen 
lassen und dachte der Fehler läge am 32bit Format der Zahl. Aber auch 
bei char- Zahlen wie oben tritt dieser Effekt auf.

Woran kann das liegen? Ist ein Fehler in meinem Quellcode und/oder im 
Aufbau? Was könnte man dagegen machen?


Sorry für den langen Beitrag und vielen Dank fürs Durchlesen.

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.