pcbway

C\'de 14 bitlik veriyi ikiye nasıl böleriz?

Başlatan alp, 26 Ocak 2012, 11:59:04

alp

Merhabalar arkadaşlar.C dilinde;dışarıdan aldığım 14 bitlik veriyi düşük anlamlı ve yüksek anlamlı şeklinde ikiye ayırarak birini bir 8 bitlik bir char değişkenine diğerinide 8 bitlik başka bir char değişlkenine atamak istiyorum(kullandığım derleyici de char 8 bit).Bunu nasıl yapabilirm acaba?Struct ile yapmayı denedim ama başarılı olamadım.

yazici67

Hangi C derleyicisini kulandığını söylersen daha kolay yardımcı oluruz.Çünkü derleyiciye göre syntaxlar değişiyor. Genel olarak şöyle olabilir ;
int16 girisVerisi; //  14 bitlik veri
char msb, lsb;
msb = (girisVeri & 0x3F80) >> 7; // 0x3F80 = 0b0011 1111 1000 0000 -> Yüksek değerlikli 7 bit char değişkenine alttan atılır.
lsb = (girisVeri & 0x007F);            // 0x007F = 0b0000 0000 0111 1111
Yalnız derleyicinin BigEndian veya LittleEndian kodlama sistemine göre değişebilir hangi derleyci olduğunu söylersen daha doğru cevap veririm.

alp

Yardımınız için çok teşekkür ederim.PSoC Designer programını kullanıyorum. :)

yazici67

İlginç daha önce hiç duymadım bu programı.Ne için programlama yapıyor bu program PIC mi Atmel mi yoksa Win32 gibi mi ?

alp

Cypress mikrodenetleyicileri için programlama yapıyor.Açıkçası bende yeniyim daha bu programda :)

yazici67

Evet :) Büyük ihtimalle LittleEndian için yukarıdaki kod çalışacaktır.Denersiniz. Olmazsa farklı şekillerde deneriz.

alp

26 Ocak 2012, 17:27:08 #6 Son düzenlenme: 26 Ocak 2012, 17:29:24 alp
PSoC Big-Endian formatta saklıyormuş dataları.Farklı nasıl olabilir acaba?
Sadece msb ve lsb\'nin yerleri mi değişiyor yukarıdaki kodda?

yazici67

26 Ocak 2012, 22:32:21 #7 Son düzenlenme: 30 Ocak 2012, 16:07:21 gevv
Vikipedi :
http://tr.wikipedia.org/wiki/Endian






Resimde olay açıklanmış aslında...
Bizim 14-bitlik verimiz 16-bitlik ( 2 byte ) registerda şöyle görünecek :
    0 0 X X X X X X - X X X X X X X X
                >>------------->>    Big Endian
Buna göre önemli olan byte MSB : ( 0 0 X X X X X X - X X X X X X X X ) & ( 0 0 1 1 1 1 1 1  - 1 0 0 0 0 0 0 0 ) = ( 0 0 X X X X X X - X 0 0 0 0 0 0 0 ) >> 7 = 0 0 0 0 0 0 0 0 - 0 0 X X X X X X X
olur.Yani aslında ilk yazdığım kod Big Endian oluyor.Yanlışlıkla doğru kodu yazmışım :)
Önemsiz byte olan LSB : ( 0 0 X X X X X X - X X X X X X X X ) & ( 0 0 0 0 0 0 0 0 - 0 1 1 1 1 1 1 1 ) = ( 0 0 0 0 0 0 0 0 - 0 X X X X X X X )
int16 girisVerisi; //  14 bitlik veri
char msb, lsb;
msb = (girisVeri & 0x3F80) >> 7; // 0x3F80 = 0b0011 1111 1000 0000 -> Yüksek değerlikli 7 bit char değişkenine [b]üstten[/b] atılır.
lsb = (girisVeri & 0x007F);            // 0x007F = 0b0000 0000 0111 1111
Bu şekilde derleyin herhangi bir hata ayıklama seçeneği varsa çalışırken de kontrol edersiniz.

alp

Çok teşekkür ederim yardımlarınız ve emekleriniz için...Çok sağolun.. :D :D

yazici67

Önemli değil. Meraktan soruyorum projeniz nasıl birşey ? Yani ne yapıyor hangi işlemci hangi platform vesaire... Eğer gizli kalmasını istiyorsanız önemli değil...

alp

Projemde hem pwm çıkışı hem de analog giriş kullanıyorum.Analog girişinide ADC\'ye bağladım.14 bitlik hassasiyette ölçüm yapıyor.Bu ölçümlerin değerini PC\'den gördüm.:))Tabi yardımlarınız sayesinde..

yazici67

Cevapladığınız için teşekkür ederim ve çalışmalarınızda başarılar dilerim kolay gelsin...

alp

Rica ederim.Sizede kolay gelsin iyi çalışmalar. :)