Hallo, Bin Neu hier und hoffe jemand kann mir helfen. Ich habe das Dual Zahlenssystem vor liegen , alle 16 Werte. Nur lownibble 4bit code, Highnibble liegt auf 0 Ich muss diesen aber auf einem 7 Segemnt ausgeben 0-9 mit Übertrag. Das Format liegt als 5 x 4bit vor. Wie geht dass, hat da jemand eine Idee? Wäre euch wirklich Dankbar gruss torro
Ich versteh Deine Frage nicht, was meinst Du mit "Format 5x4" ? Auf ein (also 1) 7-Segment ? Oder willst Du 5 Hex-Zeichen auf 5 7-Segmente ausgeben? Und was meinst Du mit Übertrag, was hat ein Übertrag mit der Ausgabe zu tun?
Ich habe die Frage auch nicht verstanden. Ich vermute, es handelt sich um eine Aufgabe für die Schule, die der Fragesteller selbst nicht verstanden hat. Es soll aber auch Aufgaben geben, die nichtmal vom Lehrer/Dozenten verstanden werden, der sie erteilt... ;-( ...
Hallo, Erst einmal danke für die raschen Antworten, Alos, zum ersten bekomme ich 5x 4bit in den Controller rein. jede 4 bit stelle steht für eine 7 Segment Anzeige, angeblich jedenfalls. Diie jeweiligen 4 bit werden im Dual zahlen Format geliefert, von 0000-1111, 16 stellen. Mein Problem ist aber das ich auf einem 7 segment ja nur 0-9 stellen habe. Also ist die Frage, wie stelle ich das Dual zahlen system mit 16 Werten in Dezimal 0-9 um. Das mit dem Übertag, habe ich gefragt weil doch bis 16 stellen gezählt werden, also ab der 10 stelle schon ein Übertag enstehen müsste, Denke ich jedenfalls. Ich hoffe das ist besser zu verstehen.
Hm...... Nächste Fragen: - Welcher Controller - Wie sind die Displays angeschlossen ? - Sollen die Stellen gemultiplext werden ? Otto
Hallo, Die Display,s werden gemultiplext. Die sind über Treiber Uln2803 angeschlossen Das Stellt auch kein Problemm für mich da. Atmel 89c4051 oder Höher.
Du brauchst eine Tabelle, in der die für jede Ziffer anzusteuernden Segmente aufsteigend hinterlegt sind. Auf diese Tabelle greift Du über die darzustellende Zahl zu. Beispiel: 2: Tabelle: xxxxxxxx ; Bitmuster 0 xxxxxxxx ; Bitmuster 1 xxxxxxxx ; Bitmuster 2 <- xxxxxxxx ; Bitmuster 3 xxxxxxxx ; Bitmuster 4 ...... xxxxxxxx ; Bitmuster 9 Somit addierst Du zur Basisadresse Deiner Tabelle Deine Ziffer und erhältst die auzugebende Kombination. Zuerst schaltest Du die rechte Stelle ein, gibst die Ziffer aus, dann die 2. von rechts usw. Otto
Hier ist dies für AVR beschrieben: http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
Allgemein üblich ist es, die 4 Bits im Hexadezimalsystem darzustellen also 0-9,A,B,C,D,E,F auf einer 7-Segmentanzeige nimmt man für die Buchstaben dann gerne Sonderzeichen in der Form _ _ |_| |_ | _| |_ |_ | | |_| |_ |_| |_ | Du musst nun in deiner Software eine Tabelle mit 16 Bytes anlegen. In jedem Byte steht dann ein Bit für ein Segment. Eine 1 bedeutet Segment ist eingeschaltet und eine 0 Segment ist ausgeschaltet. Für die Null könnte so ein Byte dann so aussehen: 11111100. Dabei habe ich jetzt folgende Belegung der Segmente mal angenommen: **A** Das Byte ist so aufgeteilt: ABCDEFGH F B **G** E C **D** H Um das Nibble nun umzurechnen in die Anzeige benutzt du das Nibble einfach als Pointer in deine Tabelle. Ist also dein Nibble 0 dann benutzt du aus der Tabelle den nullsten Wert. Ist das Nibble 9 dann halt den 9. Wert und ist es 15 dann den 15. Wert. Das ganze musst du natürlich für jedes der 5 Nibble machen. Soviel zu den Grundlagen. Programmieren musst du nun selbst. Sven
Danke das ist schon Gut so! Aber da wäre noch, Das hab ich ja schon gemacht, das Problemm das ich dann habe ist das bei der 16 ten stelle wieder die 0 auftaucht und nicht weiter gezählt wird. sonder nur wider von vorne beginnt.
> Das Format liegt als 5 x 4bit vor.
Das bedeutet, dass Du von aussen, eine Zahl erhältst.
Ob diese sich ändert oder nicht ist Wurst - Du gibst diese Zahl aus.
Somit gibt es auch leinen "Übertrag"
Oder habe ich Dich missverstanden ?
Ja ok, Ich versuche es noch einmal besser zu erklären. Mann muss es wohl so verstehen wie einen Zähler der rauf und runter zählen kann 00000-99999. Die ankommenden Daten ändern sich dem nach immer wieder, ich muss sie halt nur Darstellen können. Ich habe schon mit nem 16 Datenpointer gearbeitet aber das funzt nicht.
Es ist genauso, wie ich es vermutet und oben beschrieben habe..... Wo ist das Problem ?
Na das weiss ich nun auch nicht mehr, muss ich mal Prüfen ob ich nicht doch nen fehler gmacht habe.
Ja das ist wohl so! Ich habe es mit dem Datenpointer versucht aber er zählt wohl bis 9 und dann wieder null, aber von Schritt 15 auf 16 kommt wieder null. Und genau dann erfolgt auf dem Zweiten Display ein Übertrag. Der müsste aber doch eigentlich bei übergang 9 auf 0 entstehen. das ist wohl das Grösste Problemm. Oder habe ich euch da falsch verstanden?
Bekommst Du die Daten von aussen oder sollst Du selbst einen 5-stelligen Zähler aufbauen???????????????
Dual Codiert! Aber nur die lowwnibble! Also:0000 0000 0000 0001 0000 0010 0000 0011 __ 0000 1111 16 stellen etz..
Also hexadezimal - dann muss die Tabelle nach "9" noch die Bitmuster für "A" - "F" enthalten. Du wählst den ersten Daten-Eingangs-Port (Einer) an, "verundest" ihn mit 00001111, addierst den Wert zur Basisadresse der Tabelle, gibst diesen Wert an den ULN aus, schaltest die erste Stelle ein (die anderen aus). Dann nimmst du den zweiten Daten-Eingangs-Port, UND 00001111, Tabelle, an ULN, zweite Stelle ein. usw. Dann weiter mit der ersten Stelle......
> Mein Problem ist aber das ich auf einem 7 segment ja nur 0-9 stellen habe. Du hast mit 7-Segmenten 2^7 = 128 Darstellungsmöglichkeiten. Allerdings sind nur die wenigsten davon für einen Menschen direkt erkennbar, so z.B. die Zahlen 0-9. > wie stelle ich das Dual zahlen system mit 16 Werten in Dezimal 0-9 um. Das geht nicht, weil 0-15 (4 Bit) nicht in 0-9 dargestellt werden können. Du brauchst also 2 7-Segment-Anzeigen pro 4 Bit, insgesamt also 10 Anzeigen. Hast du die? Willst du nur die Dezimalzahlen 0-9, oder brauchst du auch die Umrechnung auf die Segmente? Du könntest es im so machen (Pseudocode):
1 | wenn input=0 dann seg10=11111110, seg1=1111110 // Anzeige 00 |
2 | sonst wenn input=1 dann seg10=11111110, seg1=0110000 // Anzeige 01 |
3 | sonst wenn input=2 dann seg10=11111110, seg1=1101101 // Anzeige 02 |
4 | : |
5 | sonst wenn input=15 dann seg10=01100000, seg1=1011011 // Anzeige 15 |
Ja aber, ich darf doch kein A-F darstellen! Nur 0-9. Wenn ich an den Datenpointer für die Nächsten stellen die werte für die Zahlen angebe funktoniert das nur bis 15 bei Sechszehn ist schluss dann kommt wieder 0. oder hab ich,s immer noch nicht geschnallt? Also ich habe es so verstanden: So Multiplexe ich die Anzeigen. Anzeige_Aktualisieren: MOV DPTR,#1550 MOV A,R0 MOVC A,@A+DPTR LCALL Anzeige_0 MOV A,R1 MOVC A,@A+DPTR LCALL Anzeige_1 MOV A,R2 MOVC A,@A+DPTR LCALL Anzeige_2 MOV A,R3 MOVC A,@A+DPTR LCALL Anzeige_3 RET Anzeige_0: MOV Port1,A CLR P3.0 LCALL Pause_1mS SETB P3.0 RET Anzeige_1: MOV Port1,A CLR P3.1 LCALL Pause_1mS SETB P3.1 RET Anzeige_2: MOV Port1,A CLR P3.3 LCALL Pause_1mS SETB P3.3 RET Anzeige_3: MOV Port1,A CLR P3.2 LCALL Pause_1mS SETB P3.2 RET Pause_1mS: MOV R7,#250 MOV R6,#100 Schleife0: Schleife01: DJNZ R7,Schleife0 DJNZ R6,Schleife01 RET (1550): DB 3Fh,06h,9Bh,8Fh,A6h,ADh,BCh,07h,BFh,A7h, 3Fh,06h,9Bh,8Fh,A6h,ADh DB Werte 0-9
> Ja aber, ich darf doch kein A-F darstellen!
Dann dürfen Deine Eingabedaten auch nur im Bereich 0-9 liegen !
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
Hallo Lothar, Ich brauche nur die 0-9. Das hab ich ja schon so versucht, dann habe ich aber immer das Problemm das nach der 15 nicht 16 sondern 0 auftaucht. Und dann noch der Übertag, der taucht ja auch erst bei der 16 auf, also wieder null. Das ding zählt halt 0-15 nicht 0-9, das ist wohl das Problemm.
Hallo otto, Ja das wäre dann sehr hilfreich, aber das ist ja nicht gegeben. Die Daten gehen halt von 0-15 stellen. Das ist ja mein Problemm. Und ehrlich gesagt habe ich echt keinem Ahnung mehr wie ich das machen soll. Es muss aber einen weg geben!
Deine Ziffern liegen in den Registern R0-R3, also nur 4 Stellen. Wie kommen die Daten denn in die Register?
Das wahr nur ein auszug aus einem Programm für 4 7 Segment anzeigen. Funktioniert aber auchmit einer mehr. Kann man einfach Dranhängen. Die Daten werden über den Timer eingelesen und dann in die Register kopiert!
Du liest die Ziffern von insgesammt 5 Ports mit jeweils 4-bit ein? Jeder Port enthält die 4-bit einer Ziffer? Es soll maximal eine 5-stellige Zahl dargestellt werden? Dann macht es keinen Sinn höhere Werte als 9 einzulesen ! Im Prinzip kannst Du es zwar, indem Du vergleichet, ob die Ziffer >9 ist und dann einen Übertrag auf das nächste Register addierst, aber irgendwie ergibt das keinen Sinn..............
Hilfe Hilfe! Ja das ist es ja gerade, ich versteh es ja selber schon nicht mehr! Ber nun noch einmal etwas Genauer: Ich lese jedes Bit über den Timer ein, je Bit ist eine zeit von ca 2us zeit, nicht mehr. Vieleicht mach ich ja da schon nen fehler, Und dann wandel ich sie um in ein lownibble, also 4 bit. Umwandlung: CLR A MOV R0,ffh 'Zusammen Setzen des ersten Blocks in ein Register R0 MOV A,24h 'Das Protokoll muss Rückwärts wieder hergstellt werden XRL A,R0 RL A MOV R0,A MOV A,23h XRL A,R0 RL A MOV R0,A MOV A,22h XRL A,R0 RL A MOV R0,A MOV A,21h XRL A,R0 CPL A MOV R0,A 'Ende des Zusammen setzen des Register R0 So komme ich zu den 4 Bit in einem Register, und so soll es auch sein!
Jetzt rück schon damit raus, was das genau soll oder wie die Aufgabe ist.....
Die Aufgabe ist innerhalb einer Zeit die Bits ein zu lesen um zu wandel und die werte Anzeigen. Die einkommenden Wertde ändern sich jede Sekunde, dann kommt eine neues Datenprotokoll. Ich muss die Daten (Einzelne Bits 25 gesamt) in 4 bit Segmente zusammen fassen und umwandel. und dann auf 5 7 Segmenten ausgeben. Für eine Ziffer werden ja nur 4 bit (Lownibble ) benötigt. Ist dich Richtig? Das Problemm das ich damit nur habe ist das, das der sender des Daten Protokolles Praktisch von 0-15 Zählt und dann den Übertag sendet, und nicht bei 0-9 und dann den Übertrag! Was ja normal wäre! Ich bin so langsam echt verzweifelt und weiss wohl auch überhaupt keine Rat mehr.
> Ich muss die Daten (Einzelne Bits 25 gesamt) in > 4 bit Segmente zusammen fassen und umwandel. und > dann auf 5 7 Segmenten ausgeben. Welche Information enthalten die 25 Bit ? 25 Bit ergeben so wie von Dir beschrieben 7 Stellen 1 1111 1111 1111 1111 1111 1111 7 6 5 4 3 2 1
Ja das Richtig, aber es geht nur um die ersten 20! Die anderen sind für andere aufgaben. Ich bin wohl so langsam schon ein wenig Durch mit zahlen. 1111 1111 1111 1111 1111 5 4 3 2 1 Jeder einzellen Block stellt eine 7 Segment Anzeige dar. so ist es Richtig verstanden! Hätte ich ja vieleicht auch so erklären können, aber das ist mir wohl nicht mehr in den Sinn gekommen. Aber nun kommts, mit vier bit kann man ja von 0-15 Zählen im Dualen system. Und genau das ist es auch, die ankommenden Daten vermitteln einen Übertag bei 15 auf 16 te stelle (also von 15 auf 0 ). Vieleicht muss man diese ausbleden und eine eigenen Übertag erstellen, aber wie geht das?
Also ich hab mir jetzt hier den ganzen Tread durchgelesen. Und ich muss sagen, die Antworten/Beschreibungen von el.torro (Gast) werden immer unklarer. Deshalb jetzt folgenden klare Aufgabe an el.torro (Gast): Du sagst, du hast 5 x 4bit. Diese sollen eine Anzeige steuern. Dann gib mal einige Beispiel, was an 5x4bit "reinkommt" in die Schaltung, und was diese bei diesem Eingangsmuster ausgeben soll. Ich mache mal ein Beispiel: 1. 2. 3. 4. 5. Anzeige -------------------------------------------------------- 0000 0001 0010 0100 1000 '01248' ... So jetzt gib mal paar Beispiele. SOnst kann dir hier keiner helfen
Du bekommst nach eigenen Angaben 5 Ziffern mit einem Wert von 0 - 15. Diesen Wert sollst du auf 7-Seg. anzeigen. Du verwendest dafür 5 Register um je 4 Bit zu speichern. z.B. R0-4 01 02 03 04 05 -> Ausgabe 12345 R0-4 01 0F 0A 03 0D -> Ausgabe 129597 Mache aus den 5 Ziffern die du erhäst eine zusammenhängende Zahl in Hex. Diese dann in BCD wandeln (Codebeispiele im Forum) und mit Tabelle (wie oben) ausgeben. gruß hans
Hallo Matthias, Ja das ist vollkommen Richtig! die 0000 steht für Null die 0001 steht für eins und so weiter bis 15 aber die 10,11,12,13,14,15 kann ich ja nicht Anzeigen auf einem 7 Segment. Die Gesamt Anzeige könnte also demnach 12347 oder 13157 oder 04672 lauten.
Hallo hans, Das hört sich Gut an, wie geht es denn genau? So etwas habe ich noch nict ausprobiert. Könntest du mir da noch ein wenig Hilfe leisten?
Man Junge! MAch mal paar komplette Angaben! ALLE EIngänge! Nicht nur 4bits!! Gib mal paar Beispiele für alle zB. 1. 2. 3. 4. 5. Anzeige -------------------------------------------------------- 0000 0001 0010 0100 1000 ? 1100 1001 0010 0010 1110 ? 1111 0100 0001 0100 1000 ? 0010 1000 1111 0000 0000 ? So. Jetzt ersetze mal die ? durch das, was bei dieser Bitkombination angezeigt werden soll.
Ok mach ich 1. 2. 3. 4. 5. Anzeige -------------------------------------------------------- 0000 0001 0010 0100 1000 ?01248 1100 1001 0010 0010 1110 ?12,9,2,14 1111 0100 0001 0100 1000 ?15,4,1,4,8 0010 1000 1111 0000 0000 ?2,8,15,0,0 So sehen die Daten aus die Rein kommen! Also auch Zweistellige zahlen. Und da liegt mein Problemm! Also anstelle von 12 müsste ich ja eine 1 und eine 2 ausgeben. Das geht wohl auch, aber nach 15 kommt ja dann wieder 0. Icch hoffe du verstehst mein Problemm nun! ansomnsten bin ich echt gexxxxt!
Ok mach ich 1. 2. 3. 4. 5. Anzeige -------------------------------------------------------- 0000 0001 0010 0100 1000 ?01248 1100 1001 0010 0010 1110 ?12,9,2,2,14 <---- hatte nen fehler 1111 0100 0001 0100 1000 ?15,4,1,4,8 0010 1000 1111 0000 0000 ?2,8,15,0,0 So sehen die Daten aus die Rein kommen! Also auch Zweistellige zahlen. Und da liegt mein Problemm! Also anstelle von 12 müsste ich ja eine 1 und eine 2 ausgeben. Das geht wohl auch, aber nach 15 kommt ja dann wieder 0. Icch hoffe du verstehst mein Problemm nun! ansomnsten bin ich echt gexxxxt!
Hallo Torro, sei mir nicht böse, aber ich glaube, dass Du die Aufgabe nicht verstanden hast..... Otto
Nach 15 kommt wieder 0 ist ja Hexadezimal. Also die Standartdarstellung für ein Halbes Byte, ein Nibble. Zwei Nibbel zusammengefast ergeben 1 Byte mit einem Wertebereich von 0 - 255. Du hast 5 Nibbel die du in 2 1/2 Byte anordnen kannst. Wertebereich 0 - 1048575 also 7 Stellen für die Anzeige. 1. 2. 3. 4. 5. Anzeige -------------------------------------------------------- 0000 0001 0010 0100 1000 ?01248 0001248 1100 1001 0010 0010 1110 ?12,9,2,14 0889390 1111 0100 0001 0100 1000 ?15,4,1,4,8 0999752 0010 1000 1111 0000 0000 ?2,8,15,0,0 0167680 Die Umwandlung ist ein HEXtoBCD-Konverter (Suchfunktion, Zalenausgabe für Anzeigen). gruß hans
Hallo Otoo, ja das könnte auch sein, wobei es eigentlich nur lautet, die daten ein zu lesen um zu wandel und an zu Zeigen. Die Daten kommen als einzelene Bits und sollen als Block zu je vier bit, das heist wenn vier Bit vorhanden es kommen je Block auch nur 1 oder 2 oder 3 bit an je nach zahl, aber maximal vier. die sollen zusamengesezt werden als ein Nibble und am ende als Zahlen Angezeigt werden. Da gibt es nicht so viel falsch zu verstehen, Denke ich! Mein Problemm liegt ja auch nicht darin nicht Angezeigt zu bekommen, aber wie schon beschrieben kann ich nur 0-9 anzeigen bekommen aber im Prinzip 0-15 zu fressen. Verstehen kann ich es auch nicht , aber es ist sooo! Und irgentwie muss es wohl machbar sein.
Hallo hans, HEX zu BCD Konverter hört sich gut! Vielen Dank erst einmal, noch an alle die hier geholfen haben! Werde ich nachsehen und ausprobieren, od das geht. l.b gruss an alle el.torro
ich denke, dass Du eine Binärzahl umwandeln sollst. Beispiel: 1111 1111 = 255 Somit musst Du feststellen, ob sich die Zahl durch die Wertigkeit jeder Stelle teilen lässt oder nicht - wenn nicht, ist die Ziffer 0 10.000 0 1.000 0 100 2 10 5 1 5
>1. 2. 3. 4. 5. Anzeige >-------------------------------------------------------- >0000 0001 0010 0100 1000 ?01248 >1100 1001 0010 0010 1110 ?12,9,2,2,14 <---- hatte nen >fehler >1111 0100 0001 0100 1000 ?15,4,1,4,8 >0010 1000 1111 0000 0000 ?2,8,15,0,0 Was sollen denn die Fragezeichen? Hast du ne schriftliche AUfgabenstellung?
Frag doch den Lehrer, wie die Aufgabenstellung lautet und überlege es selbst. Anstatt das Forum zu fragen: - wie die Aufgabenstellung sein könnte (Kristallkugeln sind sehr selten im Jahre 2009) - wie die Lösung aussehen könnte (wenn Du die Aufgabe verstanden hast, wirds wohl eine recht einfache Datenwandlung von Format A nach B sein)
>Mein Problemm liegt ja auch nicht darin nicht Angezeigt zu bekommen, >aber wie schon beschrieben kann ich nur 0-9 anzeigen bekommen aber im >Prinzip 0-15 zu fressen. Na und, dann sind die Codes für 10-15(A-F) eben normal dekodiert nicht darstellbar. Man nennt die auch Tetradencodes. Das ist das was man auch Redundanz nennt (Nicht benutze Codes). Alternativ lassen sich auch die Codes 10-15 auf eine 7-Segmentanzeige dekodieren (per Software oder Hardware)und ausgeben. _ |_ _ _| |_ |_ |_| |_| |_ |_| |_ | 10 11 12 13 14 15 A B C D E F
bei 1001 will er NEUN (9) sehen .....auf einer 7-Segment-Anzeige für das "A" will er ELF (11) sehen...auf zwei 7-Segment-Anzeigen für das "B" will er ZWÖLF (12) sehen..... Er muß mit den Binärwerten und deren Komplement einen eigenen Decoder brennen.
was-willst-du wrote: > Frag doch den Lehrer, wie die Aufgabenstellung lautet und überlege es > selbst. > > Anstatt das Forum zu fragen: > > - wie die Aufgabenstellung sein könnte > (Kristallkugeln sind sehr selten im Jahre 2009) > - wie die Lösung aussehen könnte > (wenn Du die Aufgabe verstanden hast, wirds wohl eine recht > einfache Datenwandlung von Format A nach B sein) und ich denke auch, dass du die Aufgabe zweiteilen sollst. Der eine Teil ist die reine Ausgabe. Da gehts nur darum, jeweils ein Nibble an die richtige 7-Segmentánzeige zu bringen. Der andere Teil der Aufgabe ist es, aus einer Binärzahl die Nibble entsprechend aufzubereiten. Beides hat erst mal nichts miteinander zu tun. Daher solltest du es auch nicht miteinander verwurschten.
Hallo, Ja ich habs so einiger massen, Dank eurer Hilfe hier imm Forum. Hex zu Bin war ein Guter Tip, das Brachte mich auf eine ander Idee. Also das Ganze wahr wohl eine finte, aber das hatte ich schon vermutet. Es Funktioniert insoweit als das es nun von 0-255 hochzählt. Warum: Ich habe zwei 4bit Register die ja nur mit dem Lownibble geladen waren zusammen gefasst zu einem 8 bit Register. Denn daraus Resultierenden Hex wert durch Division #10d Geteilt und den Rest an Die 7Segment gesendet. Funtz bis 255. Aber ich habe ja 5x4 bit. Wie kann ich die anderen noch dazu rechnen. Ich Denke mann muss es wohl so sehen: 0001 0010 0011 1010 1011 alles in einer Reihe ist der Gesamt wert 1 2 3 10 11 für alle Display,s. Es muss also alles irgend wie zusammen gerechnet werden und dann alle DisPlay,s daraus errechnet werden, dann hab ich auch nicht diese seltsame sache mit dem Übertrag bei stelle 15. Ich habe aber nur ein 8 bit Register und kann demnach nur immer Zwei zusammmen fassen. Wie bekomme ich alle anderen Daten noch dazu.
Verstehe nicht wo du einen Übertrag überhaupt hast? Der kommt doch gewöhnlich nur beim Rechnen in einem Akku-Register vor. Bisher hab ich nur verstanden das du von einer Datenquelle 4 Bit parallel und x5 Nibbel seriell hast um die auf 5 x 7 Segmentanzeigen auszugeben oder hab ich das falsch verstanden? Übrigens ist Binär 0-15 und Hex 1-9,A-F das selbe, oder nicht? Nur die Darstellung ist eben anders. Muß eben Sinngemäß dekodiert werden von einem Dekoderchip oder per Software? Eine mehr visuelle Beschreibung wäre vielleicht etwas verständlicher, z.B. über die verwendete Hardware. Das könnte zumindest ein paar Fragen erklären.
Also zur Funktion! Hardware ist: AT89c4051 Uln 2803 Treiber, Daten vom Controller zu den 7 segment Anzeigen BC558 Transistoren zum ein und Aussachalten der einzelnen 7 Segmente beim Multiplexen. Zuerst einmal Bekomme ich Maximal 20bit Hintereinander Gesendet,jedes Bit hat etwa 2 us Bestand Zeit, dann kommt entweder nix oder das Nächste. 0001 0110 0011 0010 0100 soo sieht es aus! Wuste ich aber vorher auch nicht! Jede Sekunde kommt ein neues Protokoll mit neuen Daten. Das in diesem Daten protokoll der Übertag zum jeweils Nächsten Digit im dem davor erzeugt wird wuste ich auch nicht! Ok das Habe ich ja erledigt, alle Bits werden über Timer TL1 innerhalb einer Zeit spanne eingelesen. Das Funktioniert 100%. Das entspricht der Vorgabe! Nun Soll ich die bits in 4 bit gruppen gruppieren, also "logisch" 5x4 bit ( = 5x nur Lownibble). Dann soll ich die Werte errechen und zur anzeige bringen! Das ist es schon an Vorgabe! Denn Rest muss ich heraus finden! Über das Format wurde keine Ausssage getroffen, das es Dual ist habe ich herraus finden müssen. Es häte ja auch einfach BCD, Aiken etz.. sein können. Ok soweit so Gut! Nun habe ich die Daten eingelesen und mit Folgender Funktion zu den 4 bit Gruppen gebildet. _________________________________________________ ____ 'TL1 Speichert die ergebnisse in die Register 21h aufwärtz _________________________________________________ ________________ Lownibble bilden _________________________________________________ _________________ CLR A MOV R0,ffh 'Zusammen Setzen des ersten Blocks in ein Register R0 MOV A,24h 'Das Protokoll muss Rückwärts wieder hergstellt werden XRL A,R0 RL A MOV R0,A MOV A,23h XRL A,R0 RL A MOV R0,A MOV A,22h XRL A,R0 RL A MOV R0,A MOV A,21h XRL A,R0 MOV R0,A 'Ende des Zusammen setzen des Register R0 _____________________________________________ So habe ich nun ein Lownibble ( 5 lownibble in R0 bis R4) aus den einzellnen Daten gebildet. Nun Weiss ich ja mittlerweile des es nicht ein Lownibble für ein Digit in diesem Sinne ist, wegen dem Übertrag. Also habe nun aus Zwei Register mit nur lownibble R0 ,R1 ein Register R3 mit 8 Bit High und lownibble gebildet. Danach habe ich mit der DIV Funktion den Hex wert immer durch #10d geteilt und immer den Rest zu einem 7 Segment Gesendet,und weiter geteilt bis null. HEX u BCD Wandlung! Ok das Funktioniert auch und nun zählt er bis 255. Aber ich habe 20 bit ingesamt und bislang nur 8 bit verwendet. Meine Problemm ist nun, wie kann ich die noch verbleibenden 12 bit Verarbeiten. Den Ich habe doch nur ein 8bit register und diese ist mit den ersten 8 bit schon voll beschrieben, ansonsten würde es ja nicht bis 255 zählen.Denke ich jedenfalls? Ich kann natürlich die nächsten8 bit in einem Anderen Register zusammen fassen aber dan habe ich ja das Problemm mit dem Übertrag am 255 aufwärtz. Da bislang ab 255 wieder bei 0 begonnen wird und mir somit ja 255 fehlen. Denn ich müsste ja als nächstes mit 256,257,258 weiter zählen. Also ich bemeke gerade selber das es unheimlich schwer ist das Ganze Gedanken Gut nieder zu schreiben und zu erklären.Um so schwerer ist es wohl es zu verstehen! habt Gedult mit mir! Ich Denke ich muss aus den eingelsenen Daten bits ein Gesamtwort in zb..HEX erstellen und daraus die 5 Digits raus rechnen. Liege ich da Richtig? Wenn ja, nur wie geht das? Ich hoffe ihr verstehst nun die sache, aber wen nicht frag einfach explizit nach. Na ja eines hab ich jedenfalls mal wieder gelernt. " man wird so alt wie ne kuh und lernt immer noch dazu" ! gruss el
Hallo ACDC, Der Übertag entsteht dadurch das dieses Daten Protokoll 4 bit Dual Code sendet, mit dem kann man aber mit Pseudotetraden von 0-15 zählen. Und so ist es wohl auch es kommen alle 16 varianten vor. Somit muss zwangsweise ab der 09 stelle ein Übertag erfolgen der schon für die nächste Anzeige ist. Das wuste ich aber vorher auch nicht! Solche Vorgaben muss ich schon selber heraus finden! Ich hoffe die Vorran gegangen Beschreibung erklärt es zimmlich Gut. gruss el
Dein Problem ist, dass du eigentlich 24 Bit Arithmetik betreiben solltest anstatt das alles auf 8 Bit Ebene isoliert abzuhandeln. Ich würde mal damit anfangen mir zu überlegen, wie ich 2 24-Bit Zahlen (aufgeteilt auf mehrere Register) addieren bzw. subtrahieren kann. Mehr brauchst du dazu nicht. Prinzip (anhand einer Dezimalzahl gezeigt) du hast eine Zahl 378 und sollst die so zerlegen, dass du die Hunderter, Zehner und Einer einzeln kriegst. Nichts einfacher als das Du subtrahierst in einer Schleife ständig 100 und zählst mit wie oft das ging. Zahl = 1238 Cnt = 0 while( Zahl > 0 ) { Zahl = Zahl - 1000 Cnt = Cnt + 1 } ; an dieser Stelle enthält Cnt die Anzahl der Tausender ; diese werden auf die Stelle für Tausender geschrieben Zahl = Zahl + 1000 Cnt = 0 while( Zahl > 0 ) { Zahl = Zahl - 100 Cnt = Cnt + 1 } ; an dieser Stelle enthält Cnt die Anzahl der Hunderter ; diese werden gleich mal auf die 7-Seg Stelle für Hundert geschoben Zahl = Zahl + 100 Cnt = 0 while( Zahl > 0 ) { Zahl = Zahl - 10 Cnt = Cnt + 1 } ; an dieser Stelle enthält Cnt die ANzahl der Einer ; diese werden gleich mal auf die 7-Seg Stelle für Einer geschoben Zahl = Zahl + 10 ; übrig sind die Einer ; an die entsprechende 7-Seg Stelle schieben Bei deinen 24-Bit Zahlen ist das im Prinzip auch nicht anders. Nur dass du mit 24 Bit höher als bis 9999 zählen kannst. Da deine Zahlen aber anscheiend sowieso nicht größer als 99999 (also 5 STellen, entsprechend 5 Stück 7-Seg Anzeigen) werden können, reicht es wenn du einfach noch abzählst wieviele Zehntausender in der ursprünglichen 24-Bit Zahl anthalten sind. Der SChlüssel zum ganzen liegt aber darin, dass du von einer 24-Bit Zahl (nämlich deiner Vorgabe) die 24-Bit Zahl 0010011100010000 (entspricht 10000 dezimal) abziehen kannst.
>Jede Sekunde kommt ein neues Protokoll Eigentlich würde ich das als Datenstrom und nicht als Protokoll beschreiben aber ich glaube das das schon verstanden wurde. >Dann soll ich die Werte errechen und zur anzeige bringen! Was soll denn da errechnet werden? Willst du nicht nur die übertragenen Daten ausgeben oder irgendwelche Ergebnisse? >Über das Format wurde keine Ausssage getroffen, das es Dual ist habe ich >herraus finden müssen. Es häte ja auch einfach BCD, Aiken etz.. sein >können. Dual(Basis 2) ist ein Code wie BCD(Basis 10),Binär(Basis 16), oktal(Basis 8) usw., aber lassen wir das. CPU`s können nur Dual verarbeiten,oder? >Ich kann natürlich die nächsten8 bit in einem Anderen Register zusammen >fassen >aber dan habe ich ja das Problemm mit dem Übertrag am 255 aufwärtz. Wenn du das Register nicht shiftest passiert dem Datum(singular von Daten) nichts. Das verhält sich wie ein RAM. Ist eben eine Frage wie du deine Daten organisierst und programmierst. Mit 8 Bit sind eben 256 Zahlenwerte (inkl.0)möglich, mit 2x8Bit=16Bit schon 65536 Zahlenwerte möglich. Ich sehe allerdings nicht das das irgendwie dein Problem löst. Daher hier mal ein Schuß ins Blaue. Lege ein Datenfeld(array) im Ram an in dem der Bitcode für die 7-Segmentanzeige steht. Tabellen stehen meist in den DAtenblättern div. Dekoderchips oder man setzt sich hin und macht selbst eine Wahrheitstabelle. Brauchst ja nur 7 der 8Bit. Mit den empfangenen Zeichen steuerst du dieses Array an und die Anzeige zeigt die Zahl an. Mußt dann mit einer Routine alle empfangene Daten (Datum für Datum)lesen und dann über das Array ausgeben und dann wieder von vorne. Ansonsten fällt es mir schwer eine andere Lösung anzubieten. Für heute mach ich dann erst mal Schluß.
Mir spukt immer wieder diese Aussage im Kopf rum > Nun Soll ich die bits in 4 bit gruppen gruppieren, > also "logisch" 5x4 bit ( = 5x nur Lownibble). > Dann soll ich die Werte errechen und zur anzeige bringen! > Das ist es schon an Vorgabe! Es tut mir leid. Aber das einzige was da halbwegs vernünftig zu dieser Aussage passt, ist: Auf den 5 7_Segment Anzeigen wird eine HEX Anzeige realisiert. Jedes Nibble wird als Hex-Zahl 0 bis F dargestellt. Kann es sein, dass du übereifrig die Aufgabe verkomplizierst und dem Auftraggeber angeboten hast, dass er eine Dezimale Anzeige kriegt? Wenn ja, dann war das nicht sehr schlau! Deine 5 Nibbles als Hex-Zahlen anzuzeigen ist trivial. Deine 5 Nibbles als 24 Bit Zahl in Dezimaler Form anzuzeigen ist ... nun, ja ... anspruchsvoll, wenn man sowas noch nie gemacht hat.
Hallo Karl heinz, Mehr aussage hab ich ja nicht!!! Aber das mit den (Vier bit Grupieren für eine Anzeige) ist ja nicht weitergeführt worden. Will heissen das ich Glaube das es Absichtlich nicht explizit erklärt wurde um mich in die irre zu führen. Das Ganze ist ein Übungsprojekt, hab nur ein Kleines Gerät welches die Taktung bringt, in einem Gehäuse verschlossen so das ich nicht hinein sehen kann! Muss die Platine und Software dazu abliefern. Dazu die Trifiale Beschreibung, als Übung! Wenn bedenkt das ich erst einmal mir das Osiloskop zur hand genommen habe und eine Schreck bekamm über diese Daten. Ich Wuste auch nicht das es Dual system ist, es ist nicht BCD da sind die 01 Variationen etwas anders. Aber OK! Ich Denke das mit dem 20 bit system ist es wohl, muss mir halt nun Überlegen wie das geht! Hab ich ja nun alles soweit! Ich Danke euch Nochmal für eure bisheriege hIlfe herzlichst, gruss el
Ich vermute, dass dein Lehrer von dir einfachh nur einen Binär-Siebensegment-Decoder haben will. Mit Schaltplan und Layout. Dazu ugehört natürlich auch, dass du Bauteile bestimmst.
> Binär-Siebensegment-Decoder haben will.
Oder sogar nur einen BCD-Siebensegment-Decoder... ;-)
Denn die ganze Eierei mit den Überträgen usw. erscheint mir recht
praxisfremd. Schau Dir die Aufgabenstellung nochmal genau an.
...
Hannes Lux wrote: >> Binär-Siebensegment-Decoder haben will. > > Oder sogar nur einen BCD-Siebensegment-Decoder... ;-) > > Denn die ganze Eierei mit den Überträgen usw. erscheint mir recht > praxisfremd. Meine Rede. Genau das denk ich auch Da 5 Nibbel rein dort auf 5 Sieben-Segment Anzeigen raus Jedes Nibble als Hex-Ziffer ( 0 - 9, A, B, C, D, E, F ) auf eine Anzeige. Fertig. (Ganz abgesehen davon, dass man mit 20 Bits höher zählen kann, als man mit 5 Stellen anzeigen kann)
>Meine Rede. Genau das denk ich auch
Ich bezog mich auf das Eingangspost.
Mich würde die Überschrift der Aufgabe interessieren. Im Regelfall
bekommt man Aufgaben (in der Schule) doch schriftlich. Ich kann mir
nicht vorstellen, dass der Lehrer dem torro einfach so eine Schaltung in
die Hand drückt und sagt: "So, mach mal!". In irgendeinem Zusammenhang
mit dem Unterrichtsstoff dürfte die Aufgabe stehen.
Naja, morgen ist das halbjährige Projekt vermutlich zuende... ;)
Hallo, Leider muss ich euch sagen das es genau so Ist!!! Die Aufgabe wahr genau so einfach gehalten nur ein paar Bedingungen ohne weitere infos. Aber OK, Das wahr eigentlich so im Nachhinein Betrachtet auch Gut so. Ich denke so lernt man wohl auch mit Recht eigentümlichen Dingen um zu gehen. Das Wahr ja wohl auch Voll absicht von ihm, Denke Ich. So und nun darf ich mich noch einmal Herzlichst bei euch Allen die hier mitgewirkt haben Bedanken. Vielen Danke für eure Kompetenten Ratschläge, dies hat zu erfolg geführt. Es Funkktioniert einwandfrei!!! Ganz einfach hex zu BCD Routine, das wars schon. Mal sehen was er dazu sagt, so und nun muss ich noch schnell ne Platine Zaubern.Die ganzen Drähte möchte ich ja nicht Vorzeigen.
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.