7 Segment Anzeige an ATMega8 - unerklärliches Verhalten

OP (Firma: DB Regio RheinNeckar) #1195638
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
Persönliche Seite #1195662
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.
#1195668
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
OP (Firma: DB Regio RheinNeckar) #1195685
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. :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.