Binäre Werte zusammen fügen

sofimole

Neues Mitglied
04. Jan. 2009
4
0
1
Sprachen
Hallo Leute,
ich stelle soeben fest, daß es gar nicht so einfach ist (m)ein Problem zu schildern.

An den pins C4 C5 C6 C7 eines 8535 liegt z.b die Binäre information 1001 für Dez 9 an.

Ich frage nun mit Bascom die 4 pin nacheinander ab und habe dann 4 byte Variabeln zb. var1 var2 var3 var4.

Wie kann ich nun die 4 Variabeln zusammenfügen , daß der inhalt "1001" ergibt.

gruß sofimole
 
Hallo Sofimole,

ich kenne mich zwar mit Bascom nicht so aus, aber unabhängig von Bascom dürfte der schnellste Weg die vier Bit in die Byte-Variable zu bekommen folgender sein.
  • das ganze Pin-Register in deine Byte-Variable kopieren
  • dann entweder die Variable um 4Bit nach rechts shiften oder
  • die oberen 4Bit mit den unteren 4Bit tauschen (die AVRs haben hierfür den Instructioncode "swap" - Bascom wird sicherlich etwas ähnliches unterstützen), ggf. dann noch das Byte maskieren, damit die oberen 4 Bit in jedemfall "0" sind (zum Beispiel in der Art Variable = Variable AND 0x0F)
Vielleicht hilft dir das ja etwas weiter.

Grüße,
Dirk
 
Problem gelöst

Halo Dirk,
danke für deinen Vorschlag.

Ich habe einen anderen Weg eingeschlagen.
Die Byte Variable Var1 mit 1 multiplizieren, die var2 mit 2, die var4 mit 4 und
die var8 mit 8. Am schluss alles zusammenzählen. Fertig ;-)

Gruß sofimole
 
Hi sofimole,

ich kann mich Dirk nur anschließen! Den Port direkt in ein Byte einlesen, die relevanten Bits ausmaskieren und an die richtige Stelle schieben. Das ist sicher die saubere Lösung.

Du kannst es natürlich auch auf die Multiplikationsmethode machen. Geht schon auch. Verursacht nur mehr Aufwand, mehr Code, mehr Rechezeit. Bei Rechenintensiven und zeitkritischen Aufgaben versucht man solch etwas eher zu vermeiden.

Grüße,
Markus
 
Die Byte Variable Var1 mit 1 multiplizieren, die var2 mit 2, die var4 mit 4 und
die var8 mit 8. Am schluss alles zusammenzählen. Fertig ;-)


Hallo !

Sorry Leute, ich dürft mich ja ruhig schlagen, aber.....

Mit dieser Variante erhält er doch hinterher nur eine dezimale Zahl und KEINE Binäre !

Wenn er die zugehörigen Variablen mit 1, 2, 4 bzw. 8 multipliziert und dann zusammen zählt, kommt da am Ende niemals die Binäre "1001" bei raus!

Oder habe ich die eingangs gestellte Frage falsch verstanden? :confused:



Ach Markus bzw. Dirk...
Ich diesem Zusammenhang habe ich aber auch mal eine Frage.

Wenn ich zwei Byte-Variablen habe und möchte diese in eine Word-Variable zusammenfügen (und später wieder zerlegen), wie mache ich das (am besten in BASCOM) am unkompliziertesten?

Sprich, die ersten 8 Bit sind Variable 1 und die anderen 8 Bit sind Variable 2.

Ggf. mache ich dafür auch einen eigenen Thread auf, sollte es hier fehl am Platze sein. ;)


Schöne Grüße,
Cassio
 
Hallo Cassio,
Sorry Leute, ich dürft mich ja ruhig schlagen, aber.....

Mit dieser Variante erhält er doch hinterher nur eine dezimale Zahl und KEINE Binäre !

Wenn er die zugehörigen Variablen mit 1, 2, 4 bzw. 8 multipliziert und dann zusammen zählt, kommt da am Ende niemals die Binäre "1001" bei raus!

Oder habe ich die eingangs gestellte Frage falsch verstanden? :confused:

ungünstig ist es ja eigentlich schon, wenn man die vier Bit in jeweils 4 Bytevariablen im untersten Bit sitzen hat. So habe ich das zumindest verstanden. Eine Multiplikation mit 2 entspricht einem shift um ein Bit nach links (0 wird von rechts nachgeführt), eine Multiplikation mit 4 entspricht shift nach links um 2 Bit und so weiter (äquivalent entspricht übrigens Division durch 2 shift 1 nach rechts usw.).
Anstelle von addieren, kann man alle vier Variablen auch "verodern" (toller Begriff ;))

Man kommt zwar zu dem gewünschten Ergebnis, aber wie Markus ja schon erwähnt hat: es geht einfacher. Die obige Version kostet Code und Zeit.

Ach Markus bzw. Dirk...
Ich diesem Zusammenhang habe ich aber auch mal eine Frage.

Wenn ich zwei Byte-Variablen habe und möchte diese in eine Word-Variable zusammenfügen (und später wieder zerlegen), wie mache ich das (am besten in BASCOM) am unkompliziertesten?

Sprich, die ersten 8 Bit sind Variable 1 und die anderen 8 Bit sind Variable 2.

Hmmm, also Bascom muss ich erst noch lernen :D, in C sieht es zum Beispiel so aus:



CodeBox C

uint8_t VariableH, VariableL; // Die beiden 8Bit Variablen
uint16_t Variable3; // Die 16Bit Variable

// Jetzt zusammenführen. Highbyte wird um 8Bit nach links geschoben und mit Lowbyte "verodert"

Variable3 = (VariableH<<8) | VariableL;




Grüße,
Dirk
 
DEZ versus BIN

Hallo Casio,

ich habe nicht vor Dich zu schlagen :p
Fangen wir zunächst mit dem einfachen Teil an!

1. Aus zwei Byte ein Word machen:

Action: Compact two bytes into a word or integer.
Syntax: varn = MAKEINT(LSB , MSB)

Remarks:
Varn = Variable that will be assigned with the converted value.
LSB = Variable or constant with the LS Byte.
MSB = Variable or constant with the MS Byte.

The equivalent code is:
varn = (256 * MSB) + LSB

2. Aus einem Word/Integer Highbyte und Lowbyte erzeugen

Action: Retrieves the most significant byte of a variable.
Syntax: var = HIGH( s )

Remarks:
Var = The variable that is assigned with the MSB of var S.
S = The source variable to get the MSB from.

Action: Retrieves the least significant byte of a variable.
Syntax: var = LOW( s )

Remarks:
Var = The variable that is assigned with the LSB of var S.
S = The source variable to get the LSB from.
You can also assign a byte to retrieve the LSB of a Word or Long.


So, und nun kommen wir zum schiwrigen Teil!

Worin besteht bei Controllern der Unterschied zwischen Binär und Dezimal?
Ist es nicht vielmehr so, das es in der digitaltechnik gar kein dezimales Zahlensystem gibt?
Dezimal ist Binär bzw. jede dezimale Zahl ist eine binäre Zahl. Somit ist immer die dezimale Zahl 255 = &B11111111 und 0 = &B00000000. Bedeutet, wenn Du 255 auf einem Port mit 8 Bit ausgibst werden automatisch alle 8 Bit angesteuert und wenn Du einen Port mit dem Bitmuster &B10011001 ansteuerst und den Port in eine Variable einlist so hast Du automatisch die dezimalzahl 153 oder auch 99 HEX. Verstanden?

Du musst Dir also keine Gedanken über Dezimalzahlen machen den Dezimalzahlen sind Zahlen welche Du in Byte oder Word-Variablen usw. ablegst und diese Variablen haben automatisch auch eine binäre Darstellung. Anders kann sie dier Rechner nicht verarbeiten.

Anders sieht es natürlich aus, wenn Du eine Dezimalzahl in einem String abgelegt hast, also als Zeichenkette z.B. "133" (ASCII &H31 &H33 &H33). Dann musst Du hin und her rechnen, aber auch dafür gibt es Konvertierungsroutinen.
Neben den normalen Binärzahlen mit denen Du auch negative Integer Zahlen darstellen kannst (das funktioniert über das binäre 2er-Kompliment) gibt es z.B. noch andere Zahlensysteme wie BCD oder Oktal. Werden die verwendet muss man auch hin und herrechnen.

Übrigens, jede Dezimalzahl ist gleich Binärzahl ist gleich Hexadezimalzahl nur mit anderen Bezugssystemen.

Wenn er die zugehörigen Variablen mit 1, 2, 4 bzw. 8 multipliziert und dann zusammen zählt, kommt da am Ende niemals die Binäre "1001" bei raus!

Natürlich tut sie dass, den jedes Bit in einer binären Zahl hat eine Wertigkeit, genauso wie bei einer Dezimalzahl. Nur sind bei Binärzahl-Darstellung die Wertigkeiten von LSB nach MSB gesehen 2^0, 2^1, 2^2, 2^3 usw. Binär 1001 ist auch nix anderes als dezimal 9 und hexadezimal 9. 255 ist nix anderes als 11111111 bzw. FF. :D

Ich hoffe Dir damit weiter geholfen zu haben. Faktisch ist es nix anderes als digitaltechnik und das geheimnis vom dualen Zahlensystem. Zahlensysteme sind nur für uns Menschen gemacht und können beliebig hin-und-her gerechnet werden.


So, nun muss ich Dich immer noch nicht schlagen denn Du hast es verstanden, oder? Wenn NEIN dann schau mal in die Wiki rein. Die erklärt es auch ganz gut. Wenn JA must Du Dir nix draus machen denn die Problematik mit Dezimalzahlen versus Binärzahlen (Dualzahlen) ist mir hier im Forum schon ein paarmal aufgefallen, es ist aber wirklich kein Hexenwerk.

Grüße und schönen Abend,
Markus
 
Hallo Dirk, hallo Markus!

Erst einmal Danke, dass ihr mich nun doch nicht schlagen wollt. ;)

Kurz zu Dirk......
Ja ich weiß, dass du BASCOM erst noch lernen müsstest, aber es sei dir verziehen. :D
Wenn aber BASCOM mal wieder nicht das macht was ich gern hätte, dann greife ich gern auf deine Assembler Kenntnisse zurück. :flowers:


Nun zu Markus!
Danke der vielen Zeilen, aber das 255 = &B11111111 bzw. &HFF ist mir schon klar..... wäre ja schlimm wenn nicht. ;)

Ich war nur der Meinung, dass er die binäre Zahl auch Lesbar ausgeben will, also das auch 1001 auf dem Display erscheint und nicht 9 !
Das war dann wohl mein Gedanken- (Lese)fehler! :vollkommenauf:
Ich dachte er meinte eingangs December 9 ......... und nicht Dezimal 9 . Deswegen kam ich wohl auf die Schnappsidee mit der lesbaren Darstellung.
Ups.....



Nun noch kurz zu meinem Problem.....

Also werde ich das mal demnächst mit Makeint(LSB, MSB) und High(s) sowie Low(s) ausprobieren.
Scheint ja recht simple zu sein!

Danke Markus.... schon wieder mal! ;)

Schöne Grüße,
Cassio
 
Hi Cassio,

hmmm, dann habe ich mich wohl auch verlesen oder überlesen oder was auch immer. Nun ja, ein kleiner Ausflug in die Welt der Bits schadet nie :rolleyes: Der Beitrag wird ja sicher auch von anderen gelesen und vielleicht haben die was neues von mir erfahren.

Bin gespannt welche Erfahrungen Du mit LOW / HIGH / MAKEINT machst.

Achtung: OffTopic!
Cooler Avatar! Sag mal, bist Du das auf dem Bild selber oder aben wir es ein bissle mit Bruce zu tun?

Grüße,
Ma
 
Achtung: OffTopic!
Cooler Avatar! Sag mal, bist Du das auf dem Bild selber oder aben wir es ein bissle mit Bruce zu tun?

Achtung, auch OffTopic!

Hi Markus!

Du hast schon recht, das ist Bruce Willis..... als er noch einige Haare mehr auf dem Kopf hatte. :D

Die Ähnlichkeit soll aber schon vorhanden, wenn man einigen Freunden von mir glauben schenken darf...... incl. der jetzt kurzen Haare. ;)
 
Hallo Cassio und Dirk,

kurios - den Bruce kann ich nur als Gast sehen...
 
Hi Grandpa!

Komisch !!! :confused:

Ich kann mich aber sehen....
Als Gast, als User und im Spiegel. :D
 
Ist kein Scherz. In diesem Thread kann ich angemeldet die Avatare nicht sehen!!!!!
 
Hallo Oskar01,

geht wieder. Bei mir wird alles nach einer Sitzung gelöscht; woran's gelegen hat, weiß ich nicht.

Grüsse,

Michael
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)