Hallo Freunde der ASM Programmierung. Habe mir ein 4-stelliges Display aus 7 Seg. Anzeigen gebastelt. ...mit jeweils einem BCD-Decoder/Treiber/Latch-Baustein pro Ziffer. Die Latches L1..L4 sind also meine Ziffernauswahl und die Leitungen A,B,C,D sind die Datenleitungen, welche ich an PC0..PC3 meines Mega8 geklemmt habe. Will das Display jetzt ansteuern. Das klappt Ziffernweise ganz gut: Ich lege eine Zahl zwischen 0 und 9 auf PortC, selektiere eine Ziffer der Anzeige indem ich einen der restlichen Pins PC4..PC7 auf 1 setze, kurz warte und die 1 wieder lösche. Die Ziffer bleibt im Latch erhalten und wird fröhlich angezeigt. Also bisher geht das. Kann auch danach eine andere Zahl auf eine ande Displaystelle schreiben, ohne dass die zuerst geschriebene Zahl verschwindet. Jetzt das 1. Problem: Ich will den Inhalt eines Registers auf das Display ausgeben. Dazu muss ich ja diese Zahl im Register zerlegen, um jeder Stelle meines Displays (1000er, 100er, 10er, 1er) mitzuteilen, was diese jeweils anzeigen soll. Wie würdet ihr das machen ? Zur Info: Bei mir hängts beim Wissen um Assembler: * wie definiere ich Variablen * wie nutze ich diese (welche befehle/rechenarten darf ich anwenden) * wie weise ich einer variablen einen Wert zu ( also das Ergebnis einer Rechnung) Jetzt das 2. Problem dazu: will einen 10-Bit AD Wert ausgeben: was muss ich da zusätzlich noch machen, um 10 Bit-Werte aus mein Display auszugeben ?? Jeder Vorschlag ist willkommen, auch wenns nur allgemeine Tips zu Variablen bei ASM sind. Auf wunsch kann ich auch mal den groben Plan des Displays posten, falls ichs schlecht erklährt habe. Vielen Dank im Voraus !!!
Hi, hier eine Applikation, die benutzt das "Division durch 10 Verfahren", um eine 16-Bit Zahl darzustellen: http://www.specs.de/users/danni/avr/soft/dcf77/index.htm Die eigentliche Routine: http://www.specs.de/users/danni/avr/soft/dcf77/dec_out.inc Daneben gebräuchlich ist noch das Subtraktionsverfahren durch 10^n , ... 10^2, 10^1 und das packet-BCD-Additonsverfahren. Viele Wege führen zum Ziel. Grundsätzlich würde ich aber nochmal die Realisierung überdenken: Der Einsatz eines Microcontrollers erfolgt eigentlich, um möglichst viel Hardware einzusparen und durch Software zu ersetzen. D.h. solche Aufgaben, wie 7-Segment-Darstellung würde er liebend gerne mit übernehmen. Deshalb besteht die quasi Standardschaltung für ein 4-stelliges LED-Display aus 4 Digittreibertransistoren und 8 Strombegrenzerwiderständen, den Rest macht alles der Microcontroller im Multiplexbetrieb. Es werden 4+8=12 Portpins benötigt. Der Verzicht auf externe Dekoderchips hat auch den Vorteil, daß beliebige andere 7-Segmentkombinationen (z.B. "-AbCdEF") dargestellt und führende Nullen ausgeblendet werden können. Peter
Habe einen Sourcecode bei AVR ASM Tutorial gefunden, dieser soll binär nach bcd hinbekommen. Aber der ist wohl zu kompliziert für mich... wie wende ich den an? Welche Registerdefinitionen muss mein programm jetzt zusätzlich enthalten ? Wie rufe ich die Funktion auf ? Es folgt der original Quelltext: ; Von binär nach BCD ; ; Bin2ToBcd5 ; ========== ; wandelt 16-Bit-Binärzahl in 5-stellige BCD-Zahl um ; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf die ; erste Stelle der BCD-kodierten Resultats ; Stellen: Die BCD-Zahl hat exakt 5 gültige Stellen. ; Rückkehr: Z zeigt auf die höchste BCD-Stelle ; Benötigte Register: rBin1H:L (wird erhalten), rBin2H:L ; (wird nicht wieder hergestellt), rmp ; Aufgerufene Unterroutinen: Bin2ToDigit ; Bin2ToBcd5: push rBin1H ; Rette Inhalt der Register rBin1H:L push rBin1L ldi rmp,HIGH(10000) ; Lade 10.000 in rBin2H:L mov rBin2H,rmp ldi rmp,LOW(10000) mov rBin2L,rmp rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen ldi rmp,HIGH(1000) ; Lade 1.000 in rBin2H:L mov rBin2H,rmp ldi rmp,LOW(1000) mov rBin2L,rmp rcall Bin2ToDigit ; Ermittle 4.Stelle durch Abziehen ldi rmp,HIGH(100) ; Lade 100 in rBin2H:L mov rBin2H,rmp ldi rmp,LOW(100) mov rBin2L,rmp rcall Bin2ToDigit ; Ermittle 3.Stelle durch Abziehen ldi rmp,HIGH(10) ; Lade 10 in rBin2H:L mov rBin2H,rmp ldi rmp,LOW(10) mov rBin2L,rmp rcall Bin2ToDigit ; Ermittle 2.Stelle durch Abziehen st z,rBin1L ; Rest sind Einer sbiw ZL,4 ; Setze Zeiger Z auf 5.Stelle (erste Ziffer) pop rBin1L ; Stelle den Originalwert wieder her pop rBin1H ret ; und kehre zurück ; ; Bin2ToDigit ; =========== ; ermittelt eine dezimale Ziffer durch fortgesetztes Abziehen ; einer binär kodierten Dezimalstelle ; Unterroutine benutzt von: Bin2ToBcd5, Bin2ToAsc5, Bin2ToAsc ; Aufruf: Binärzahl in rBin1H:L, binär kodierte Dezimalzahl ; in rBin2H:L, Z zeigt auf bearbeitete BCD-Ziffer ; Rückkehr: Ergebis in Z (bei Aufruf), Z um eine Stelle er- ; höht, keine Fehlerbehandlung ; Benutzte Register: rBin1H:L (enthält Rest der Binärzahl), ; rBin2H (bleibt erhalten), rmp ; Aufgerufene Unterroutinen: - ; Bin2ToDigit: clr rmp ; Zähler auf Null Bin2ToDigita: cp rBin1H,rBin2H ; Vergleiche MSBs miteinander brcs Bin2ToDigitc ; MSB Binärzahl kleiner, fertig brne Bin2ToDigitb ; MSB Binärzahl größer, subtrahiere cp rBin1L,rBin2L ; MSB gleich, vergleiche LSBs brcs Bin2ToDigitc ; LSB Binärzahl kleiner, fertig Bin2ToDigitb: sub rBin1L,rBin2L ; Subtrahiere LSB Dezimalzahl sbc rBin1H,rBin2H ; Subtrahiere Carry und MSB inc rmp ; Erhöhe den Zähler rjmp Bin2ToDigita ; Weiter vergleichen/subtrahieren Bin2ToDigitc: st z+,rmp ; Speichere das Ergebnis und erhöhe Zeiger ret ; zurück ; ; ***********************************************
hallo zusammen, anbei ein datasheet über einen led-display driver, der bis zu 8-stellige anzeigen realisieren kann, und ganz einfach seriell angesteuert wird ... ich glaube, das ist die einfachste lösung eines numerischen led-displays, thomas
Hi @peter so einfach ist es dann doch wieder nicht. Wenn du 8 Digits multiplexen willst mußt du durch jedes Segment den 8-fachen Strom jagen. Also statt 20mA 160mA um die gleiche Helligkeit zu erreichen (ein bischen weniger tuts meist auch). Da brauchts dann noch einen zusätzlich Treiberbaustein wie z.B. der ULN2803 Matthias
@Matthias, hier ist ja auch niemals von 8 Stellen die Rede, sondern von 4. Ich multiplexe ganz normale Displays, mit 150 Ohm Vorwiderstand bei 4 Stellen und die sind hell genug. Ich habe dann mal high-efficient Displays eingesetzt, die waren noch mit 1kOhm Vorwiderstand hell genug. Kann aber durchaus sein, daß irgendwelche Uralt-Displays bei 20mA/4 zu dunkel sind. Für Bastlerschaltungen muß man die 20mA auch nicht so genau nehmen. Ich habe sogar schon Schaltungen gesehen, wo die Strombegrenzerwiderstände völlig weggelassen wurden. Von so hoher Überlastung des Kontrollers rate ich aber dringend ab. Man weiß sonst nie, ob ein Fehler in der Hardware oder in der Software begründet ist. Peter
Hi ich hab hier auch ein Display mit 4 Stellen was mit 20mA Segmentstrom arg dunkel ist. Ist aber wahrscheinlich Ansichtssache und vom Einsatzzweck abhänig. Ich nehm etwa 50mA Segementstrom. Das ist mir für den AT dann doch etwas viel. Und die 44 Cent kann ich grade noch investieren. Matthias
Hallo, ich habe dein Problem bereits in die Praxis umgesetzt. 4 7Segment-Anzeigen werden direkt vom AT90S4433 angesteuert, wobei an Port D die Katoden der 7Segment-Anzeigen parallel angeschlossen sind und an PC1-PC3 die Anoden jeweils über eine Transistor-Treiberstufe angeschlossen sind. Die einzelnen Anzeigen werden nacheinander mit einer Frequenz von 50 Hz angesteuert (flimmerfrei). Ich habe für jede Stelle ein Register reserviert, dass dann nur ausgelesen und direkt angezeigt wird. Die Darstellung der Ziffern erfolgt über andere Register, in denen die Konfiguration des PORT D für die Darstellung der jeweiligen Ziffer fest gespeichert ist. Helligkeit ist kein Thema dabei, da die Anzeigen gepulst angesprochen werden und so keine grosse Last für den AVR anliegt. Du kannst dir das Projekt unter www.thelastinstance.de genauer betrachten. MfG Heiko
Hi ohne dich kritisieren zu wollen aber: Die Ansteuerung der Anoden über NPN-Transistoren (T1 -T4) ist nicht besonders toll. Entweder funktioniert das garnicht oder in den Transistoren entsteht unnötige Verlustleistung. PNP ist an dieser Stelle viel besser. Matthias
@Matthias, im Gegenteil, der Basisstrom fließt mit durch die Anzeigen, d.h. Du brauchst etwas weniger Strom. Da der Eingang einer Kollektorschaltung hochohmig ist, braucht man auch die Basisvorwiderstände R18..R21 nicht. Auch sind die Transistoren nicht in der Sättigung und somit kommt es bei hoher Multiplexfrequenz nicht zu Schattenziffern, bzw. man braucht keine Pausen beim Umschalten der Digits. Es fallen nur die 0,7V UBE am Transistor ab, was aber bei 5V keine Rolle spielt. Die hätten man ja sonst in R6..R12 mit vernichtet. Ich mache das auch gerne so. Die Schaltung ist so gut, die könnte von mir sein. Ich hätte aber den TINY26 genommen und damit den Quarz eingespart. Die 2% Genauigkeit des internen RC-Oszillators sollten reichen. Peter
Okay, ich sehe ihr habt viel Fantasie, was die Hardwareseite angeht. Ich benutze den CD4543 und ganz normale 7 Seg Displays. Brauche keine Vorwiderstände oder Transistorstufen mehr, da der Chip am Steuereingang nur einige µA benötigt und am Ausgang Konstantstromquellen zur Verfügung stehen. Durch die Latches des CD4543 kann ich alle Displays einzeln schreiben oder löschen, ohne eine andere Ziffer zu beeinträchtigen. Ich weiss ja gar nicht, was ihr da noch alles basteln müsst, der chip kostet inkl. Display unter 1 Euro und braucht nur simpel verdrahtet werden. Mich wurmt viel mehr die Softwareseite: Die Ansteuerung kriege ich im AVR-Assembler bisher für 2 Digits perfekt hin. (00 bis 99) Eine 8 Bit BIN2BCD ,welche ich einigermassen gut verstanden habe um sie anzuwenden, hilft mir dabei. Problem sind größere Zahlen. Ich brauche die 8 Bit Routine in 16 Bit ! Ich habe alles abgesucht. Selber kriege ich das nie hin. Ich habe letztendlich eine gefunden, die 16Bit bin2Bcd schafft, aber es werden gepackte BCDs erzeugt und nicht einfache (1 byte pro Ziffer). Jetzt müsste sich jemand von euch finden, der mir eine 16Bit bin2bcd (ungepackte BCDs) besorgen kann, oder jemand, der ein Progrämmchen auf Lager hat, welches gepackte bcds in ungepackte umwandelt. Wenn jemand eine (für mich überschaubare) Routine findet, bitte dringend posten. Ich verliere langsam den Mut zum Weiterprogrammieren ! Es gibt vielleicht auch Finderlohn!
> gepackte bcds in ungepackte umwandelt > Selber kriege ich das nie hin. Doch, doch. Was ist der Unterschied zwischen gepackten und ungepackten BCDs? Wie lassen sich die beiden in einander überführen? Beispiel: du willst aus: 0x64 -> 0x06 und 0x04 machen. 0x64->0x04 (die 6 ausblenden) 0x64->0x06 (die 6 vier Stellen binär (oder eine Stelle dezimal) nach rechts schieben). Stichworte: Schieben (shr) und Ausmaskieren/"Ausblenden" (andi...) > Es gibt vielleicht auch Finderlohn! Nach dem 3Zeiler darfst du dir den dann selbst genehmigen. Schmittchen "eigentlich ist dieses Forum nur für Diskussionen zu bestehendem Code -> Das Allgemein-Forum triffts besser"
@Kutschenegger, ach so, Du meintest LCDs und nicht LED-Anzeigen, da der CD4543 ja ein LCD-Treiber-IC ist. Dann brauchst Du natürlich auch keine Strombegrenzerwiderstände, da die LCDs ja spannungsgesteuert sind. Aber Du must einen Takt an den Phase-Anschluß (Pin 6) legen, da LCDs Wechselspanung benötigen, sonst gehen sie kaputt. Für LEDs ist der CD4543 aber völlig ungeeignet, da er nur für 0.51mA spezifiziert ist. Bzw. Du verwendest Low-Current-Anzeigen und Vorwiderstande 10kOhm je Segment. Ohne Begrenzerwiderstände wird er total überlastet und dürfte sehr bald dem beim Kurzschluß von CMOS-ICs auftretenden Thyristoreffekt zum Opfer fallen. Peter
@Peter Ja, das dachte ich auch, bevor ich es nun genau weiss: die cd4543 werden tatsächlich ausdrücklich als LCD-Steuerungen verkauft. Ich habe allerdings vor einiger Zeit bei einem Praktikum an meiner FH einen Versuchsaufbau vorgesetzt bekommen, bei dem LED-Displays damit angesteuert wurden. Habe mich gleich dazu entschlossen, auch eine Display- ansteuerung zu basteln. Diese habe ich nun fertig; sie läuft bei mir seit 6 Wochen im Dauerbetrieb: Habe 7Seg Display "dfk201" (Grün,13mm ziffernhöhe) angeschlossen; Die Helligkeit ist perfekt und die ICs werden nicht mal ein bisschen warm... Ich kann euch das auch echt empfehlen.Allein weil dieser IC total günstig zu haben ist. (ca.30 ct @ Reichelt), während ein "CC3161" IC glatt 2 Euros und mehr kostet und auch nicht mehr macht. (Ich brauche die Buchstaben A..F ja gar nicht) @Schmittchen Ich muss mich echt bedanken. Hab den Wald vor Bäumen nicht gesehen :-) Dann habe ich auch nicht mehr das Problem, dass die HEX-zahlen sich von den Dezimalen unterscheiden. Hast was gut bei mir. MfG
Na klar, die an der FH müssen es ja besser wissen, als der Hersteller des ICs selbst :-) Hauptsache, Du benutzt solche Edelbastlerlösungen nicht für Geräte, die Du kommerziell vermarkten willst. Überlast heißt auch nicht, daß der Chip außen heiß wird. Es reicht, wenn der nur wenige µm³ kleine Transistor im Chip heiß wird. Die Wärme verteilt sich aufs ganze Gehäuse, d.h. außen spürst Du natürlich nichts. Nur die Lebensdauer geht in den Keller. Billiger als die billigsten ICs sind immer noch gar keine zusätzlichen ICs. Also z.B. die Schaltung mit den 8 Widerständen und 4 Transistoren (8*2+4*7=44Cent). Peter
Im datenblatt des CD4543 steht doch ausdruecklich dass er auch fuer LEDs geeignet ist, besser noch: dafuer muss man nichtmal im datenblatt nachschauen. siehe auch http://focus.ti.com/docs/prod/productfolder.jhtml?genericPartNumber=CD4543B Ganz nach dem Motto "Wenns der Hersteller sagt sollts auch stimmen" mfg
Man sollte Datenblätter doch lieber ausdrucken, ich habs am Bildschirm glatt übersehen :-( Es ist kein Maximalstrom angegeben, so daß er auch nicht überschritten werden kann. Typisch sind 3mA bei 5V angegeben, was für nicht zu unempfindliche LEDs ausreichen kann. Damit sind auch die max 500mW eingehalten (7*3mA*5V=105mW), also dieser Chip geht nicht kaputt :-) Jeder kann sich mal irren, aber dazu ist ja so ein Forum auch da, um sowas zu klären. Ich habe andere ICs der 4000-Serie bei 15V betrieben und da sehr schlechte Erfahrungen auch bei nur kurzzeitiger Überlast gemacht. Deshalb meine Bemerkungen. Peter
Hmm... IC der 4000er Serie an 15 V ? Ich glaub nicht, dass das notwendig ist. Der IC tut mir leid; ich kannte bisher nur CMOS-Bausteine, welche mit 5V laufen. (ist ja eigentlich auch logisch, da CMOS-Standard 5V ist) Naja, wird schon einen Grund gegeben haben. Vielleicht gibts auch 4000er ohne CMOS-Bauweise. Schwamm drüber. Zu den 4543ern: Man fährt mit dem relativ geringen diff. Flusswiderstand des jeweiligen LED-Segments nicht zwangsläufig im Sättigungsbereich der Ausgangsstufe des ICs, sondern die interne Strombegrenzung pro Ausgang/Eingang liegt bei 3,7mA und ist die limitierende Größe. Wenn ich einen Ausgang kurzschliessen würde, könnten auch nur 3,7mA fließen. Ich erinnere mich da düster an Strombegrenzungsschaltungen mit Transistoren, deren Basisstrom vom Kollektorstrom gesteuert wird. Da kann man so lange kurzschließen wie man will, kaputt gehen kann da nix. Aber, ich kann mich irren. Falls schon mal jemand eine solche 4543er Ausgangsstufe überlastet hat, nehme ich meine Aussagen zurück. Ich kann ja auch nicht mehr wissen, als das meine Erfahrung mich gelehrt hat. Sicher sind 3,7mA zum leben zu wenig und zum sterben zu viel, aber meine doch recht großen Displays (korrekte Bez: D302PAI von Telefunken) begnügen sich damit und sind sehr gut ablesbar. Übrigens: Die angabe einer Toleranzklasse zB. "500mW" ist, soweit ich weiß, nicht Maßgebend für den Maximalstrom. Ich wäre natürlich froh, wenn ich so viel Strom dort raus saugen dürfte. Ich glaube es geht da um die Chip-Gehäuse und wieviel das Gehäuse vom Chip her (Überschusswärme) übernehmen kann. (Das hängt nur von der Bauform des Gehäuses und vom Chipvolumen ab.) Alle Klarheiten beseitigt ? MfG
Hi 4000er Logik kann üblicherweise von 3-15V absolut problemlos versorgt werden. Die 400er waren die CMOS-Gegenstücke zu den TTL's der 74er Reihe. Schrecklich langsam, und die ersten noch schrecklich empfindlich gegen ESD (keine Schutzdioden am Eingang) Heute gibt es einige dieser Reihe als 74HC4XXX in der 5V-CMOS-Technik. Matthias
Damit bin ich einverstanden. Ich kannte halt díe CMOS-Baureihe nur im 5V-Betrieb. Aber dennoch kann man zusammenfassend sagen: der CD4543 ist, soweit ich das bisher gesehen habe, eine extrem günstige alternative (kostet mittlerweile bei Texas Instr. 10ct/Stck) zu anderen BCD Decodern/Treibern für 7 Seg Displays. Wers gern Kräftig hell mag, kann ja Transistoren nachschalten. Aber ich frag mich, was passiert, wenn man die Versorgungsspannung des ICs von 5V auf 10V anhebt ?? Dann sollte ja eigentlich mehr Strom fließen, der mehr Licht entlockt. Geht das denn so einfach ?? Ich vermute, wenn das geht, dann gibt es tatsächlich die Möglichkeit den Chip zu zerstören. (ich traue dem Teil nicht mehr als 20mA pro Segmentausgang zu. Die Frage ist aber: würde es was bringen ? Wie seht ihr das ?
hmmm... >Wers gern Kräftig hell mag, kann >ja Transistoren nachschalten. >Aber ich frag mich, was passiert, wenn man die Versorgungsspannung >des ICs von 5V auf 10V anhebt ?? Dann sollte ja eigentlich mehr Strom >fließen, der mehr Licht entlockt. Geht das denn so einfach ?? aber ja, für kurze Zeit... je höher der Strom, desto höher die Verlustleistung, gell??? Die CD... bzw. HEF, HCF etc. war keinesfalls als Gegenstück der 54/74'er TTL-Serie gedacht (total unterschiedliche Pinouts, meist unterschiedliche Schaltungen etc.); erst die 74HC(T)xxxx-Serie bringt CMOS-Chips die gegen gleichnamige TTL's austauschbar sind. Einer der großen Vorteile war eben der große Spannungsbereich (3-15V; ich kenne sogar eine CMOS-Serie -- MMCxxxx -- die bis 18V spezifiziert war!!!); niedrige Spannung für langsame Schaltungen => niedrige Stromaufnahme, hohe Spannung für schnelle Schaltungen => hohe Noise-Immunität (pour les connaisseurs - es gab irgendwann sogar eine "langsame störsichere Logikfamilie" -- FZHxxx von Siemens -- die sogar bis 24V spezifiziert war - immer aus Gründen der Noise-Immunität). Aber all das ist Geschichte... Ansonsten gebe ich Danni Recht - bei so wunderbaren Controllern, die bis 40mA Strom per Pin "sinken" können, ist jeder zusätzliche Chip hinausgeschmissenes Geld, vorausgesetzt die Ports reichen aus... Preise von teilweise über 8 EUR für Chips a la ICM7219 sind total unbegründet, ich habe einen 90s1200 für ca. 60 Cent gekauft... Andererseits wird durch den Einsatz eines solchen Chips MASSIV an CPU-Leistung und Code-Speicher gespart, => es lohnt sich möglicherweise doch... @Kutschenegger: na ja, die VQE24's müssen auch irgendwo verbraten werden, gell?
Würde mich für dein selbstgebasteltes Display interresieren. Könntest du/ihr mir eine Schaltung für so ein 4 - stelliges Display schicken. Köntte mich revanchieren indem ich euch beim Schreiben einer Source im Assembler helfe. Kenne mich ziemlich gut aus.
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.