Forum: Mikrocontroller und Digitale Elektronik 7 Segment Anzeige an ATMega8 - unerklärliches Verhalten


von Moritz R. (Firma: DB Regio RheinNeckar) (morry)


Lesenswert?

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

von Markus F. (5volt) Benutzerseite


Lesenswert?

Hast du schon mal überprüft, ob das Data Direction Register(DDRx) 
zwischendurch für die entsprechenden Pins umgeschaltet wird?
Dann würde man nämlich nur den internen 10k Pull-Up-Widerstand ein-und 
ausschalten. Spannung könnte man an dem Pin ohne Display dann trotzdem 
messen. Aber so ein LED-Display leuchtet mit 10kOhm eben nicht 
vernünftig.

Oder liegen an den betreffenden Pins auch bei angeschlossenem Display 
noch 5V an? Dann hätte ich da auch keine Erklärung dafür.

von SDRF24D (Gast)


Lesenswert?

Hast du mal das Datenblatt 
(http://www.es.co.th/Schemetic/PDF/TOD-4201FG-B.PDF) mit deiner selbst 
ausgemessenen Belegung verglichen? Übrigens liefert Google den Link zum 
Datenblatt fast an erster Stelle der Suchergebnisse...

von hans (Gast)


Lesenswert?

Schau dir mal die Segmentaufteilung an:

http://de.wikipedia.org/wiki/7-Segment-Anzeige#Siebensegmentanzeige

Ich glaube du hast g und f verwechselt!

gruß hans

von Peter D. (peda)


Lesenswert?

Moritz R. wrote:

> und 9 die richtige Anzeige. Die Ziffern 0,2 und 3 werden falsch
> dargestellt.

Schön, und was gibts zu gewinnen, wenn wir es erraten?

Zähl die Segment erstmal richtig (A=oben, dann rechts rum und G=mitte).
Und dann sag, wie falsch.


Peter

von Moritz R. (Firma: DB Regio RheinNeckar) (morry)


Lesenswert?

Danke für eure Hinweise und vor allem für das Datenblatt.
Mittlerweile läufts. Einmal durchatmen und Hirn einschalten hat 
geholfen. Ich habe tatsächlich in meinem Steckbrett-Wirrwarr 2 Segmente 
vertauscht. Jetzt passt alles und ich bin happy. :)

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.