Guten Abend,
ich habe mir versehentlich eine 7 Segmentanzeige gekauft, die über ein
low Signal zum leuchten kommt. Ich brauche aber eine, die über ein high
Signal leuchtet. Zur Ansteuerung benutze ich den 4056.
Hat er eine Funktion, wo man einstellen kann, welche Art von
Segmentanzeige man hat? Aus dem Datenblatt werde ich leider nicht
schlau.
Danke
Jochen
Abend Jochen,
ich befürchte, daß Du ein anderes Display
benötigst - und zwar eins mit gemeinsamer
Kathode. Im Datenblatt zeigt die Wahrheits-
tabelle, daß eingeschaltete Segmente
logisch 1 sind.
Gruß Otto
Hi,
ich habe rausgefunden, mann kan das bei dem IC genau umdrehen, d.h. ein
eigentlicher high pegel ist ein low Pegel und umgekehrt.
Bei der Segmentanzeie muss das aber genau auf Masse gehen, wenn es an
einem low Pegel anliegt, geht es nicht es muss schon auf Masse. Gibt es
noch einen Trick?
Rufus t. Firefly wrote:
> Open-Collector-Inverter (7405) zwischen Treiber-IC und Display packen?
Würde ich auch sagen. Der 4056 ist laut Datenblatt nicht zum Treiben von
LED-Displays geeignet. Der Innenwiderstand ist schlicht zu hoch. Bei 5mA
fallen intern schon 5V ab. Sehr empfindliche LowCurrent-Displays könnten
evtl. gehen. Der 4056 ist nur für LC-Displays gedacht.
Gruss
Jadeclaw.
Jochen wrote:
> Bei der Segmentanzeie muss das aber genau auf Masse gehen, wenn es an> einem low Pegel anliegt, geht es nicht es muss schon auf Masse.
???
Low = 0V
Masse = 0V
Wo ist das Problem ?
Außerdem, der 4056 ist ein LCD-Treiber, d.h. für LEDs extrem
schwachbrüstig.
Wozu brauchst Du den überhaupt, nimm doch nen MC zum Ansteuern.
Peter
Also wenn ich einen Anzeigepin auf Masse lege, leuchtet die dazugehörige
Led in der Anzeige. Wenn ich ihn den Pin mit dem Low Pegel verbinde aber
nicht.
Ich brauche das, weil ich vorhabe mit einen MC und externen Multiplexern
vier 7 Segmentanzeigen anzusteurn.
@Peter
> Low = 0V> Masse = 0V
Der 2. Teil stimmt wohl, der erste nicht ganz. Das kommt auf den
Treibenden Ausgang an. Das kann bei TTL, CMOS oder sogar bei ganz alten
MOS ganz unterschiedlich sein. HiGH und LOW sind reine
definitionssachen. Du könntest das auch weiter führen mit virtuellen
Massen, dann stimmt evtl noch nicht mal mehr der zweite Teil.
Also ich habe mich damit jetzt lange Zeit befasst.
Man kann an einen Eingang das anlegen, was man als low gerne haben
würde. Wenn man da die Masse dranlegt, ist alles was auf low ist die
Masse.
Beim 4056 kann man sowohl Anoden / als auch Kathodensegmentanzeigen
ansteuern.
Jochen wrote:
> ... legt man an diesen speziellen Eingang nicht die Masse, ist der> Ausgang zwar auf low, aber die Led leuchtet dann dennoch nicht
Ja, bei CMOS müssen natürlich immer alle Eingänge beschaltet werden !!!
Peter
Jochen wrote:
> Ich brauche das, weil ich vorhabe mit einen MC und externen Multiplexern> vier 7 Segmentanzeigen anzusteurn.
Was meinst Du mit "externen Multiplexern" ?
LED-Multiplex-ICs (MAX7219) brauchen keine Dekoder.
Willst Du statisch ansteuern, nimm einfach nen 74HC595 pro Digit, dann
ist auch gleich der Dezimalpunkt angeschlossen.
Die haben deutlich mehr Bums, als der schlappe 4056 (LED-Vorwiderstände
nicht vergessen !).
Und weniger Pins (3 insgesamt) zum MC sinds auch.
Und Sonderzeichen gehen auch.
Peter
Ja Danke Peter, dann werde ich das mal so versuchen.
Wobei der Max ja schon sehr teuer ist, dann evtl doch lieber einen
zweiten MC, einen für die Stunden und einen für die Minuten oder so. Mal
sehn..
Ich habe noch eine Frage. Ich weiß für Euch ist das eine dumme Frage,
aber ich habe von Elektrotechnik keine Ahnung und bin froh wenn ich das
weiß.
Ich habe ja das my AVR board und das arbeitet mit 3,6864 MHZ.
Wenn ich mir jetzt einen MC im Internet bestelle, würde ich da auch
gerne diesen Takt aufbauen.
Was brauch ich da jetzt genau für Bauteile? Wir hatten diese Frage ja
schon einmal aber leider war mir das zu ungenau. Ich wusste nicht, was
ich genau bestellen soll. Und Fehlbestellungen habe ich schon so viele
gehabt, dass ist bei den hohen Portokosten ziemlich ärgerlich. Und wenn
ich dann einen falschen Kondensator habe, muss ich 5 Euro Porto zu
bezahlen, nur um einen 20 Cent Kontensator zu bestellen.
Könntet ihr mir vielleicht genau sagen, was ich dazu brauche?
Wenn Du dieses Hobby ernsthaft verfolgen möchtest, würde ich Dir
anraten, einige Sortimente zu bestellen. Die gibt es eigentlich bei
jedem Elektronik-Versender, z.B. bei Reichelt.de
Ein Elko-, ein Kondensator- und ein Widerstandssortiment darfs schon
sein, denn meist ist man gerade am Basteln und könnte irgendeinen
anderen Wert gebrauchen - und dann hat man ihn nicht...
Zu Deiner Frage: Du brauchst 2 27pF-Kondensatoren und einen 3,6864 MHz
Quarz. Alternativ ginge auch ein entsprechender Quarzoszillator (auf die
richtige Einstellung der Fuses achten).
Hi,
ULN2803 oder ULN2804. 8Bit open collector darlington driver.das ist ein
standard bauteil, den kannst du auch noch für viele weitere dinge
nutzen.
8 leitungen reichen für die segmente a-g und den dp.
die 4 leitungen für die 4 gem Anoden der 7segmentanzeigen kannst du dann
über 4 kleine p-channel fets zb.:bs250 schalten.
du benötigst dann 12 pins am controller und die bauteile kosten nicht
viel, sind in hmd zu haben, lassen sich also schön verbasteln....
d.
Und wenn Du nur Kleinmengen kaufst, dann solltest Du mal bei CSD
(komplette Adresse in der Linksammlung oder bei Google) reinschaun. Da
sind die Versandkosten bei Kleinmengen moderat weil die auch per Brief
versenden. Und bei Quarzen, Kondensatoren, Widerständen und Co liegen
die Preise teils unter Reichelt, AVRs sind auch sehr preiswert.
Dies ist keine Werbung, ich verdiene nix daran...
...
bei den kerkos nimm mal auch noch ein paar 22iger und 33iger, dann bist
du schon gut gerüstet
dein quarz ist ein smd typ, es gibt den typen auch noch mit beinchen...
aus dieser reihe:
8,0000-HC49U-S
nur andere frequenz.
ULN 2804A Darlington-Arrays, DIL-18 =TD 62084AP 0,39 € 1
BS 250 TRANSISTOR 0,26 € 1
und deinen led 7 segment anzeigen. es gibt natürlich noch 100 andere
möglichkeiten, aber hier könntest du schön etwas zum multiplexing
lernen....
übrigens heißen die, die sich mit einem low signal ansteuern lassen,
"mit gem Anode" da ihre +seiten alle zusammen an einem pin herausgeführt
sind, und die die sich mit einem high signal ansteuern lassen "mit gem
K" da alle ihre -seiten gemeinsam, an einem, aber meist zwei pins
herausgeführt sind...
Gruß,
d.
Ich habe es nicht abwarten können und habe heute schon mit meiener Idee
etwas aufgebaut.
Und zwar habe ich eine kleine Schaltung gemacht.
Da sind zwei 7 Segmentanzeigen, die jeweils über einen IC angesteuert
werden.
Davor habe ich Multiplexer eingebaut.
Wenn den Steuereingang auf 1 lege, kann ich Anzeige 1 beschrieben.
Lege ich ihn auf 0, so kann ich Anzeige 2 beschreiben.
Dann wollte ich mir ein Assemblerprogramm machen, wo PORT C den
Steuereingang übernimmt.
Erst wird PORTC eingeschaltet und auf den Ausgang die Zahl "1" gelegt.
Sie sollte auf Anzeige 1 erscheinen.
Dann wird PORTC ausgeschaltet und auf den Ausgang eine "4" gelegt, die
so auf Anzeige 2 erscheinen soll.
Das in eine Schleife gepackt und ich habe gedacht, man sieht auf Anzeige
1 eine "1" und auf Anzeige 2 eine "4".
Wieso funktioniert das nicht, ich sehe auf beiden nichts vernünfiges.
Hier das Programm:
ldi r22, 0b00000001
out PORTC, r22
ldi r21, 0b00000001
out PORTB,r21
ldi r22, 0b00000000
out PORTC, r22
ldi r21, 0b00000100
out PORTB,r21
rjmp loop
> Was kann man machen?
Systematisch herangehen und nicht wild draufloswurschteln...
Mit "Multiplexing" meinte ich nicht den Einsatz weiterer ICs, sondern
das softwaremäßige Multiplexen der einzelnen Anzeigen. Das bedeutet,
dass immer nur eine Anzeige aktiv ist, die Anzeigen also der Reihe nach
aktiviert werden, und das so schnell, dass es so aussieht, als ob alle
gleichzeitig leuchten würden.
Dazu schaltet man die Segmentleitungen aller Anzeigen (also a,b,c,d,e,f
und ggf. auch dp) parallel und schließt sie über Vorwiderstände 330 Ohm
an einem Port mit 7 oder 8 Portpins an. Das wäre bei Deinem Mega8 der
PortD, da PortB und PortC keine volle 8 Bit Breite haben (PB6 und PB7
wird ja vom Quarz blockiert).
Dann brauchst Du für jede Anzeigestelle einen Transistor als
Digit-Treiber. Da Du Displays mit gemeinsamer Anode pro Ziffer hast,
müssen die Digit-Treiber die Highside (also Plus) schalten. Dazu sind
PNP-Transistoren mit Basiswiderständen in Emitterschaltung geeignet, die
mit L-Pegel angesteuert werden. Man kann aber auch NPN-Transistoren in
Kollektorschaltung (als Emitterfolger) einsetzen, das spart die
Basiswiderstände, verursacht aber einen zusätzlichen Spannungsabfall.
Die Vorgehensweise im Programm ist folgende:
Mittels Timer erzeugt man regelmäßige Interrupts. In diesen zählt man
den Sekunden-Vorteiler runter (oder hoch), also den Zähler, der bei Dir
den Zählumfang von 225 haben wird.
Dann zählt man einen Zähler (Zählumfang = Anzahl der angeschlossenen
Ziffern) hoch oder runter, der bestimmt, welche Anzeige gerade dran ist.
Jetzt wird die zuvor aktive Anzeigestelle durch Abschalten Ihres
Transistors ausgeschaltet. Danach wird der Z-Pointer auf die Tabelle mit
den Bitmustern der Ziffern gesetzt, der BCD-Zahlenwert (0..9) der
betreffenden Stelle zum Z-Pointer addiert und mit LPM das Bitmuster aus
der Tabelle geholt, um es an den Port mit den Segmenten auszugeben.
Danach wird der entsprechende Transistor eingeschaltet, worauf die
Segmente leuchten, die L-Pegel bekommen haben.
Du musst also die anzuzeigenden Zahlen im BCD-Format vorliegen haben.
Ich hänge Dir mal ein Beispiel für den Tiny2313 an, das eine
dreistellige Ziffernanzeige und eine 3x4-Tastenmatrix im Multiplex
abfragt und eine Art Eieruhr darstellt. Versuche einfach mal, Teile des
Codes nachzuvollziehen. Denn ich denke, Du gehst zu blauäugig heran und
siehst die Probleme nicht, die noch auf Dich zukommen werden.
Der Code des Beispiels hat noch enormes Verbesserungspotential, sollte
aber geeignet sein, Dir die Vorgehensweise zu zeigen.
...
> Und zwar habe ich eine kleine Schaltung gemacht.> Da sind zwei 7 Segmentanzeigen, die jeweils über einen IC> angesteuert werden.> Davor habe ich Multiplexer eingebaut.
Was hast du genau verbaut und wie angeschlossen.
Mach mal einen Schaltplan davon bzw. ein Photo auf dem man
auch erkennen kann welche Pins du wie miteinander verbunden
hast.
> Es leuchten immer die Segmente von der 0 etwas schwach,> aber gut erkennbar.
Deutet auf gröbere Fehler hin.
> Ds Multiplexen scheint nicht schnell genug zu gehn.
Das kann ich mir nicht vorstellen. Nicht bei deinem
Programm. Der µC schaltet die Ports geschätzte >200000
mal pro sekunde um. Wenn das nicht schnell ist, was dann?
> Was kann man machen?
Mit den Grundlagen anfangen. Und sich erst dann zu den
schwierigeren Themen vortasten, wenn die Einfachen funktionieren.
Hi Hannes, danke für die ausführliche Beschreibung. Ich werde diesen Weg
auf jeden Fall ausprobieren. Hab jetzt wie du meintest den BC337 dafür
viermal bestellt.
Aber mal eine andere theoretische Frage:
Angenommen, ich wollte zwei Anzeigen multiplexen und zwar welche mit
gemeinsamer Anode.
Kann ich dann nicht beide Anoden an jeweils einen Port vom PC
anschließen und dann so vorgehen:
Schalte ANzeige 1 ein über das Setzen von 1 am MC.
Beschreibe Anzeige 1
Schalte ANzeige 1 aus
Schalte Anzeige 2 ein
Beschreibe Anzeige 2
Schalte Anzeige 2 aus
und alles wieder von vorne. Also die Steuerung nicht über Transistoren,
sondern über Ports am MC vornehemen.
Eine 7-Segment-Ziffernanzeige ist nix anderes als ein Gehäuse mit 7 (8)
einzelnen LEDs. Diese sind "an einer Seite" zusammengefasst, um Pins zu
sparen. In Deinem Fall sind die Anoden zusammengefasst. Die einzelnen
Kathoden werden mit L-Pegel (über Widerstände, die den Strom auf 10mA
begrenzen) angesteuert. Die gemeinsame Anode muss an Plus geschaltet
werden. Dabei fließt der Gesamtstrom aller aktiven Segmente. Ist Dein
AVR-Portpin in der Lage, diesen Strom direkt zu schalten? Meine AVRs
können das nicht, deshalb benutze ich einen Transistor als
Schaltverstärker.
...
Also ich habe es versucht. Es funktioniert, aber die Segmente, die nicht
leuchten sollte leuchten ganz schwach auf. Kann man das noch
unterbinden?
Ich habe 2 Anzeigen testweise angeschlossen.
Port D ist der Steuerport, mit dem die Anoden geschaltet werden.
Port B ist der Port, auf dem die Zahlen ausgegeben werden.
Die Ausgänge von MC bei Port B sind mit einem 4056 verbunden, der 7
Segmentanzeigen ansteuert. Am 4056 sind die beiden Segmentanzeigen
angeschlossen, d.h. die Ausgänge von 4056 gehen an alle beide Anzeigen.
Das Programm sieht so aus
main: ; hier beginnt das Hauptprogramm
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
sbi DDRB,0
sbi DDRB,1
sbi DDRB,2
sbi DDRB,3
sbi DDRD,2
sbi DDRD,3
loop:
ldi r20, 0b00000100
out PORTB, r20
ldi r21, 0b00000100
out PORTD, r21
ldi r20, 0b00000010
out PORTB, r20
ldi r21, 0b00001000
out PORTD, r21
rjmp loop
Aber wie gesagt, die Segmente, die nicht aufleuchten sollen, leuchten
zwar sehr schwach aber sie leuchten. Kann man sie ausschalten?
Jochen wrote:
> Aber wie gesagt, die Segmente, die nicht aufleuchten sollen, leuchten> zwar sehr schwach aber sie leuchten. Kann man sie ausschalten?
Hehe, das erinnert mich an meine erste Multiplex-Anzeige (eine 8x16
LED-Matrix), die ich Anfang der 90er als Azubi gebaut habe, da hatte ich
genau den gleichen Anfängerfehler gemacht.
Da Du den Inhalt und die Stellenauswahl nicht gleichzeitig sondern nur
nacheinander umschalten kannst, wird immer für einen kurzen Moment der
Inhalt der einen Stelle auf dem anderen Display angezeigt. Um das zu
umgehen gibt es zwei Möglichkeiten:
1. Laß die Schleife nicht mit maximaler Geschwindigkeit laufen, sondern
füge an den Stellen, wo die Ausgabe "gültig" ist, Warteschleifen ein.
Dadurch wird der korrekte Inhalt im Verhältnis viel länger angezeigt als
die Umschalt-Artefakte, so daß man diese nicht mehr wahrnehmen kann. Die
Schleifen kannst Du so einrichten, daß möglichst selten zwischen den
Stellen gewechselt wird, aber noch kein Flimmern zu sehen ist, also so
zwischen 50 und 100Hz.
2. Schalte übre PORTD jeweils alle Anzigen aus, bevor Du den Inhalt
umschaltest, dann kannst Du weiterhin mit voller Geschwindigkeit
multiplexen und bist trotzdem die Artefakte los.
Falls beides nicht hilft, vermute ich ein Schaltungsproblem oder
eingeschaltete Pullup-Widerstände.
BTW, warum schaltest Du an Port B eigentlich nur die unteren vier Pins
auf Ausgang?
Ich habe die zweite Varriante von dir gemacht und sie funktioniert. Ich
danke Dir!
Ich schalte nur die 4 Ports auf Ausgang, weil ich nur die brauche.
Allerdings ist jetzt das ganze etwas dunkler geworden und ich muss schon
das Licht ausmachen um es erkennen zu können. Insgesamt ist es dunkler,
wenn ich die Stromversorgung der Anzeige an den MC anschließe.
Ich habe an der Segmentanzeige um die 300 ohm Vorwinderstände. Ich denke
mal wenn ich sie kleiner wähe, so ein paar ohm dann wird die Anzeige
auch heller werden.
oder du nimmst einfach ein paar Latches denen übergibst du die Werte und
fertig diese versorgen dann die LEDs selbstständig und du hast den Port
für andere Aufgaben wieder frei. Ich habe das mal mit 74HC573N gemacht,
aber du brauchst das ganze ja invertiert. Gibt aber bestimmt ein
Gegenstück davon.
> Die Ausgänge von MC bei Port B sind mit einem 4056 verbunden, der 7> Segmentanzeigen ansteuert. Am 4056 sind die beiden Segmentanzeigen> angeschlossen, d.h. die Ausgänge von 4056 gehen an alle beide Anzeigen.
Lies nochmal weiter oben diesen Beitrag von Peter:
Beitrag "Re: 7 Segmentanzeige falsch eingekauft, reagiert nur auf low"
Und dann entscheide Dich, ob Du Multiplexing in Software machen willst
(dazu brauchst Du nur neben dem AVR und den Segment-Widerständen nur
einen Transistor je Anzeigestelle) oder ob Du mit zusätzlichen ICs
arbeiten willst (dazu brauchst Du für jede Anzeigestelle einen
zusätzlichen IC oder einen teuren Spezial-IC). Aber dann nimm geeigneten
ICs, siehe Link.
...
Also ich komme jetzt mit einem IC für alle 4 Anzeigen aus.
Und zwar schicke ich die Daten über den IC an jede Anzeige.
Dann sende ich nacheinander erst die Minuzen zehnerstelle, dann
Minuteneinerstelle. Dann die Stunden.
Jedoch ist nur die Anzeige, die auch gerade dran ist eingeschaltet, die
anderen sind ausgeschaltet.
Die Anoden der Anzeigen sind auch mit dem MC verbunden.
So funktioniert es problemlos, ohne weitere Transistoren. Ach die
Helligkeit habe ich in den Griff bekommen.
Danke für Eure Tipps, hat mir viel geholfen es über das ein und
Ausschalten der ANoden zu machen!
@Thmoas
Meinst du ich soll die Werte anstatt direkt auf die Anoden zu leiten
erst in Flip Flops schicken und die Ausgänge der FFs sind mit den
Anoden verbunden?
Ich habe mir gestern Transistoren besorgt und egal ob ich mit den
Transistoren oder dem MC schalte, die Anzeige ist schon was dunkel. Es
funktioniert alles, aber etwas heller ist nicht schlecht.
Was meintest du mit den Latches, Thomas?
Gibt es weitere Ideen?
jochen wrote:
> Ich habe mir gestern Transistoren besorgt und egal ob ich mit den> Transistoren oder dem MC schalte, die Anzeige ist schon was dunkel. Es> funktioniert alles, aber etwas heller ist nicht schlecht.
Wozu benutzt Du eigentlich den 4056? Welche Aufgabe soll er erfüllen?
Er ist nicht zum Treiben von LED-Anzeigen geeignet, er bringt die
erforderlichen Ströme nicht, die Anzeige ist deshalb zu dunkel.
Es wird bedeutend einfacher, billiger und heller, wenn Du ihn ersatzlos
streichst. Stattdessen solltest Du die Segmente aller 4 Anzeigen (über
Widerstände 330 Ohm) direkt an den AVR anschließen. Um sie alle an einen
Port zu bekommen (damit die Programmierung einfacher wird), solltest Du
sie an PortD des Mega8 anschließen, denn von PortB blockiert der Quarz
ja zwei Bit und PortC hat eh' nur 6 Bit. Das Prinzip, wie die Software
funktioniert, findest Du in meinem Eieruhr-Beispiel weiter oben.
> Gibt es weitere Ideen?
Nicht mehr lange, denn es entsteht der Eindruck, dass dich die gut
gemeinten Hinweise nicht wirklich interessieren. Da ist es eigentlich
schade um die Zeit, die man Dir widmet.
...
Ich würde so gerne über meinen Ansatz zum Ziel kommen, durch das
Beispiel oben blick ich nicht durch.
Wenn ich die Andoe an den Segmentanzeigen seperat an den Plus Pol liege,
leuchtet die Anzeige schön hell (Dann aber leider nicht mit korrektem
Inhalt, da sie ja zur falschen Zeit eingeschaltet ist). Ich vermute also
einen Fehler beim Multiplexen.
Wieso kann man das Multiplexen denn nicht so machen, wie ich
geschrieben habe (zumindest nur mit dunkeln Anzeigen) , sondern muss so
wie bei dir vorgehen?
jochen wrote:
> Ich habe mir gestern Transistoren besorgt und egal ob ich mit den> Transistoren oder dem MC schalte, die Anzeige ist schon was dunkel.
Ich habs doch schonmal gesagt:
"Außerdem, der 4056 ist ein LCD-Treiber, d.h. für LEDs extrem
schwachbrüstig."
Wennn Du mir nicht glaubst, liest doch mal das Datenblatt:
Bei 10V sind max 1,6mA angegeben, bei 5V muß es also noch wesentlich
weniger sein.
Peter
Klar glaub ich dir, ich kann mir nur nicht erklären warum es ohne
Multiplexen hell wird, auch mit diesem IC. Erst wenn ich das multiplexe
so mache wie ich geschriben habe gibt es ja die Probleme und ich weiß
nicht was das mit dem IC zu tun haben soll.
Wieso machst du bei der Eieruhr das Multiplexen auf diese Art und Weise
und was spricht gegen meine Methode, das einfache umschalten zwischen
den Anoden und ausgeben, also ohne Interrupt usw?
jochen wrote:
> Wieso machst du bei der Eieruhr das Multiplexen auf diese Art und Weise> und was spricht gegen meine Methode, das einfache umschalten zwischen> den Anoden und ausgeben, also ohne Interrupt usw?
Ohne Interrupt hast Du keine Kontrolle über die Multiplexfrequenz.
Aber je höher die Multiplexfrequenz, umso größer der Einfluß der
Befehlszeiten auf die Leuchtdauer und damit auf die Helligkeit. Und bei
Treibertransistoren in Emitterschaltung kommt noch deren Schaltzeit
(Miller-Kapazität) hinzu.
Ich hab noch nie versucht, ohne Timerinterrupt zu multiplexen. Aber ich
hab schon diverse Versuche von anderen gesehen, um einzuschätzen, daß
das großer Mist ist.
Peter
Also ich habe jetzt 18 V genommen, damit ist es auch nach meinem Weg zur
einer hellen Anzeige gekommen, somit geht die Uhr erstmal
Natürlich möchte ich eure bessere Lösung bauen.
In Anlehnung an
"Mittels Timer erzeugt man regelmäßige Interrupts. In diesen zählt man
den Sekunden-Vorteiler runter (oder hoch), also den Zähler, der bei Dir
den Zählumfang von 225 haben wird.
Dann zählt man einen Zähler (Zählumfang = Anzahl der angeschlossenen
Ziffern) hoch oder runter, der bestimmt, welche Anzeige gerade dran ist.
Jetzt wird die zuvor aktive Anzeigestelle durch Abschalten Ihres
Transistors ausgeschaltet. Danach wird der Z-Pointer auf die Tabelle mit
den Bitmustern der Ziffern gesetzt, der BCD-Zahlenwert (0..9) der
betreffenden Stelle zum Z-Pointer addiert und mit LPM das Bitmuster aus
der Tabelle geholt, um es an den Port mit den Segmenten auszugeben.
Danach wird der entsprechende Transistor eingeschaltet, worauf die
Segmente leuchten, die L-Pegel bekommen haben."
Ich erzeuge mit einem Timer also ein Interrupt (Wieviele Timer gibt es
beim Mega 8, ich brauche einen ja für die Uhr selebr).
Wenn dieses Interrupt erzeugt ist, bestimme ich über eine Schleife einen
Transistor in der festgelegt wird welchet Transistor dran ist. Soweit
auch verstanden. Was meinst du mit Sekunden Vorteiler und dem Counter
der bei mir 255 ist, wozu soll das dienen?
jochen wrote:
> Ich würde so gerne über meinen Ansatz zum Ziel kommen, durch das> Beispiel oben blick ich nicht durch.
Dann schau bitte nochmal ins Datenblatt Deines 4056 und Deiner
Ziffernanzeigen. Vergleiche dabei die Segment-Ströme.
> Wenn ich die Andoe an den Segmentanzeigen seperat an den Plus Pol liege,> leuchtet die Anzeige schön hell (Dann aber leider nicht mit korrektem> Inhalt, da sie ja zur falschen Zeit eingeschaltet ist). Ich vermute also> einen Fehler beim Multiplexen.
Kann ich jetzt nicht nachvollziehen, da ich mir Deinen Codewirrwarr
nicht antue.
> Wieso kann man das Multiplexen denn nicht so machen, wie ich> geschrieben habe (zumindest nur mit dunkeln Anzeigen) , sondern muss so> wie bei dir vorgehen?
Nein, es muss nicht wie bei mir vorgehen. Mein Beispiel beruht auf einem
Sonderfall. Die Hardware, auf der das Beispiel läuft, war nämlich schon
vor ein paar Jahren aufgebaut worden und mit einem AT90S1200 für einen
völlig anderen Zweck eingesetzt. Sie wird für diesen Zweck nicht mehr
gebraucht, weshalb ich sie zum Experimentieren mit einem Tiny2313
missbrauchte. Mein Multiplexing ist etwas komplexer, da es neben der
Ausgabe der Ziffern noch das Einlesen der Tastenmatrix, die teilweise
dieselben Portpins wie die Segmente nutzt, erledigt.
Du hast am Mega8 aber bedeutend mehr I/O-Pins, was das Multiplexing
bedeutend vereinfacht.
Du hast doch 225 Timer-Interrupts pro Sekunde. Dort würde ich ansetzen.
Das ist zwar relativ langsam, lässt aber Platz für uneffiziente
Programmierung, die nunmal jeder Anfänger hat.
Gehen wir mal davon aus, dass Du 4 Register hast, in denen die
Ziffernwerte der 4 Anzeigen stehen. Nehmen wir an, es ist r16, r17, r18
und r19. Und nehmen wir an, r20 sei der Stellenzähler für das
Multiplexing.
Dann muss zum Multiplexen im Timerinterrupt (neben den anderen Aufgaben
des Interrupts) folgendes passieren (einfache, unkomplizierte Variante):
- alle Transistoren für die Anoden ausschalten
- Z-Pointer auf Beginn der Bitmustertabelle setzen
- Stellenzähler erhöhen, dabei den Zählumfang begrenzen (0..3)
- anhand des Stellenzählers auf eine von 4 Routinen verzweigen
Jede der 4 Routinen macht nun Folgendes:
- den Inhalt des zugehörigen Ziffernregisters zum Z-Pointer addieren
- mit LPM das Bitmuster aus der Tabelle lesen (das steht dann in r0)
- mit out das Bitmuster an die Segmente anlegen
- den Transistor für die entsprechende Anode einschalten
Wichtig (damit's nicht flimmert) ist dabei, dass Du immer zuerst den
Transistor für die Anode (aller Anoden dürfte einfacher sein)
ausschaltest, dann erst das neue Bitmuster ermittelst (Tabellenzugriff)
und erst nach dem Update des Bitmusters an den Segmenten die zugehörige
Anode einschaltest.
Noch ein paar Tips zum Verständnis meines Beispiels:
Meine Multiplex-Zeitscheibe läuft von 10 bis 1 rückwärts, hat also 10
Zustände. In Zustand 10 wird die Tastenmatrix abgefragt. In Zustand 3, 6
und 9 wird die Hunderter-Stelle bedient, in Zustand 2, 5 und 8 die
Zehnerstelle und in bei 1, 4 und 7 die Einerstelle. Somit klappert das
Anzeige-Multiplex drei mal rundherum und macht dann eine Runde Pause, in
der die Tasten abgefragt werden. Ich hätte auch mit 4 Zuständen arbeiten
können, wollte aber die Pause klein halten und habe so statt 25%
Leuchtdauer jedes Segmentes 30% (3 mal 10%) Leuchtdauer. Da Du keine
Tasten am Segment-Port hast, kannst Du mit einer Zeitscheibe von 4
Zuständen arbeiten. Somit bekommt jede Stelle 25% Leuchtzeit.
Die Routinen multiplex1, multiplex2 und multiplex3 prüfen, ob die
Zeitscheibe (mux) einen Zustand hat, in dem die zugehörige Routine
multiplex1a (..2a, ..3a) zuschlagen muss. Hier wird jeweils auf 3
Zustände geprüft, Du brauchst nur auf jeweils einen Zustand prüfen, hast
dafür aber 4 Stellen zu bearbeiten.
Die a-Routine kopiert dann den entsprechenden Ziffernwert ins
Arbeitsregister (wl), ruft das Unterprogramm 'setseg' auf (das die
Segmente setzt) und schaltet nach Rückkehr aus dem Unterprogramm den
entsprechenden Transistor für die Anode der Anzeigestelle ein. Das
Auslagern der Decodierarbeit (BCD zu 7-Segment) in eine eigene Routine
verkleinert den Code.
Das Unterprogramm 'setseg' setzt den Z-Pointer auf den Beginn der
Tabelle namens 'bimu' das die Bitmuster (0 = eingeschaltet, 1 = aus) für
die Segmente enthält. Der erste Eintrag (Offset 0) steht für die 0, dann
folgt 1, 2, .. 9. Nun wird der in wl liegende Ziffernwert zum Z-Pointer
addiert um den Pointer nicht mehr auf den Anfang der Tabelle, sondern
auf das gewünschte Byte der Tabelle zu platzieren. LPM wl,z kopiert das
Byte aus der Tabelle (die übrigens im Flash steht) in das
Arbeitsregister wl, dabei wird zwar der Ziffernwert überschrieben, aber
den braucht jetzt keiner mehr, es war eh' nur eine Kopie. Und dieses
Bitmuster (in wl) wird jetzt sofort an den Port für die Segmente
ausgegeben. Nun geht's mittels RET zurück zu der Stelle, die dieses
Unterprogramm aufgerufen hat.
Du musst doch zugeben, dass der Softwareaufwand für das Decodieren von
BCD zu 7-Segment (7 Befehle und 10 Bytes Flash-Tabelle) im Verhältnis
zum Gesamtprogramm verschwindend klein ist und sich daher der Einsatz
eines Decoder-Chips (und der damit verbundene Platinenaufwand) nicht
gerechtfertigt ist.
Natürlich gibt es auch Anwendungen, in denen die I/O-Pins knapp sind. Da
greift man dann gerne zur bitseriellen Ausgabe per Schieberegister. Aber
Dein Mega8 hat für eine einfachr Uhr genügend I/O-Pins für den direkten
Anschluss aller Komponenten.
...
Sorry, da war ich wohl sehr langsam...
> Ich erzeuge mit einem Timer also ein Interrupt (Wieviele Timer gibt es> beim Mega 8, ich brauche einen ja für die Uhr selebr).
Wieviele Timer der Mega8 hat, steht im Datenblatt. Dort steht auch, wie
sie funktionieren.
Das Multiplexing übernimmt der Uhrentimer nebenbei. Es wäre unklug,
dafür einen anderen Timer einzusetzen. Wenn alles von einem Timer
gemacht wird, dann kann es nicht zu Interrupt-Verzögerungen kommen. Dein
Uhrentimer schlägt alle 64*256 Takte zu, Du hast also 16k Takte Zeit.
Dein AVR wird die meiste Zeit im Sleep verbringen können...
...
Hannes, vielen Dank, dass Du dir die Mühe gemacht hast und das so toll
beschrieben hast.
Eine Sache habe ich noch nicht verstanden und zwar wie genau jetzt die
Binärzahl in den Code für die segmentanzeigen umgerechnet wird und
welche Rolle der Z Pointer dabei spielt.
Könntest Du mir das erklären oder hast du evtl. Links wo ich das
nachlesen kann?
Ich frage deshalb, weil du 2 Möglichkeiten nanntest, wie man das mit
Transistoren machen kann und ich bin mir nicht sicher, ob der BC337 für
meine angestrebte Lösung geeignet ist.
Deine Zeichnung ist falsch. Sie würde auch AVR oder Transistor
beschädigen, da der Basis-Strom des Transistors nicht begrenzt wird.
Du musst auch keine Kathode nach GND (Minus) schalten,
sondern eine Anode nach Vcc (Plus). Denn Deine Kathoden sind ja die
Segmente, oder?
Um nun die Anoden der Displays nach Plus zu schalten, kannst Du einen
PNP-Transistor (z.B. BC327) in Emitterschaltung betreiben, also mit
Emitter an Plus schalten, Kollektor kommt dann an die Anode des Diaplays
und die Basis über einen Basiswiderstand von 1k an den AVR-Portpin. Ein
L-Pegel (eine Null) am Portpin schaltet den Transistor ein.
Du kannst aber auch einen NPN-Transistor in Kollektorschaltung (auch
Emitterfolger genannt) einsetzen, dann kommt Kollektor an Plus, Emitter
an die Anode des Displays und die Basis an den AVR-Portpin. Ein
Basiswiderstand ist nicht erforderlich, wenn die Schaltung fehlerfrei
ist. Kannst Du die fehlerfreie Schaltung nicht garantieren (z.B. beim
"mal probieren"), solltest Du einen Basiswiderstand vorsehen, um AVR und
Transistor vor Überstrom zu schützen. In dieser Schaltung
(NPN-Emitterfolger) wird der Transistor mit H-Pegel (1) eingeschaltet.
Funktion des Decoders:
Du kennst eine Tabelle (Winkelfunktionen, Quadratzahlen, Logarithmus,
...)?? Man nimmt dabei den gegebenen Wert als Index und liest den
gesuchten Wert ab.
Oder: Man erstellt sich 10 Bitmuster, von denen jedes eine Ziffer auf
der 7-Segment-Anzeige darstellt, also für jedes Segment, das leuchten
soll eine 0 für den entsprechenden Portpin enthält und für jedes
Segment, das nicht leuchten soll eine 1. Diese 10 Bytes liegen im Flash
direkt hintereinander und sind mit der .db-Direktive definiert. Um den
Anfang wiederfinden zu können, wird direkt vor dieser Tabelle das Label
"bimu:" gesetzt, was soviel wie Bitmuster bedeuten soll. Um nun das
richtige Byte zur gewünschten Ziffer auszuwählen, setzt man den
Z-Pointer (siehe Beschreibung des Z-Pointers r31:r30 im Datenblatt und
Instructionsset) auf den Anfang der Tabelle (das Label bimu), addiert
den Ziffernwert (0..9) als Index auf das benötigte Byte dazu und greift
mit LPM (siehe Beschreibung des LPM-Befehls im Datenblatt und
Instructionsset) auf das per Z-Pointer adressierte Byte zu. Das nennt
sich dann "indizierte Adressierung" (Suchbegriff für Google oder
Wikipedia).
Kleine Anmerkung dazu: Das Label "bimu" ist für den Assembler nur ein
Etikett, hinter dem sich eine Zahl verbirgt. Die zugehörige Zahl ist die
Adresse, an der das Label im Flash (Programmspeicher) steht. Der Wert
dieser Zahl richtet sich also danach, wieviele Speicherzellen das
Programm vor diesem Label bereits belegt. Die Berechnung erfolgt durch
den Assembler, er nimmt uns diese Verwaltungsarbeit ab. Um den Z-Pointer
auf den Wert der Adresse einzustellen, wird er mittels LDI und die
Funktionen LOW() und HIGH() geladen. Da der Flash 16 Bit je Zelle hat,
LPM aber nur 8 Bit breit ausliest, muss die Adresse verdoppelt werden,
was zweckmäßigerweise bereits beim Laden des Pointers passiert (bimu*2).
Übrigens ist jedes Label im Programm nur ein Name für eine Adresse, die
als Sprungziel gebraucht wird. Beim Assemblieren wird statt des Namens
der Zahlenwert der Adresse verwendet, an der das Label steht.
...
Hannes, vielen Dank. Ich habe das weitestgehtend verstanden und werde
heute Abend erste Versuche starten, was den Dekoder betrifft.
Ich würde dann gerne die zweite Variante mit dem NPN Transistor umsezen,
kannst du mir einen speziellen Transisotor empfehlen? Ich habe in google
zwar gesucht aber ich finde verschiedene bauweisen und auch welche für
größere Ströme und weiß nicht welchen ich nehmen soll.
Kann es eigentlich gefährlich werden, mit (falschen) Transistoren zu
experimentieren, da der Strom ja um ein Vielfaches ansteigt.
Grüße
Jochen
> kannst du mir einen speziellen Transisotor empfehlen?
Für solchen Kleinkram nehme ich den
- BC327 oder BC328 als PNP und den
- BC337 oder BC338 als NPN.
Diese haben die Bauform TO92, also den halbrunden Plastik-Klotz mit drei
Beinen. Sie werden mit einem Kollektorstrom von 0,5A bis 1,0A (je nach
Hersteller bzw. Datenblatt-Quelle) angegeben, sind also bedeutend
belastbarer als die in dieser Preisklasse sonst üblichen 200mA-Typen.
Sie sind bei Reichelt und Pollin zum fairen Preis verfügbar.
Für höhere Ströme nehme ich die LL-FETs von IR, die DLT hier mal zum
fairen Preis angeboten hat. Aber für ein paar LED-Anzeigen wären die
Overkill.
> Ich kaufe mir auch Anzeigen mit gemeinsamer Kathode.
Wozu???
Die Unterscheidung gemeinsame Anode oder Kathode ist dann wichtig, wenn
man spezielle Decoder-Anzeigetreiber-ICs verwenden möchte. Heute ist es
aber meist günstiger (und flexibler!), die Anzeigen direkt an den
Mikrocontroller dranzupappen, was allerdings aufgrund der hohen
Gesamtstromaufnahme Schaltverstärker (Transistoren) für die
Common-Anschlüsse erfordert. Und da ist es eigentlich egal, ob die
Dinger gemeinsame Anode oder Kathode haben. Da muss halt nur die
Software und die Transistorschaltung angepasst werden.
Wenn Du Großdisplays verwenden willst, dann solltest Du schaun, welche
Segment-Ströme die brauchen und wie hoch der Spannungsabfall über die
LEDs ist. Beim 100mm-Display von Reichelt sind pro Segment 4 LEDs in
Reihe und 2 dieser Gruppen parallel. Die sollte man also nicht mehr
direkt am AVR betreiben, da weder Strom noch Spannung des AVRs reichen.
Hier würde ich (bei gemeinsamer Anode pro Ziffer) einen ULN2003 oder
ULN2803 für die Segment-Kathoden einsetzen (über entsprechende
Segment-Widerstände) und je eine Kombination BC337/BC327 als
Stellentreiber, wobei die L-Seite auch mit einem ULN2003 realisiert
werden könnte. Die Stellentreiber werden dann von einer höheren Spannung
versorgt.
> Kann es eigentlich gefährlich werden, mit (falschen) Transistoren zu> experimentieren, da der Strom ja um ein Vielfaches ansteigt.
Es kann gefährlich (für die Bauteile) werden, wenn man ohne Wissen und
ohne System experimentiert. Daher rate ich Dir dringend, Dir das dazu
erforderliche Grundwissen zu erarbeiten. Deinem Wissensstand zufolge
solltest Du den AVR zur Seite packen und erstmal mit einem
Kosmos-Baukasten beginnen. Ohmsches Gesetz, Leistungsberechnung,
Transistor-Grundschaltungen, Dioden-Kennlinien usw. gehören einfach mal
zum Grundwissen, sie sind das Alphabet der Elektronik. Ohne dieses
Wissen bist Du überall aufgeschmissen. Du kannst Dich nicht immer auf
Andere verlassen, Du musst selbst tätig werden.
...
Hi,
ja ich würde die Uhr schon gerne fertigstellen, bevor ich mit den
anderen Sachen anfange.
Ich habe jetzt die Transistoren bestellt, die du genannt hast und am
Wochenende versuche ich das umzusetzen. Heute Abend teste ich dann mal
den Decoder, einfach nur die Umsetzung von Binärzahlen in ein 7 Segment
fähiges Format.
Ich meinte eigentlich gefährlich für den Menschen. Meine bestellten
Transistoren haben jetzt eine Verstärkung von 25.
Wenn man z.B. zwei 50er hintereinanderschaltet, hat man ja einen nicht
unerheblichen Strom.
Jochen
Wenn Du nicht an der 230V Steckdose rumspielst, ist Elektronikbasteln
wenig gefährlich. Sind doch Spannungen unter 42V, oder nicht?
Stromverstärung vom ß25? eher wohl 250... Siehe Datenblatt vom Transi
Wie wär es erstmal ein Blinklicht zu basteln? Mal zum kennenlernen von
Elektronik? Kostet nicht mal 2 Euro
Hallo Nachbar...
> Wie wär es erstmal ein Blinklicht zu basteln? Mal zum kennenlernen von> Elektronik? Kostet nicht mal 2 Euro
Ist vermutliczh zu primitiv, damit kann man heutzutage Niemanden mehr
beeindrucken.
Gruß über die Elbe,
Hannes
Achja, das Datenblatt habe ich mir auch eben erst besorgt, ich habe mich
bisher nach dem Buch "Transistordaten" von Klaus K. Streng gerichtet.
Aber HFE von 25, das wollte ich nicht unverifiziert hinnehmen...
;-)
Aber erstmal abwarten, Jochen wird uns vermutlich gleich aufklären, wie
er das gemeint hat.
...
@Jochen,
wenn man zwei Transistoren in Darlingtonschaltung hintereinander
schaltet, multiplizieren sich die Stromverstärkungen sogar.
@Hannes
einen Gruß zurück!
Da stand halt 25 und nicht 250 und desgwegen bin ich eben von 25 und
nicht 250 ausgegangen.
Ich möchte auch kein Rundumverständnis von Transisotrschaltungen haben,
ich brauche einefach nur einen Schalter um die 7 Segmentanzeigen
einschalten zu können und den hab ich dank eurer Hilfe ja jetzt.
Hallo Jochen, ich habe jetzt mal einiges überflogen, kann sein
daß es schon beantwortet ist.
Anzeige bei Multiplexen dunkler als bei direkt Anschluß?
weil das Gehirn ab einer bestimmten Frequenz ein Mittel bildet
zwischen eingeschaltet und ausgeschaltet.
Also hell und dunkel => bisschen hell ;-)
Willst du beim Multiplexe die Helligkeit beibehalten brauchst du
den X-Fachen Strom. X=Anzahl der Gruppen.
wenn also zum Beispiel 4 LED´s (Gruppen)nacheinander angeschaltet
werden,
braucht es den 4 fachen Strom als bei statischen Betrieb.
Und den bringt dann evtl dein Port nicht mehr bei.
Allerdings hier eine Gefahr:
setzt das Multiplexen aus und geht wegen Programmabsturz im statischen
Betrieb über,brennt die LED(Gruppe) sofort durch!
Also lieber erst mal das Zimmer abdunkeln bis alles sicher läuft.
Programmunterbrechungen nur bei dunkelgeschalteten LEds zulassen.
Auch ist zum Betrieb mit überhöhten Strom evtl eine Mindestfrequenz
zu beachten.vielleicht steht da was im datenblatt deiner Anzeigen
drin wieviel peak current und max.time hier zulässig sind.
Gruß
ANdi
Wenn ich dann die Methode mit den Transistoren nehme, habe ich doch aber
auch nicht plötzlich mehr Strom !? Üch habe schon zwei 9 V Batterien
zusammengeschaltet und das angeschlossen aber das war eher ein Fehler.
Naja Hannes hat das ja mit der Eieruhr schon gemacht und er meint ja das
Display ist schön hell ich bin schon sehr gespannt.
Hannes eine Frage:
bimu: ;Bitmuster f�r Display-Segmente
.db 0b01000001,0b01011111 ;0, 1
.db 0b00110001,0b00010101 ;2, 3
.db 0b00001111,0b10000101 ;4, 5
.db 0b10000001,0b01011101 ;6, 7
.db 0b00000001,0b00000101 ;8, 9
Wenn ich das richtig verstehe soll der allererste Wert 0b01000001 die
Null sein.
Wenn man sich die Null auf der Segmentanzeige ml ansieht, leuchten da
doch aber mehr als 2 segmente.
jochen wrote:
> Hannes eine Frage:>>> bimu: ;Bitmuster f?r Display-Segmente> .db 0b01000001,0b01011111 ;0, 1> .db 0b00110001,0b00010101 ;2, 3> .db 0b00001111,0b10000101 ;4, 5> .db 0b10000001,0b01011101 ;6, 7> .db 0b00000001,0b00000101 ;8, 9>>>> Wenn ich das richtig verstehe soll der allererste Wert 0b01000001 die> Null sein.> Wenn man sich die Null auf der Segmentanzeige ml ansieht, leuchten da> doch aber mehr als 2 segmente.
Wozu schreibe ich mir für Dich eigentlich die Finger wund?
Beitrag "Re: 7 Segmentanzeige falsch eingekauft, reagiert nur auf low"
Lesen bildet, 6.Absatz...
...
Ja sorry hatte nicht gelesen, dass man das invertiert macht, sollte ja
abhängig von der Anzeige sein. Ich lese deine Kommentare sehr intensiv
und habe mir das sogar alles ausgedruckt.
Aber ich muss trotzdem Nachfragen:
Eine Null bestehe aus 6 leuchtenden Segmenten.
Ich kann sie bei db 0b01000001 nicht finden, ich betrachte nur die
ersten 7 Ziffern von links: 1000001
jochen wrote:
> ...von rechts meinte ich
Tja, dann achtest Du halt auf die falschen Bits...
Es sind nunmal die linken 7 Bits des Bytes. Das Rechte hat eine andere
Aufgabe.
Im Programm gibt es auch noch die Zeilen:
1
;7-Segment-Display:
2
.equ segport=portb ;Port für Segmente (Kathoden)
3
.equ segmsk=0b11111110 ;Maske der benutzen Segment-Bits
Was könnten die wohl aussagen?
Noch ein Hinweis dazu: Die Reihenfolge der Segmente innerhalb des Bytes
wurde durch die Platine (einfachste Leiterführung) bestimmt. Wenn Du
alle Ziffern analysiert hast, hast Du auch meine Anschlussbelegung. Da
Deine Anschlussbelegung mit Sicherheit anders ist, musst Du Dir Deine
eigenen Bitmuster entwerfen.
...
hallo jochen,
der Strom wird im wesentlichen vom Vorwiderstand der led bestimmt.
allerdings muß der transistor den auch schalten können.
man rechnet normalerweise mit einer 3 fachen übersteuerung des
transistors.
dann kannst du davon ausgehen,das der collektor niederohmig genug ist.
somit nur noch die Betriebsspannung-ledspannung und der vorwiderstand
den strom begranzt.
Übersteuerung:
basisstrom*stromverstärkung ergibt den theoretischen Kollektorstrom.
dieser sollte 3 mal größer sein als der tasächlichfließende(weil durch
LEDVorwiderstand begrenzte)Kollektorstrom
Gruß
Andi