- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Bytes aus einem Array in eine Word-Variable

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2004
    Beiträge
    10

    Bytes aus einem Array in eine Word-Variable

    Anzeige

    Powerstation Test
    Hallo,

    ich habe 5 einzelne Bytes, die jeweils einen Wert zwischen 0-9 haben, in einem Array platziert. Diese einzelnen Bytes beschreiben jeweils eine Ziffer einer 5-stelligen Zahl.
    Nun muss ich diese Ziffern zu einer Zahl zusammenführen, mit der man Rechnen kann. Der Wert dieser Zahl kann 2^16 nicht überschreiten. Datentyp Word sollte also reichen.
    ....aber wie mache ich das ??
    Für Tips wäre ich sehr dankbar !!

    Daniel

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    Nimm die ASCII-Code der Zahlen in die Bytes, weil du eh nur eine zahl darstellen möchtest und wandelst diese 5 in einem Gesamtstring und mit Val(Str) hast du die Zahl.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    Nimm eine Word Variable und ein Byte Array
    Dann weise dem Word die Erste Variable zu,
    schiebe das Word um 8-Bits nach oben (left)
    und füge Deinen zweiten Wert hinzu:


    Code:
       DIM W_Var as word
       DIM B_Array(2) as byte
    
       W_Var = &B0000000000000000               ' = 0 (Binäre Schreibweise)
       B_Array(1) = 9                           ' =         00001001
       B_Array(2) = 1                           ' =         00000001
    
       print bin(B_Array(1))
       print bin(B_Array(2))
    
       W_Var = B_Array(1)                       ' = 0000000000001001   = 9 
    
       print bin(W_Var)
    
    
    
       ' dieses um 8-Bit nach links (in das obere Byte) schieben
       Shift W_Var, Left , 8                    ' = 0000100100000000   = 2304
    
       print bin(W_Var)
    
       ' und den zweiten Wert hinzu Odern (addieren)
       W_Var = W_Var Or B_Array(2)              ' = 0000100100000001   = 2305
    
       print bin(W_Var)
    
    End
    Ist zwar etwas an Deinem Ziel vorbei aber

    Du kannst ja auch nur um vier Bit nach links verschieben
    dann bekommst Du aber immer noch nur vier Werte in ein Word.

    Der Vorteil ligt darin, dass es schneller geht (Rechenzeit) und dass Du dies logisch abfragen kannst.


    Code:
       DIM W_Var as word   
       DIM W_Temp as word
       DIM B_Array(4) as byte
    
       W_Var = &B0000000000000000               ' = 0 (Binäre Schreibweise)
       B_Array(1) = 9                           ' =         00001001
       B_Array(2) = 1                           ' =         00000001
       B_Array(3) = 1                           ' =         00000001
       B_Array(4) = 1                           ' =         00000001
    
       print bin(B_Array(1))
       print bin(B_Array(2))
       print bin(B_Array(3))
       print bin(B_Array(4))
    
    
       'Sicherheitshalber die oberen 4-Bit ausmaskieren um ein versehentliches Überschreiben zu verhindern.
       B_Array(1) = B_Array(1) AND &B00001111
       B_Array(2) = B_Array(2) AND &B00001111
       B_Array(3) = B_Array(3) AND &B00001111
       B_Array(4) = B_Array(4) AND &B00001111
    
    
       W_Var = B_Array(1)                       ' = 0000000000001001
       ' dieses um 4-Bit nach links schieben
       Shift W_Var, Left , 4                    ' 
    
       'dann die vier Bit hinzu Odern
       W_Var = W_Var OR B_Array(2)              ' = 0000000010010001       
    
       ' wieder um vier Bit nach links
       Shift W_Var, Left , 4                    ' 
    
       ' wieder vier Bit hinzu
       W_Var = W_Var OR B_Array(3)              ' = 0000100100010001       
           
     
       ' wieder um vier Bit nach links
       Shift W_Var, Left , 4                    ' 
    
       ' wieder vier Bit hinzu
       W_Var = W_Var OR B_Array(4)              ' = 1001000100010001       
            
    
       print bin(W_Var)
    
    
       ' 4. Zahl Abfragen:
       W_Temp = W_Var AND &B1111000000000000
       Shift W_Temp, right,12
       Print W_Temp                             ' = 9
    
    
    End
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    .....ich habe 5 einzelne Bytes, die jeweils einen Wert zwischen 0-9 haben, in einem Array platziert. Diese einzelnen Bytes beschreiben jeweils eine Ziffer einer 5-stelligen Zahl.....


    ...entweder muss 9111 herauskommen oder 1119

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2004
    Beiträge
    10
    Vielen Dank für eure Antworten.
    Darwin, Deinen Vorschlag habe ich mir angschaut...leider nicht ganz das, was ich brauche.

    Byte_array(1)=6
    Byte_array(2)=4
    Byte_array(3)=5
    Byte_array(4)=1

    Rauskommen soll Word_var=6451

    Bin allerdings so weit, dass ich die Bytes des Arrays lieber in einen String verpacken würde. Super wäre es, wenn man diesem String vorne auch noch ein "+" oder "-" anfügen könnte.

    Robby-Fant:
    > Nimm die ASCII-Code der Zahlen in die Bytes, weil du eh nur eine zahl darstellen möchtest und wandelst diese 5 in einem Gesamtstring und mit Val(Str) hast du die Zahl.

    Kannst Du mirdas nochmal genauer erklären ??

    Viele Grüße
    Daniel

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    Zitat Zitat von robby-fant
    ...entweder muss 9111 herauskommen oder 1119
    Das wäre dann etweder ein String oder du musst jede einzelne Zahl potenzieren

    Beispiel 9876
    also

    9 * 1000 = 9E3 = 9*10^3
    8 * 100 = 8E2 = 8*10^2
    7 * 10 = 7E1 = 7*10^1
    6 * 1

    Code:
    Dim W_var As Word
    Dim W_temp As Word
    Dim B_ar(4) As Byte
    Dim B_temp As Byte
    Dim S_var As String * 4
    Dim S_temp As String * 4
    Dim B_len As Byte
    
    
    
    B_ar(1) = 9
    B_ar(2) = 8
    B_ar(3) = 7
    B_ar(4) = 6
    
    W_var = 0
    
    ' Bilden der Zahl:
    
    W_temp = B_ar(1) * 1000
    W_var = W_temp
    
    W_temp = B_ar(2) * 100
    W_var = W_var + W_temp
    
    W_temp = B_ar(3) * 10
    W_var = W_var + W_temp
    
    W_temp = B_ar(4) * 1                                                            ' Pauschal mach aber keinen Sinn (*1)
    W_var = W_var + W_temp
    
    
    Print W_var
    
    ' Zum Auswerten muss aber ewas mehr Aufwand getrieben werden
    ' Entweder in einen String umwandlen und dann ein einzelnes Zeichen
    ' mit MID herauspicken und wieder in eine Zahl zurückverwandeln (mit VAL)
    
    ' oder Matematisch (um auf Zahlenebene zu bleiben)
    ' dann muss noch mehr Aufwand getrieben werden,
    
    S_var = Str(w_var)
    Print S_var
    S_var = Format(s_var , "0000")                                                  ' Damit auf jedenfall 4-Zeichen erstellt werden auch bei 0-Werten (Führende Nullen)
    
    S_temp = Mid(s_var , 1 , 1)
    Print "Zeichen der Zahl 1 = " ; S_temp
    B_temp = Val(s_temp)                                                            ' damit die Zahl als Zeichen wieder eine Zahl wird
    Print "Wert der 1. Zahl = " ; B_temp
    
    S_temp = Mid(s_var , 2 , 1)
    Print "Zeichen der Zahl 2 = " ; S_temp
    B_temp = Val(s_temp)                                                            ' damit die Zahl als Zeichen wieder eine Zahl wird
    Print "Wert der 2. Zahl = " ; B_temp
    
    S_temp = Mid(s_var , 3 , 1)
    Print "Zeichen der Zahl 3 = " ; S_temp
    B_temp = Val(s_temp)                                                            ' damit die Zahl als Zeichen wieder eine Zahl wird
    Print "Wert der 3. Zahl = " ; B_temp
    
    S_temp = Mid(s_var , 4 , 1)
    Print "Zeichen der Zahl 4 = " ; S_temp
    B_temp = Val(s_temp)                                                            ' damit die Zahl als Zeichen wieder eine Zahl wird
    Print "Wert der 4. Zahl = " ; B_temp
    
    
    End
    '
    ' Eine Modulo kann nicht direkt verwendet werden da diese 'nur' einen
    ' Integer Wert zurückliefert.
    ' Also bedeuted dies noch mehr Arbeit...

    EDIT:
    Was soll das jetzt mit dem Vorzeichen???
    Nix kapito.
    Wann soll eine neg. Vorzeichen entstehen und vor allem WIE (bei dikreten Werten aus unterscheidlichen diskreten Variablen?????"

    Überleg mal.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    davon reden wir doch die ganze Zeit, du machst es zu kompliziert.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    stringzahl1=CHR(var) 'var ist der ascii-code-wert eines buchstaben(zahl "1" zb ist auch ein buchstabe), ascii-tabelle mit google suchen,stringzahl1 ist ein string der länge 1 (ohne returnzeichen usw).

    gesamtstring=stringzahl1 + stringzahl2...

    wordwert=val(gesamtstring)

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2004
    Beiträge
    10
    Darwin, Robby-Fan,

    vielen Dank !!

    Den letzten Vorschlag werde ich gleich testen.
    Habe inzwischen mal das hier probiert:
    Code:
    $crystal = 3686400
    $regfile = "m8def.dat"
    
    Dim Xstring As String * 20
    Dim Xbyte(21) As Byte At Xstring Overlay
    
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portd.2 , E = Portd.3
    Config Lcd = 16 * 2
    
    Initlcd
    
    Xbyte(1) = 5
    Xbyte(2) = 4
    Xbyte(3) = 2
    Xbyte(4) = 5
    Xbyte(5) = 8
    Xbyte(6) = 3
    Xbyte(7) = 8
    Xbyte(8) = 0
    
    Cls
    Lcd "test"
    Lowerline
    Lcd Xstring
    
    End
    Im LCD steht nachher auch Test in der oberen Zeile.
    Dadrunter steht nur Müll. Was mache ich falsch ??

    Daniel

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    Du musst die Zahl in einen String umwandeln,
    das LCD meinst sonst was anderes.

    Xsting = str(Xbyte(1)) ' zum Biespiel

    außerden was soll schon angezeigt werden?
    Du hast in Xstring ja noch nix reigeschrieben, da ist eben zufällig was drin.
    Also vorher Xsting="" oder was anderes "1234567890" definieren.

    Nur eine Variable definieren ist nicht alles,
    die solltest Du auch noch initialisieren, wenn Du sauber programmieren willst, also einen definierten Wert zuweisen.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress