Servus!
Hab an den PORTD eines ATMega8 eine 7-Segment-Anzeige angeschlossen.
Hab leider kein Datenblatt zu dem Display gefunden, "T0D4201FG-2G" steht
drauf und war in einem LCD-Sortiment von Pollin dabei.
Daher hab ich mir die Anoden- und Kathodenanschlüsse selbst
rausgemessen. Wenn ich die entsprechenden Segmente manuell an Spannung
lege, leuchten alle Ziffern so wie ich es haben will.
Schließe ich die Anzeige an PORTD an und gebe die entsprechenden
Zustände darüber an das Display aus, kommt bei den Zahlen 1,4,5,6,7,8
und 9 die richtige Anzeige. Die Ziffern 0,2 und 3 werden falsch
dargestellt.
Sowohl die Überprüfung meines C-Codes im Debugger sowie die Messung der
Spannungen an den Pins ergab, dass der ATMega8 definitiv die richtigen
Bits rausgibt.
Daraufhin hab ich das Display getauscht, von der USB-Spannungsversorgung
auf eine externe Spannungsversorgung umgestellt und alle Segmente des
Displays nochmal manuell geprüft.
--> Das Display läuft manuell einwandfrei, nur ausschließlich am
Mikrocontroller kommt Blödsinn raus.
Hier noch meine Funktion zur Ausgabe der Ziffern, falls es hilfreich
ist:
1 | void showNumber(uint8_t n)
|
2 | {
|
3 | switch(n)
|
4 | {
|
5 | case 0:
|
6 | displ_port = (~((1<<a)|(1<<b)|(1<<c)|(1<<d)|(1<<e)|(1<<g)));
|
7 | break;
|
8 |
|
9 | case 1:
|
10 | displ_port = (~((1<<c)|(1<<d)));
|
11 | break;
|
12 |
|
13 | case 2:
|
14 | displ_port = (~((1<<e)|(1<<d)|(1<<f)|(1<<b)|(1<<c)));
|
15 | break;
|
16 |
|
17 | case 3:
|
18 | displ_port = (~((1<<e)|(1<<d)|(1<<f)|(1<<c)|(1<<g)));
|
19 | break;
|
20 |
|
21 | case 4:
|
22 | displ_port = (~((1<<a)|(1<<f)|(1<<d)|(1<<c)));
|
23 | break;
|
24 |
|
25 | case 5:
|
26 | displ_port = (~((1<<e)|(1<<a)|(1<<f)|(1<<c)|(1<<g)));
|
27 | break;
|
28 |
|
29 | case 6:
|
30 | displ_port = (~((1<<e)|(1<<a)|(1<<f)|(1<<b)|(1<<g)|(1<<c)|(1<<h)));
|
31 | break;
|
32 |
|
33 | case 7:
|
34 | displ_port = (~((1<<e)|(1<<d)|(1<<c)));
|
35 | break;
|
36 |
|
37 | case 8:
|
38 | displ_port = (~((1<<a)|(1<<b)|(1<<c)|(1<<d)|(1<<e)|(1<<f)|(1<<g)));
|
39 | break;
|
40 |
|
41 | case 9:
|
42 | displ_port = (~((1<<a)|(1<<c)|(1<<d)|(1<<e)|(1<<f)|(1<<g)|(1<<h)));
|
43 | break;
|
44 |
|
45 | default:
|
46 | displ_port = (~(1<<f));
|
47 | break;
|
48 | }
|
49 |
|
50 | }
|
Aber der Debugger hat ja gezeigt, dass der Code richtig arbeitet.
Ich bin wirklich hilflos. Habt ihr ne Idee?
Über der Segment-LED fallen 2V ab, über dem Segment-Vorwiderstand (1k)
3V. Dennoch leuchtet das Mistding nicht. :(
Danke und Gruß
Moritz