Forum: Mikrocontroller und Digitale Elektronik Dual Zahlen für 7 Segment ausgabe umrechnen


von el.torro (Gast)


Lesenswert?

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

von nixVerstaan (Gast)


Lesenswert?

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?

von Hannes Lux (Gast)


Lesenswert?

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... ;-(

...

von el.torro (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Hm......

Nächste Fragen:

- Welcher Controller
- Wie sind die Displays angeschlossen ?
- Sollen die Stellen gemultiplext werden ?

Otto

von el.torro (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?


von Sven S. (stepp64) Benutzerseite


Lesenswert?

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

von el.torro (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

> 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 ?

von el.torro (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Es ist genauso, wie ich es vermutet und oben beschrieben habe.....

Wo ist das Problem ?

von el.torro (Gast)


Lesenswert?

Na das weiss ich nun auch nicht mehr, muss ich mal Prüfen ob ich nicht 
doch nen fehler gmacht habe.

von el.torro (Gast)


Lesenswert?

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?

von Otto (Gast)


Lesenswert?

Bekommst Du die Daten von aussen oder sollst Du selbst einen 5-stelligen 
Zähler aufbauen???????????????

von el.torro (Gast)


Lesenswert?

Ich bekomme die Daten von aussen!

von Otto (Gast)


Lesenswert?

OK - sind die Stellen dezimal oder hexadezimal ?

von el.torro (Gast)


Lesenswert?

Dual Codiert!
Aber nur die lowwnibble!
Also:0000 0000
     0000 0001
     0000 0010
     0000 0011
  __
     0000 1111
 16 stellen
 etz..

von Otto (Gast)


Lesenswert?

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......

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von el.torro (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

> 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

von el.torro (Gast)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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!

von Otto (Gast)


Lesenswert?

Deine Ziffern liegen in den Registern R0-R3, also nur 4 Stellen.

Wie kommen die Daten denn in die Register?

von el.torro (Gast)


Lesenswert?

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!

von Otto (Gast)


Lesenswert?

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..............

von el.torro (Gast)


Lesenswert?

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!

von Otto (Gast)


Lesenswert?

Jetzt rück schon damit raus, was das genau soll oder wie die Aufgabe 
ist.....

von el.torro (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

> 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

von el.torro (Gast)


Lesenswert?

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?

von Matthias L. (Gast)


Lesenswert?

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

von hans (Gast)


Lesenswert?

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

von el.torro (Gast)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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?

von Matthias L. (Gast)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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!

von el.torro (Gast)


Lesenswert?

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!

von Otto (Gast)


Lesenswert?

Hallo Torro,

sei mir nicht böse, aber ich glaube, dass Du die Aufgabe nicht 
verstanden hast.....

Otto

von hans (Gast)


Lesenswert?

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

von el.torro (Gast)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

>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?

von was-willst-du (Gast)


Lesenswert?

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)

von AC/DC (Gast)


Lesenswert?

>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

von Wolf (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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.

von AC/DC (Gast)


Lesenswert?

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.

von AC/DC (Gast)


Lesenswert?

Hex 0-9,A-F muß es natürlich heißen.

von el.torro (Gast)


Lesenswert?

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

von el.torro (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von AC/DC (Gast)


Lesenswert?

>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ß.

von Karl H. (kbuchegg)


Lesenswert?

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.

von el.torro (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Hannes Lux (Gast)


Lesenswert?

> 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.

...

von Karl H. (kbuchegg)


Lesenswert?

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)

von STK500-Besitzer (Gast)


Lesenswert?

>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... ;)

von el.torro (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.