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.
(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.
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.
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?
"BMP_180_ADDR, DATA_REG" bu adres dahil kaç byte okunacağı anlamında.
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ı?
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.
https://github.com/micropython
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.
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:01Alı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:38Alı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