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
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
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.
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
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
Michael W. schrieb: > Die Anzeigen aktualisiere ich komplett in der Main-Do/Loop Schleife. Das wird so nichts, dazu nimmt man einen Timerinterrupt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.