Forum: Mikrocontroller und Digitale Elektronik Frequenz LED-Multiplex-Anzeige


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael W. (miweso)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe ein Problem mit der Aktualisierungsfrequenz einer 
LED-7-Segmentanzeige mit sechs Stellen im Matrixbetrieb.

Wenn ich in der Main-Do/Loop-Schleife kein (aktuell) "Waitms 0.75" 
eintrage, flackert die Anzeige nur noch und ich bekomme teilweise wirre 
bzw. gar keine Zahlen angezeigt.

Ich arbeite mit Bascom (noch nicht so lange) und habe erst nach Stunden, 
mehr oder weniger durch Zufall festgestellt, das es ein Timing-Problem 
ist.

Die Anzeigen aktualisiere ich komplett in der Main-Do/Loop Schleife.

Den Schaltplan und den Quell-Code habe ich mal mit angehängt.

Könnt ihr mir vielleicht weiterhelfen und mir einen Tipp geben, wie ich 
das bewerkstellige, dass das Teil vernünftig läuft, also ohne das 
ausbremsen in der Hauptschleife?

Viele Grüße und im Voraus besten Dank für eure Hilfe,
Michael

von Peter R. (pnu)


Bewertung
0 lesenswert
nicht lesenswert
jo, ohne Zeitverzögerung sendet der Kontroller so schnell, dass die 
Stellen noch garnicht richtig eingeschaltet sind, bevor die nächste 
schon angesteuert wird.

Man muss jeder einzelnen Stelle schon etwas Zeit zum Leuchten lassen, 
bevor die nächste angesteuert wird. Sonst sieht man zum größten Teil der 
Zeit nur die Umschaltvorgänge.
für eine Schleife sollte zwar nicht mehr als 20ms insgesamt aufgewendet 
werden, und 1ms je Stelle ist schon angebracht.

Zusätzlich sollte man während des Wechsels von einer zur nächsten Stelle 
das Display dunkel schalten:

-Wartezeit 1ms für N-te Stelle zuende, dunkel schalten
-Segmente für (N+1)te Stelle bestimmen und einschalten
-(N+1)te Stelle einschalten
-Wartezeit für (N+1)beginnt

sodass während des Wechsels der Segment-Signale die Stellentreiber 
abgeschaltet sind

von Ulrich H. (lurchi)


Bewertung
0 lesenswert
nicht lesenswert
Sofern es nicht mit anderen Interrupts kollidiert kann man die Anzeige 
in einen Timer Interrupt legen. Der Interrupt schaltet dann jeweils auf 
die nächste Stelle weiter. Passend wäre da ein Interrupt etwa alle 1-3 
ms.

von Martin S. (led_martin)


Bewertung
0 lesenswert
nicht lesenswert
Was Peter R sagt ist richtig, mit Deiner Schaltung könntest Du das 
Dunkelschalten erreichen, in dem Du, bei dem 74LS138 den unbeschalteten 
Ausgang 6, oder 7 anwählst. Das es ohne das "Waitms 0.75" nicht 
funktioniert, hat noch einen anderen Grund: in der Zeit, die zwischen 
dem setzen von PortD und PortB vergeht, steht an den Anzeigen ein 
falscher Zustand an. Ist das Waitms drin ist die Zeit zwischen dem 
setzen von PortB, und dem darauffolgenden setzen von PortD deutlich 
länger, in dieser Zeit steht ein sinnvoller Zustand an. Nimmst Du das 
Waitms raus, ist diese Zeit etwa genau so lang, wie die Zeit mit dem 
unsinnigen Zustand, und man sieht nur noch das Durcheinander. Da Du ja 
nur 7 Portpins für die Anzeige brauchst, würde es Sinn machen, die alle 
auf PortD oder PortB zu legen, dann könntest Du diese Pins auf einen 
Rutsch setzen, das würde dann auch ohne das Dunkelschalten 
funktionieren. Auf jeden Fall solltest Du darauf achten, daß der 
Schleifendurchlauf immer genausolange dauert, da die Anzeige sonst 
flackert. Idealerweise gehört das multiplexen der Anzeige in einen 
Timerinterrupt. Hast Du dich damit schon mal beschäftigt? Dann kannst Du 
in der Hauptschleife machen, was Du willst, ohne die Funktion der 
Anzeige zu beeinträchtigen.

Das [Portd = Lookup(3 , Sn74138)] kannst Du dir sparen, Du sortierst ja 
nichts um, da könnte auch stehen [Portd = Display_nr - 1]. Genauso 
kannst Du [Portb = Lookup(stelle_6 , Cd4511)] durch [Portb = stelle_6] 
ersetzen, das Programm wird da merklich schneller, und Deine Tabellen 
setzen ja nicht wirklich um, sondern enthalten nur die binäre 
Schreibweise des Wertes, den Du schon hast. Anders sähe das aus, wenn Du 
den Cd4511 weglassen würdest, und die 7 Segmente direkt steuern würdest.

Mit freundlichem Gruß - Martin

von Michael W. (miweso)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erstmal Danke für die schnellen Antworten.

Ich werde mal versuchen eure Vorschläge umzusetzen.

Das mit dem Timerinterrupt wird bei der Umsetzung mein Ziel, da ich es 
bevorzugen würde, dass ich die Do/Loop für andere Zwecke nutzen kann und 
mich um die Anzeige nicht kümmern muss.

VG, Michael

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Michael W. schrieb:
> Die Anzeigen aktualisiere ich komplett in der Main-Do/Loop Schleife.

Das wird so nichts, dazu nimmt man einen Timerinterrupt.

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.