LowByte highByte (MSB LSB ) Birleştirmek
  • Merhaba arkadaşlar sorumu daha önce açılmış bir konu altına sordum ama pek göze çarpmadı sanırım şimdi sorum için yeni bir konu açıyorum.

    sorunum şu . lowbyte ve highbyte birleştirmek . (MSB LSB)
    bunu ardunino ile nasıl yapabilirim.

    dataları seriporttan okuyup bir diziye kaydediyorum dizinin iki elemanı var her elemanında bir sayı veya karekter var ben bu iki dizi elemanını bir değişkende birleştirmek istiyorum.

    char data[2]; // dizin

    data[1]=1; //dizin 1. elemanına bir rakam yazıyorum (lowbyte)
    data[2]=2; //dizin 2. elemanına bir rakam yazıyorum (highbyte)



    LowByte highByte (MSB LSB ) Birleştirmek


  • bence burada yeni bir başlık açmana gerek yoktu, ben diğer taraftan soruna cvp vermeye çalışayım.
  • ben sorunumu tam anlatamadım sanırım.
    bana bu olayı açıklarmısınız LowByte highByte (MSB LSB )
  • word tipli değişkenler 2 byte tan oluşuyor 0-65535 değer aralığındaki sayıları 2 byte içinde tutar. diyelim 1000 değerini word içine saklamak istersen hibyte kısmına 1000/255 boldugunde tam bolen kısmını yani 3 yazarsın kalanını da lobyte kısmına 235 yazarsın. yani hibyte3 ve lobyte 235 değerleri 1000 sayısını vermektedir. sağlaması da şöyle yapılır hıbyte değeri 255 ile çarpılır ve lobyte değeri ile toplanır. senin orneğe göre (data[2]*255)+data[1] yada hesaplama yapmadan hazır fonksion kullanacaksan word(data[2], data[1])
  • cevap için teşekkür ederim ama birtürlü yapamadım.
    yeniden anlatmaya çalışayım.

    char data[2]; // dizin

    bilgisayarın seri portundan hex olarak 2 ve D gönderiyorum ardunio kartımdan bu datayı okuyup dizine atıyorum diz değişkeninin elamanlarına ayrı ayrı 2 ve D kaydediyorum

    data[1] //2 var
    data[2] //D var

    şimdi buraya kadar sorun yok

    bilindiği üzere hex 2D'nin DEC karşılığı 45 dir.

    şimdi ben tekrar bilgisayara DEC 45 değerini göndermek istiyorum
    eğer elimdeki değer direk 2D olsaydı bunu seriporttan kolaylıkla gönderebilirdim ama 2 ayrı D ayrı olduğundan olmuyor.
    bu yüzden bu ikisini bir değişkene 2D olarak kaydedebilirsem seriporttan gönderebilirim.
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    if(Serial.available()>0) //karşıdan gelen varsa
    {
    for(int say=0;say<8;say++)<br /> {
    data[say]=Serial.read();//gelen datayı diziye yazıyoruz
    }
    }

    data[1] //2 var
    data[2] //D var


    //////////////////////////////// bunu denedim ama olmadı //////////////////////////
    int gonder=word(data[1], data[2])
    Serial.print(gonder);
    ///////////////////////////////////////////////////////////////////////////////////////////////////////

    özetle bilgisayardan gelen 2D yine bilgisayara göndermek istiyorum.
    (farkındayım azcık karışık anlattım ama anlayan anlar :) )






  • hocam sen text stringi birleştirmek istiyorsun arduino.cc de stringlere bak. daha sonra elde ettiğin text stringi hex fonksiyonuna koyup bir integer sayı elde edeceksin. birde anlayan anlar demekle olmaz bu işler müneccim değil kimse.
  • Örneğin datan 2 byte dan oluşuyor.
    Data[1] i aldın , Data[2] yi aldın.

    Gönderirken şöyle denesen bir sonuç elde edebilir misin acaba.

    for(i=0;i<2;i++)<br />{
    veri=Data[i];
    Serial.print(veri);
    }

    bu şekilde veya buna benzer mantıkla bir denermisin
  • A ve A yolladım AA oldu. güzel bir test geçtimmi hadi bide sen dene
  • merhaba arkadaşlar
    @ekmekci hocam sizin söylediğiniz şekilde denemedim ama olmaz çünkü döngünün ilk hareketinde dizinin birinci elemanı değişkene yazılır ikinci hareketinde ise değişkenin içindeki ilk değer silinip üzerine dizinin ikinci elemanı yazılır.
    ------------------------------------------------------------------------
    @okoman hocam sizin söylediğiniz "text stringi birleştirme" olayını araştırıyorum. az önce eve geldim ve araştırmaya başladım.
    ------------------------------------------------------------------------
    aynen hocam iki hex karekter ayrı ayrı gelecek ve birleştirip sonrada DEC türüne çevirmek istiyorum.

    2 geldi sonra D geldi bu iki değeri birleştirip 2D olarak bilgisayara göndermek istiyorum

    hex 2'nin dec karşılığı yine 2
    hex D'nin dec karşılığı 13

    hex 2D'nin dec karşılığı 45

    NOT: 2D sadece örnek vermek açısından yazıyorum bu durum tüm hex karekterlerini içeriyor artık bilgisayardan ne gelirse.


  • a[0]*16+a[1]
    MSB değerini array in ilk hücresine,LSB yi ise arrayin 2.hücresine at sonra yukarıdaki formülü uygula
  • @bsenguler hocam teşekkür ederim denedim ama olmadı belkide ben yapamadım. araştırmaya devam.
  • çalıştıramadığınız kodları buraya aktarabilirseniz,en azından kodlar üzerinden gidelim.
  • Merhaba arkadaşlar @bsenguler, @okoman, @ekmekci, yardımlarınız için çok teşekkür ederim sonunda oldu.

    @bsenguler hocam sizin söylediğiniz /* a[0]*16+a[1] */ şekilde yaptım oldu akşamda denemiştim ama sanırım bi yerde yanlışlık yaptım olmamıştı bugün sakin kafayla yapınca oldu.

    hepinize çok teşekkür ederim.
    kodları ekliyorum belki birilerinin işine yarar


    int dizi[2]={0x1,0xD};

    void setup() {
    Serial.begin(9600);
    }
    void loop() {

    Serial.print("\n\r1.BYTE=");
    Serial.print(dizi[0]);
    Serial.print("\n\r2.BYTE=");
    Serial.print(dizi[1]);

    Serial.print("\n\r1. ve 2. BYTE Birlestirilmis Hali ");
    Serial.print("\n\rHEX=");
    Serial.print(dizi[0]*16+dizi[1],HEX);
    Serial.print("\n\rDEC=");
    Serial.print(dizi[0]*16+dizi[1],DEC);
    Serial.print("\n\r");
    Serial.print("----------------------------------");

    delay(5000);
    }
  • Array ın niçin int tipinde,Byte tipinde yaparsan yer tasarrufu yapmış olursun.
  • evet haklısınız hocam teşekkür ederim.
    değişkenler konusunda biraz çalışmalıyım sanırım.
  • Tekrar merhaba

    yukardaki şekilde iki byte birleştirdik peki 4 ayrı byte nasıl birleştirebiliriz.

    seri porttan peş peşe HEX tipinde 4 veri alıyorum
    örnek. HEX 6,A,B,2

    DEC karşılığı. 6,10,11,2

    bunları birleştirdiğimde tek değişken içine "610112" bu şekilde birleştirmek istiyorum
    bunu nasıl yapabilirim ?

    bazı denemelerim oldu ama anlamsız sayılar çıktı.



  • Aynı şekilde.
  • peki burdaki 16 sayısı tam olarak ne yapıyor " a[0]*16+a[1] "
  • :))
    bu video yu izlemenizi siddetle tavsiye ediyorum.
    https://youtu.be/htCsb0ITQOU
  • kız güzel anlatmış :)
  • Benzer konudan bir soru sormak istiyorum.
    int a=0xf445;
    int sonuc=highByte(a);
    burada sonuç değişkeni hangi değeri alır? Hada önemlisi bu hesaplamayı nasıl yaparız?
  • @hamzahaluk
    Sayı hex olarak yazıldığı için dönüşüm çok basit. 0x45 low byte, 0xf4 high byte. Hex sistemde her basamak 4 bite karşılık gelir. Yani sayıyı 8 bit sağa ötelersek soldaki (high) byte sağa gelmiş olur.

    unsigned int a = 0xf445;
    a >>= 8;

    Bu işlemden sonra a = 0xf4 olur. Veri türü unsigned ise sol tarafa 0 dolar. (0x00f4). Signed ise en soldaki (msb) bitin değeriyle doldurulur. Yani msb 0 ise 0'la, 1 ise 1'le.

    int a = 0xf445;
    a >>= 8;

    // a = 0xfff4

    Son olarak bir veri türü kendisinden daha küçük bir türe atama yapılırsa low kısmı alınır.

    byte b = a;

    // b = 0xf4;
  • @amenofis
    Yüksek değerlikli bit olarak neden sadece f'yi almadıkta f4'ü aldık?
    Ayrıca satırları arduinoya yazıp serial ekrandan okuduğumda 244 değerini döndürüyor. Ama nasıl?
  • İlk soruyu anlamadım. f4 onluk sistemde 244 eder zaten.
  • @amenofis
    Tamamdır, şimdi çözdüm. Teşekkürler

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.