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.