7 Segment-Anzeige leuchtet nicht richtig

Gast #1451546
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
#1451560
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)
Moderator (Firma: Titel) Persönliche Seite #1451569
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).
Gast #1451630
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.
Angehängte Dateien:
#1451678
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.
Moderator (Firma: Titel) Persönliche Seite #1451680
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... ;-)

Antwort schreiben

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.

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.