Forum: Mikrocontroller und Digitale Elektronik 7 Segment-Anzeige leuchtet nicht richtig


von paul (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem: ich habe an einem Atmega48 den Decoder 
74LS47 angeschlossen (2 Stück). Die 7 Segment-Anzeige ist eine MAN6610. 
Des weiteren sind 3 Taster über externe Pull-Up-Widerstände 
angeschlossen. Leider leuchten die ausgeschalteten Segmente der Anzeige 
trotzdem schwach, was die Lesbarkeit sehr beeinträchtigt. Die gemeinsame 
Anode der Anzeige liegt auf +5 Volt, als Vorwiderstand habe ich 150 Ohm 
gewählt. Es macht auch keinen Unterschied, ob ich zwischen Atmega und 
Decoder Vorwiderstände und Pull-Down-Widerstände benutze oder nicht. 
Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal 
richtig leuchtet. Alle Segmente sind dann richtig eingeschaltet bzw. 
ausgeschaltet (kein schwaches leuchten). Kann mir jemand einen Tipp 
geben, an was das liegen könnte? Die Pegel am Atmega stimmen, aber 
anscheinend sperren die Open-Collector-Ausgänge des 74LS47 nicht 
richtig, auch wenn ein Pegel von 0 Volt anliegt.

Gruß Paul

von Karl H. (kbuchegg)


Lesenswert?

paul schrieb:

> trotzdem schwach, was die Lesbarkeit sehr beeinträchtigt. Die gemeinsame
> Anode der Anzeige liegt auf +5 Volt, als Vorwiderstand habe ich 150 Ohm
> gewählt.

1 Vorwiderstand oder mehrere?

> Es macht auch keinen Unterschied, ob ich zwischen Atmega und
> Decoder Vorwiderstände und Pull-Down-Widerstände benutze oder nicht.

Logisch.
Da laufen Digitalsignale. Durch Widerstände ist alles was du erreichst, 
dass der Decoder nicht mehr 5V als logisch 1 kriegt sondern etwas 
weniger. Der Decoder dürfte sich aber daran nicht sonderlich stören, 
solange der Pegel hoch genug ist um als 1 erkannt zu werden.

> Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal
> richtig leuchtet.

Wie ist der Taster verschaltet?

> Alle Segmente sind dann richtig eingeschaltet bzw.
> ausgeschaltet (kein schwaches leuchten). Kann mir jemand einen Tipp
> geben, an was das liegen könnte?

Schaltplan, Programm

> Die Pegel am Atmega stimmen, aber
> anscheinend sperren die Open-Collector-Ausgänge des 74LS47 nicht
> richtig, auch wenn ein Pegel von 0 Volt anliegt.

Unwahrscheinlich.
Du hast irgend einen Fehler gemacht. Der 7447 ist sicherlich in Ordnung 
(auch wenn in Wirklichkeit kein Mensch diesen Baustein an einem µC mehr 
braucht)

von Peter Z. (hangloose)


Lesenswert?

lass mal deinen Code sehen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal
> richtig leuchtet.
Was macht deine Software in diesem Zustand?

Ich würde sagen, du schaltest die meiste Zeit die LEDs aus und nur immer 
mal kurz ein. Und wenn du die Taste drückst, dann unterbrichst du den 
ganzen Ablauf (und so auch das dauernde Abschalten).

von paul (Gast)


Angehängte Dateien:

Lesenswert?

So hier mal mein Code. Das mit dem Ein- und Ausschalten könnte natürlich 
sein. Meiner Meinung dürfte dies nicht der Fall sein, ich lass mich aber 
gerne eines besseren belehren :-)
Zum Programm: durch zwei Taster kann ein Spannungswert höher oder 
niedriger eingestellt werden. Dieser wird dann auf insgesamt drei 7 
Segment-Anzeigen dargestellt (die Nachkommastelle wird mit Hilfe von 
zwei Transistoren ohne Decoder angesteuert; funktioniert auch). Beim 
betätgigen des dritten Tasters wird der Spannungswert über UART bzw. 
RS232 gesendet (noch nicht fertig programmiert). Außerdem wird eine LED 
umgeschaltet, was auch funktionert und denke nichts mit dem Problem zu 
tun hat.

von Karl H. (kbuchegg)


Lesenswert?

paul schrieb:
> So hier mal mein Code. Das mit dem Ein- und Ausschalten könnte natürlich
> sein. Meiner Meinung dürfte dies nicht der Fall sein, ich lass mich aber
> gerne eines besseren belehren :-)

Doch, genau das tust du.
1
void  Display_V(uint16_t Voltage){

Hier schaltest du aus (bzw. auf 0)
1
  K_Port  &=  ~((1<<Komma0)  |  (1<<Komma5)  );
2
  Z1_Port  = 0;
3
  Z2_Port = 0;

um kurz drauf wieder einzuschalten :
1
  switch (Voltage){
2
    
3
    case 80:  Z1_Port = 0;
4
          Z2_Port  = 8;
5
          K_Port  |=  (1<<Komma0);
6
7
        break;

Übrigens.
Du kennst doch Division, oder nicht?

mittels / und % könnte man den ganzen langen switch/case auf <10 Zeilen 
eindampfen.

  /   ... Division
  %   ... Rest bei einer Division.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mann, das ist aber ein starkes Stück SW...

> Das mit dem Ein- und Ausschalten könnte natürlich sein.
Ja, genau so ist es:
1
  Z1_Port  = 0;  // Ausschalten !!!
2
  Z2_Port = 0;
3
4
  switch (Voltage){
5
    
6
    case 80:  Z1_Port = 0;  // Einschalten
7
        Z2_Port  = 8;
8
        K_Port  |=  (1<<Komma0);
9
        break;
Kommentier die ersten beiden Zeilen mal raus.

Wenn du keine Taste drückst, dann wird das nicht ausgeführt:
1
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
2
:
3
    _delay_ms(50);   << nur bei Tastendruck
4
:
Und das verändert das Zeitverhältnis zwischen Ausschalten und 
Einschalten  :-o

EDIT: Pech, Zweiter... ;-)

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.