mikrocontroller.net

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


Autor: Moritz R. (Firma: DB Regio RheinNeckar) (morry)
Datum:

Bewertung
0 lesenswert
nicht 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:
void showNumber(uint8_t n)
{
  switch(n)
  {
  case 0:  
    displ_port = (~((1<<a)|(1<<b)|(1<<c)|(1<<d)|(1<<e)|(1<<g)));
    break;
  
  case 1:
    displ_port = (~((1<<c)|(1<<d)));
    break;

  case 2:
    displ_port = (~((1<<e)|(1<<d)|(1<<f)|(1<<b)|(1<<c)));
    break;

  case 3:
    displ_port = (~((1<<e)|(1<<d)|(1<<f)|(1<<c)|(1<<g)));
    break; 

  case 4:
    displ_port = (~((1<<a)|(1<<f)|(1<<d)|(1<<c)));
    break;

  case 5:
    displ_port = (~((1<<e)|(1<<a)|(1<<f)|(1<<c)|(1<<g)));
    break;

  case 6:
    displ_port = (~((1<<e)|(1<<a)|(1<<f)|(1<<b)|(1<<g)|(1<<c)|(1<<h)));
    break;

  case 7:
    displ_port = (~((1<<e)|(1<<d)|(1<<c)));
    break;
    
  case 8:
    displ_port = (~((1<<a)|(1<<b)|(1<<c)|(1<<d)|(1<<e)|(1<<f)|(1<<g)));
    break;

  case 9:
    displ_port = (~((1<<a)|(1<<c)|(1<<d)|(1<<e)|(1<<f)|(1<<g)|(1<<h)));
    break;

  default:
    displ_port = (~(1<<f));
    break;
  }

}
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

Autor: Markus F. (5volt) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: SDRF24D (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die Segmentaufteilung an:

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

Ich glaube du hast g und f verwechselt!

gruß hans

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Moritz R. (Firma: DB Regio RheinNeckar) (morry)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.