Bit Byte LSB MSB?

Başlatan Firzen, 22 Mayıs 2022, 18:19:57

Firzen

Her ne kadar elektronik çıkışlı da olsam. Unuttuğum bilmediğim bazı soruları sizlerle de paylaşmak istedim;

Micropython ile kütüphane yazmaya çalışıyorum (Örn: BMP180)

I2C pinlerini ayarla
I2C tarama yap
Sensörün I2C adresini bul

Daha sonra MSB biti için okuma ardından LSB için okuma yap

Eğer doğruysam

Sorum şu:

msb = i2c.readfrom_mem(BMP_180_ADDR, BMP_180_ADDR, addrsize)
buradaki "address size" olayı nedir? Neye göre belirliyorum?

(msb << 8) + lsb
Buradaki shift register yaparken 8 sayısı sabit mi? yani ben hep 8 bit kaydırma mı yapıyorum?


Bu kütüphaneyi yazmak için okuduğumda 16bit data diyor. Bunun için 8 i 16'ya çevirmeme gerek yok mu?

Bu Digital sistemler gerçekten kafamı karıştırdı. Genelde ADC verisi benim için yeterli oluyordu veya hazır yazılmış kütüphaneler. Artık biraz daha derinlemesine öğrenmek istiyorum.

The University of Sheffield                                  (PhD) Automatic Control and Systems Engineering

z

(msb << 8) + lsb

MSB yi 8 bit sola kaydirinca 16 bit alanin ust 8 bitine MSB yazmis oluyorsun. Bunun saginda kalan 8 bit bosluga da toplama islemi ile LSB yi yerlestirmis oluyorsun.

Sonucta MSB ve LSB paketlenip tek 16 bit veriye donusmus oluyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Sozuak

#2
Veri yolu 8 bit ama işlemci 16 bit ise aynı veri yolundan 2 defada 8+8 bit okuyup yazarak 16 biti elde edersin.

LSB  Least Significant Bit yani en düşük değerlikli 8 bitlik veri kısmı
MSB  Most Significant Bit  yani en yüksek değerlikli 8 bitlik veri kısmı

Eğer sistem 32 bit ama veri yolu 16 bit ise  16+16 şeklindedir. ille de 8 bit olacak diye kural yok.

Anlamında.

yani  sen  13504567 sayısını  2 parçada okursan 1350 MSB  olan kısımdır  yani 13500000 birim  değerindedir,  4567 ise LSB olan kısımdır 4567 birim değerindedir.

Firzen

Anladım.

msb = i2c..read_byte_data(BMP_180_ADDR, BMP_180_ADDR)

msb = i2c.readfrom_mem(BMP_180_ADDR, DATA_REG, addrsize)

bunun arasındaki fark nedir. Birisini Raspberry Pi 4'den diğerini de Raspberry Pi Pico dan. "addrsize" muhabbeti nedir peki?
The University of Sheffield                                  (PhD) Automatic Control and Systems Engineering

sadogan

#4
 "BMP_180_ADDR, DATA_REG" bu adres dahil kaç byte okunacağı anlamında.

Firzen

Alıntı yapılan: sadogan - 23 Mayıs 2022, 00:13:51"BMP_180_ADDR, DATA_REG" bu adres dahil kaç byte okunacağı anlamında.

0x77, 0xF6 + okunacak bit mi?
O zaman 4 + 4 + okunacak byte olmaz mı?
The University of Sheffield                                  (PhD) Automatic Control and Systems Engineering

z

msb = i2c.readfrom_mem(BMP_180_ADDR, BMP_180_ADDR, addrsize)

Soruna cevap verebilmek icin kutuphaneyi tanimak lazim.

Eger i2c.readfrom_mem fonksiyonu varsa onu gormek lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mehmet


volkanunal

#8
Alıntı yapılan: Firzen - 22 Mayıs 2022, 21:35:33Anladım.

msb = i2c..read_byte_data(BMP_180_ADDR, BMP_180_ADDR)

msb = i2c.readfrom_mem(BMP_180_ADDR, DATA_REG, addrsize)

bunun arasındaki fark nedir. Birisini Raspberry Pi 4'den diğerini de Raspberry Pi Pico dan. "addrsize" muhabbeti nedir peki?


İsimlendirme yapısı bir çok platforma oldukça yakın, örneğin stm32 için HAL_I2C_Master_Transmit, HAL_I2C_mem_write gibi fonksiyonlar mevcut (isimlerinin typosu yanlış olabilir.)

read_byte_data -> Şu fonksiyon için konuşacak olursak, şöyle bir frame yapısı mevcut diyebiliriz.

/**
 *
 * ______________________________________________________________________
 * | start | slave_addr + rd_bit | read n-1 bytes  | read 1 byte  | stop |
 * --------|---------------------|---------------- |--------------|------|
 *
 */


i2c.readfrom_mem -> Şu fonksiyon için konuşacak olursak ise, kabaca şöyle bir frame yapısı var.
/**
 *
 * _____________________________________________________________________________________________________________________
 * | start | slave_addr + wr_bit | Memory address | start | slave_addr + rd_bit | read n-1 bytes  | read 1 byte  | stop |
 * --------|---------------------|----------------|-------|---------------------|-----------------|--------------|-------
 *
 */


Yani mem fonksiyonları register tabanlı bir erişim sağlıyor ve örneğin okuma yapmadan önce kendisi yazarak okuma yapıyor. Diğerleri ise basit anlamda bir yazma, okuma yapıyor.


Firzen

#9
Burada sormak istediğim Kodu Raspberry Pi ile yazarken
msb = i2c.read_byte_data(BMP_180_ADDR, DATA_REG)

Raspberry Pi Pico ile yazarken
msb = i2c.readfrom_mem(BMP_180_ADDR, DATA_REG, addrsize)

yazmamızı ima etmiştim ama teşekkür ederim cevaplar için. Çalışma mantığı yapısını yavaş yavaş çözmeye başladım.

23 Mayıs 2022, 18:27:01
Alıntı yapılan: mehmet - 23 Mayıs 2022, 09:17:13https://github.com/micropython

Ah hocam ingilizce biliyor olmama rağmen temel eksiği olduğu için zaten burada soru soruyorum.

23 Mayıs 2022, 18:27:38
Alıntı yapılan: z - 23 Mayıs 2022, 08:37:52msb = i2c.readfrom_mem(BMP_180_ADDR, BMP_180_ADDR, addrsize)

Soruna cevap verebilmek icin kutuphaneyi tanimak lazim.

Eger i2c.readfrom_mem fonksiyonu varsa onu gormek lazim.

Aynen dediğiniz gibi yapıyorum şuan datasheetlerden sensör özelliklerine bakarak yazmaya çalışıyorum
The University of Sheffield                                  (PhD) Automatic Control and Systems Engineering