Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Frage an alle "Bitshifter" oder Experten...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS - √ - Frage an alle "Bitshifter" oder Experten...

    Ich hänge noch immer an der Umrechnung von 2*1Byte nach 16-Bit.

    Rauskommen soll ein 16-Bit WErt nach EIS5 mit 1 Kommastelle, d.h. der Wert ist um Faktor 10 zu hoch und wird am Ende einfach geteilt, oder mit Anderen Worten die Masseinheit ist 0,1

    Bei werten von 0 bis 255 ist das kein Problem, da nehme ich den 2. Wert, dividiere ihn durch 10 und schon habe ich die Temperaturen von 0 bis 25,5 °C

    Bei höheren oder niedriegeren Temperaturen wird das dann schwieriger, denn da kommt ja der 2.Wert ins Spiel.

    Der ist so definiert, daß die 1.Stelle das "sign" ist. Ich habe also von 0-127 als "Range", den multiplizier ich mit 256 ( um den Exponenten zu bekommen ) und addier die 2. Zahl. Das ganze dann gibt die "insgesamttemperatur".

    Habe ich Temperaturen unter Null, dann ist der Wert des ersten Bytes ja > 127. Jetzt gehe ich so vor, daß ich vom ersten Byte erstmal 128 abziehe und dann die rechnung mache, dabei das Ergebnis dann aber mit (-1) multipliziere, damit ich das vorzeichen habe.

    Momentan kommt rein:
    0xff 0xf8

    das müsste so um die -3°C ergeben, bei mir kommt aber ein Wert von -3275 raus.

    Wo ist denn da mein Denkfehler???
    never fummel a running system...

    #2
    Hallo Peter,

    ich glaube bei Deinem Zahlenrätsel liegt ein zweier-Komplemenent vor (schau dir das mal bei wikipedia an). Das bedeutet, dass das oberste Bit der 16-Bit das signum darstellt, die restlichen 15 Bit aber wertig absteigend sortiert werden. Will heissen, 0..32767 sind die positiven Werte, 32768..65535 die negativen. Allerding ist der kleinste negative Wert die 32768, der grösste (somit der am nächsten bei Null liegende) 65535.
    Bei Deinem Beispiel komme ich so auf -0.8°. Rechenweg: 65536 - (0xff*256 + 0xf8) = 8

    mfg Swen

    Achja, warum macht man das: Gibt auch noch das einer-Komplement, da ist nur das MSB für das Vorzeichen zuständig und die restlichen 15Bit ergeben den Wert. Da gibt es jedoch zwei Darstellungen der Null, naemlich 0x0000 und 0x8000. Und das ist fuer den Informatiker hochgradig ineffizient
    2 Objekte, 6 Linien + KNX/IP-Bereich, HS 3 SW 2.8, Visu mit 2x 15"-Touch, Softwaregateway KNX/IP für 2x Novelan Wärmepumpe, viele Ideen und wenig Zeit

    Kommentar


      #3
      boah, ohne Dich.....

      dann müsste es doch so gehen...

      5012|0|""|"(int(EN[1])*256 + int(EN[2]))"|""|0|0|1|0
      5012|0|"SN[1]>32768"|"(65536-SN[1])/10"|""|1|0|0|0
      5012|0|"SN[1]<=32768"|"SN[1]/10"|""|1|0|0|0

      oder immer noch auf dem Holzweg?
      never fummel a running system...

      Kommentar


        #4
        swenga, Du bis ZAUBERER
        vielen Dank.

        jetzt stellt sich mir nur noch die Frage, warum ich mit dem Datentyp EIS5 ( 16-Bit) die Kommawerte nicht dargestellt bekomme.

        Nicht dass die ins Gewicht fallen würden, aber es sieht halt unschön aus.
        never fummel a running system...

        Kommentar


          #5
          aber warum kommt dann momentan bei - graden immer nur 0 raus??

          5000|"Wandler\2*1ByteTo16Bit_Signed"|0|3|"1 Eingang 1 Byte"|"2 Eingang 1 Byte"|"Divisor"|1|"16-Bit"

          5001|3|1|0|1|0

          5002|1|0|0
          5002|2|0|0
          5002|3|10|0

          5003|1|0|0

          5004|1|0|0|1|0 #A1


          5012|0|""|"(int(EN[1])*256 + int(EN[2]))"|""|0|0|1|0
          5012|0|"SN[1>=32768"|"(65536-SN[1])/int(EN[3]) * (-1)"|""|1|0|0|0
          5012|0|"SN[1]<32768"|"SN[1]/int(EN[3])"|""|1|0|0|0
          never fummel a running system...

          Kommentar


            #6
            Hallo Pete,

            sind die einkommenden Datentypen auf 8Bit 0..255 gesetzt? Nicht das die Kiste da bereits versucht negative zu erkennen.

            Ist das Fehlen der Kommastelle mglw. auf einen falschen Datentyp in der Anzeige zurückzuführen? Geht der Ausgang als GA oder als IKO raus?

            Gerade bei der Division zweier Int-Typen machen Compiler wilde Geschichten, C z.B. erbt den Typ immer vom ersten Operanden. Daher habe ich mir bei sowas immer angewöhnt, die Daten nach float zu casten:
            float(SN[1])/float(EN[3])

            Ansonsten lies alle Konversionen in interne Speicher des bausteins ein und gib eine Debugzeile aus:
            5004|2|""|0|2|1 # Text Debug
            #Debug Ausgang
            5012|0|""|"'Werte EN1:' + str(int(EN[1])) + ' EN2:' + str(int(EN[2])) + ' 16Bit:' + str(int(SN[1]))"|""|2|0|0|0

            mfg Swen
            2 Objekte, 6 Linien + KNX/IP-Bereich, HS 3 SW 2.8, Visu mit 2x 15"-Touch, Softwaregateway KNX/IP für 2x Novelan Wärmepumpe, viele Ideen und wenig Zeit

            Kommentar


              #7
              Swenga, Respekt....

              ich habe viel zu kompliziert gedacht, jetzt gehts, auch negativ.
              Das Problem war, daß ich immer INTEGER aus den Werten gemacht habe, da stimmt dann die Rechnung nicht.

              Anbei der - jetzt endlich funktionierende - Code


              #### 2 Byte-Umwandlung (2Byte -> 16 Bit )
              5000|"Wandler\2*1ByteTo16Bit_Signed"|0|3|"1 Eingang 1 Byte"|"2 Eingang 1 Byte"|"Divisor"|2|"16-Bit"

              5001|3|1|0|1|0

              5002|1|0|0
              5002|2|0|0
              5002|3|10|0

              5003|1|0|0

              5004|1|0|0|1|0 #A1

              5012|0|""|"(EN[1]*256) + EN[2]"|""|0|0|1|0
              5012|0|"SN[1]>=32768"|"(65536-SN[1])/EN[3] * (-1)"|""|1|0|0|0
              5012|0|"SN[1]<32768"|"SN[1]/EN[3]"|""|1|0|0|0
              never fummel a running system...

              Kommentar

              Lädt...
              X