Forum: Mikrocontroller und Digitale Elektronik Sieben-Segmentanzeige: Problem mit "6"


von Michael N. (atmelbrooks)


Lesenswert?

Hallo Leute.
ich hab ein sonderbares Problem. Ich habe eine Testschaltung aufgebaut 
mit einer Siebensegmentanzeige, einem ATtiny2313 und einem 4511 zur 
Ansteuerung der Anzeige.
Alle Zahlen werden super angezeigt, ausser der 6. wenn ich die 6 
anzeigen will, sind alle Segmente an, die eigentlich zur 6 gehören aber 
schwächer als die anderen. Ich habe es mit dem 4511 probiert, ohne 
(Segmente direkt von Controller angesteuert), mit einer Common Anode und 
Common Cathode Anzeige. Beide Varianten auch mit und ohne 4511 (bei gem. 
Anode entsprechend mit Transistoren) - überall das gleiche Resultat!

Ich habe meines Erachtens alles probiert und bin kurz vorm verzweifeln!
Ich muss allerdings gestehen, dass ich die Vorwiderstände vor den 
Segmenten weg gelassen habe, kann mir allerdings nicht vorstellen, das 
die was damit zu tun haben könnten.

von LP (Gast)


Lesenswert?

Eventuell hast du einen nichtgewollte Verbindung zwischen dem Anschluss 
für die oberste LED zur LED oben rechts. Bei allen anderen Ziffern fällt 
dies nicht auf, da mit ausnahme der 6 sonst immer beide an sein müssen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Den 4511 sollte man - unabhängig von Deinem Problem - aber nie ohne 
Vorwiderstände betreiben, das mag der nicht (lange).

von Sonic (Gast)


Lesenswert?

Hast du den Dezimalpunkt vervendet? Ich kenne den 4511 nicht auswendig, 
aber bei vielen Anzeigen ist der als normale low-current-LED ausgeführt, 
das führt zu dem Effekt den du hast.

von Michael U. (Gast)


Lesenswert?

Hallo,

@Sonic: der 4511 steuert doch den Dezimalpunkt garnicht an?
Wenn man, wie es nötig ist, die passenden Vorwiderstände benutzt, spielt 
der LED-Typ nur beim Wert des Vorwiderstandes eine Rolle.

Anmerkung: man sollte Beiträge kennzeichnen können, in denen es um:

"ich benutze LED ohne Vorwiderstand, daran kann es aber wohl nicht 
liegen"

in irgendeiner Form vorkommt. ;-))

Gruß aus Berlin
Michael

von ch (Gast)


Lesenswert?

naja du hast sicher ein KO... also messe erstmal ob die entsprechenden 
ausgänge alle schalten wie sie sollen... ist dies der fall, hast du's 
mit nem hardwarefehler zu tun.... hatte das auch mal, bei mir wars ne 
unsaubere lötstelle... wird wohl was ähnliches sein...

von Michael N. (atmelbrooks)


Angehängte Dateien:

Lesenswert?

Ich habe leider nicht genügend gleiche Widerstände für alle Segmente - 
habe es dann mit nur 5 Segmenten MIT Vorwiderständen probiert, same shit 
here. Deswegen kanns meiner Meinung nach nicht daran liegen.
Ich habe mittlerweile auch alle Bauteile mal gewechselt, sowohl die 
Anzeige, als auch den Controller und habs auch schon mit verschiedenen 
4511 und ohne (direkt am Controller). Ich schließe also einen 
Hardwarefehler aus.

Das mit dem messen der Anschlüsse hab ich auch schon gemacht. Die 
Anschlüsse geben ein Signal aus. Das mysteriöse ist aber, dass das 
sowohl bei Verwendung  mit 4511 als auch ohne der Fall ist, obwohl ich 
die Software entsprechend angepasst habe.

hier mal die Funktion zur Anzeige der Zahlen via 4511, vielleicht bin 
ich ja betiebsblind... (läuft mittlerweile auf einem Atmega8), das 
Datenblatt zu einem 4511 habe ich angehängt, da ist auch die 
entsprechende Warheitstabelle drin. Dezimalpunkt wird nicht verwendet 
und kann mit einem 4511 auch nicht angesteuert werden.

#define A    _BV(PC0) //4511 Eingang DA 0001 1
#define B    _BV(PC1) //4511 Eingang DB 0010 2
#define C    _BV(PC2) //4511 Eingang DC 0100 4
#define D    _BV(PC3) //4511 Eingang DD 1000 8

//Prototypen
void displaynumber(int);

int main(void) ...

//Funktion zur Anzeige der Ziffern
void displaynumber(int number){

  switch (number){

    case 1:
      PORTC = A;
      break;
    case 2:
      PORTC = B;
      break;
    case 3:
      PORTC = A+B;
      break;
    case 4:
      PORTC = C;
      break;
    case 5:
      PORTC = A+C;
      break;
    case 6:
      PORTC = B+C;
    case 7:
      PORTC = A+B+C;
      break;
    case 8:
      PORTC = D;
      break;
    case 9:
      PORTC = A+D;
      break;
    default:
      PORTC = 0x00;
      break;
      }
  }

von Sonic (Gast)


Lesenswert?

Habe grade ein ähnliches Projekt, habe 7-seg. Jumbo-Anzeigen 
anzusteuern. Ich mache das mit mehreren 74HC164 (8  bit 
Schieberegister), die Anzeige mittels Dioden an der gemeinsamen Kathode 
gegen Masse auf Betriebsspannung gebracht, dann brauche ich kein 
einzelnen Vorwiderstände. Die Schieberegister braucht man nur zu 
kaskadieren, gemeinsamer Takt und Reset - fertig. Die Ansteuerung ist 
auch pipi-einfach.

von Karl H. (kbuchegg)


Lesenswert?

Warum so kompliziert?
Wenn sicher gestellt ist, dass in number nur Ziffern von
0 bis 9 kommen, kannst du auch einfach

//Funktion zur Anzeige der Ziffern
void displaynumber(int number){
  PORTC = number;
}

machen.
Macht genau das gleiche

> Ich habe mittlerweile auch alle Bauteile mal gewechselt, sowohl die
> Anzeige, als auch den Controller und habs auch schon mit verschiedenen
> 4511 und ohne (direkt am Controller). Ich schließe also einen
> Hardwarefehler aus.

Hast du mal gemessen, ob du nicht einen Schluss von einer
Leitung zu anderen Leitungen hast?

von Unbekannter (Gast)


Lesenswert?

> die Anzeige mittels Dioden an der gemeinsamen Kathode
> gegen Masse auf Betriebsspannung gebracht, dann brauche ich
> kein einzelnen Vorwiderstände.

Das ist blanker Murks.



von Sonic (Gast)


Lesenswert?

Der 'Murks' funktioniert aber zuverlässig! Wenn die Segmente eine 
Spannung von 4V brauchen, kriegen sie die auch, nicht mehr und nicht 
weniger!

von Michael Böhner (Gast)


Lesenswert?

Hallo

@Michael Niemand: Füge mal hinter der case-Anweisung für die 6 noch ein 
break ein.
C++ verhält sich hier etwas anders als andere Programmiersprachen. Ohne 
break wird die switch-Anweisung nicht verlassen und somit die 
default-Anweisung auch noch ausgeführt (was zum Löschen der Anzeige 
führen würde).
Die Ansteuerzeit wird somit sehr kurz und dadurch natürlich im Vergleich 
zu den anderen Zahlen (die mit break abgeschlossen sind) dunkler.

Propier's einfach mal - vielleicht funktioniert's.

von Michael N. (atmelbrooks)


Lesenswert?

Michael Böhner wrote:
> Hallo
>
> @Michael Niemand: Füge mal hinter der case-Anweisung für die 6 noch ein
> break ein.
> C++ verhält sich hier etwas anders als andere Programmiersprachen. Ohne
> break wird die switch-Anweisung nicht verlassen und somit die
> default-Anweisung auch noch ausgeführt (was zum Löschen der Anzeige
> führen würde).
> Die Ansteuerzeit wird somit sehr kurz und dadurch natürlich im Vergleich
> zu den anderen Zahlen (die mit break abgeschlossen sind) dunkler.
>
> Propier's einfach mal - vielleicht funktioniert's.

Boah, ich krieg die Krise. Genau das meinte ich mit "betriebsblind". Das 
wars. Ich suche Stunden nach dem Problem und dann isses ne vergessene 
break Anweisung. Sehr lustig.
Danke! Das mit dem PORTC = number is ntürlich noch ne Ecke feiner als 
mit switch-case. Vielen Dank auch dafür!

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.