Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Integer kahest baidist

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Integer kahest baidist

    Klassikaline juhtum, kus selleks, et väärtuseid üle I2C saata,tuleb need byte-deks teha, integer teatavasti koosneb kahes osast, low byte ja high byte. Nii kaugele olen jõudnud, et saan neid array-na saata üle I2C.
    Küsimus on, kuidas nüüd kahest byte-st jälle integer tagasi saada? Olen juba kõikvõimalikud näited läbi vaadanud, aga oluliselt targemaks pole saanud.
    Mingi lootus on kasutada union() mille kohta on ka mingeid näiteid, aga ei leidnud reference, seega struktuur jäi ebaselgeks ja kompilaator annab ka mingit viga.
    Allkiri.

    #2
    Vs: Integer kahest baidist

    Ei oska arvata mis "keelt" Sa kasutad aga minu
    LCC32 ütleb et INT tüüpi asju on 11 erinevat tüüpi.
    Ühest kuni 16 baidini.
    char, short, int, long, long long, int128
    Mõned märgiga, mõned unsigned

    Kui see ülekanne toimub baidi kaupa siis võib ju võtta see integer,
    teha AND 0xff ja saadud bait ära saata.
    Siis võtta sama integer, nihutada 8 bitti paremale, AND 0xff ja saata.
    Nii siis niipalju kordi kui palju baite seal on.

    Vastuvõtu poole peal defineerid sama pika int muutuja.
    1. saadud baidi salvestad,
    2. baidi nihutad 8 kohta ja paned OR käsuga esimeele otsa.
    Nii kõik baidid, iga kord nihe 8 võrra suurem.

    Nüüd peaks olema kohal sama suur arv kui oli teises arvutis.
    See kõik võib olla tehtud väikeseks alamprogrammiks.
    Väga ei imesta kui selline asi kuskil ka juba valmis kujul olemas on.

    Aga nii saab ka ise teha.
    Võib ka teisiti, näiteks tekstina saata. Ja siis teha tekstist arv.

    Kui tegu EI ole Integeriga vaid float arvuga siis see koosneb kahest osast.
    Arvust ja astendajast. Aga see on juba teine jutt.

    Comment


      #3
      Vs: Integer kahest baidist

      Üle I2C läheb array kolmest bytest, esimene neist peab jääma byteks (käsk seadmele), teine ja kolmas moodustavad int (käsu parameeter), low ja high byte.
      Allkiri.

      Comment


        #4
        Vs: Integer kahest baidist

        C näide
        __________________
        char loebait(void){
        //Siin võtad oma baidi vastu
        // käsk, high, low
        return 0x34;
        }
        char kask;
        int arv;
        unsigned short main(void)
        {
        kask=loebait();
        arv=loebait();
        arv=arv<<8;
        arv=arv|loebait();
        return 1;
        }
        Proovisin debugeri all, töötas.
        viimati muutis kasutaja A.R.; 04 m 2015, 14:31.

        Comment


          #5
          Vs: Integer kahest baidist

          Kui ma noor olin, siis sai asmis nii teinud:
          mov ah, <high_byte>
          mov al, <low_byte>

          ja nyyd ax on sinu word/int. Seda muidugi sai tehtud x86 prose all. Kui ma veel noorem ja lollim olin, siis tegin nii:
          <int_var> = <high_byte> * $100 + <low_byte>

          Eks sa ise vaata, milline sulle endale meeldib, sellele asjale annab l2heneda erinevalt.

          See viimane lahendus on suht sama, mis A.R. pakkus: tema kasutab korrutamise asemel nihutamist ja liitmise asemel bitwise-or'i.
          viimati muutis kasutaja Mephistopheles; 06 m 2015, 10:13.
          V2ntv6ll on selleks k6ver, et mahuks mootorisse 2ra.

          Comment

          Working...
          X