Forum: Mikrocontroller und Digitale Elektronik Problem mit max7219 und Atmega8


von H. G. (hgruner)


Angehängte Dateien:

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:_
1
transmit(0x01,1);
2
transmit(0x02,2);
3
transmit(0x03,131);
4
transmit(0x04,4);
5
transmit(0x05,5);

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

_Beispiel 2:_
1
void ausgabe3()
2
{
3
long t[10];
4
t[2]=56322;
5
6
long c, ziffer;  
7
8
c = t[2];
9
ziffer = c/10000;
10
transmit(0x01,(char)ziffer); // die Zehntausenderstellen
11
c -= ziffer*10000;
12
ziffer = c/1000;
13
transmit(0x02,(char)ziffer);  // die Tausenderstelle
14
c -= ziffer*1000;
15
ziffer = c/100;
16
transmit(0x03,(char)ziffer+128);  // die Hunderterstelle
17
c -= ziffer*100;
18
ziffer = c/10;
19
transmit(0x04,(char)ziffer);  // die Zehnerstelle
20
c -= ziffer*10;
21
transmit(0x05,(char)ziffer);  // die Einerstelle
22
23
}

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:_
1
LED_Ausgabe2(ausgabe2);
2
  _delay_ms(500);   
3
  while(1)            
4
  {
5
  
6
    if (updown==0)
7
    {
8
      LED_Ausgabe2(ausgabe2);
9
      _delay_ms(500);
10
      while(ausgabe2>0)
11
      {
12
        ausgabe2=ausgabe2-1;
13
        LED_Ausgabe2(ausgabe2);
14
        _delay_ms(500);
15
      }
16
    updown=1;
17
    }        
18
    else
19
    {    
20
        while(ausgabe2<9)
21
      {
22
        ausgabe2=ausgabe2+1;
23
        LED_Ausgabe2(ausgabe2);
24
        _delay_ms(500);
25
      }
26
      updown=0;
27
    }
28
    
29
  }

sowie die dazugehörige Ausgabefunktion
1
void LED_Ausgabe2 (char ausgabe2)
2
{
3
  char z1,z2,z3,z3dp,z4,z5;
4
5
  
6
7
8
  z1=ausgabe2/10000;              //10000er Stelle
9
  transmit(0x01,z1);          //Display 0
10
11
  ausgabe2=ausgabe2-(z1*10000);
12
  z2=ausgabe2/1000;              //1000er Stelle
13
  transmit(0x02,z2);           //Display 1
14
15
  ausgabe2=ausgabe2-(z2*1000);
16
  z3=ausgabe2/100;                //100er Stelle
17
  z3dp=z3+128;                //128 dazu addieren um dp (Komma) am Display zu aktivieren -> siehe Tabelle
18
  transmit(0x03, z3dp);         //Display 2 
19
20
  ausgabe2=ausgabe2-(z3*100);
21
  z4=ausgabe2/10;                //10er Stelle
22
  transmit(0x04,(char) z4);           //Display 3
23
24
  ausgabe2=ausgabe2-(z4*10);
25
  z5=ausgabe2;              //1er Stelle
26
  transmit(0x05, z5);           //Display 4
27
}

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.

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.