I2C protokolü kullanan ads1115 cihaz kodu

Başlatan hkalaycioglu, 09 Ocak 2019, 21:20:35

hkalaycioglu

iyi akşamlar I2C komutlarında bulunan cihaz kodunu datasheette nereden buluyoruz veya datasheetteki hangi kısım cihaz kodunu ifade ediyor. Bulamadım picbasic de  ads1115 kullanmaya çalışıyorum ufak bir şey belki ama burada takıldım.

ete

#1
Datasheet Sayfa23 de , 9.5.1.1 bölüm başlığı altında  I2C Address Selection başlığı altında açıklanmış bütün her şey.
Orada bir tablo vermişler  Table 4. ADDR Pin Connection and Corresponding Slave Address başlığı altında 4 seçenek verilmiş. Adres pini şayet GND ye bağlı ise sağındaki %10010000 adresini kullanın demişler. Aynı pin şayet VDD ye bağlı ise &10010010 şeklinde bir cihaz kodu (yada adres) kullanın demişler. Diğer ikisine pek yanaşma bence bu ikisinden birini tercih et.
Aslında Sayfa 24 de tüm detaylarıda göstermişler. Orayada bakmanı tavsiye ederim.

Ete

hkalaycioglu

teşekür ederim ete hocam sağol. Datasheet okumak konusunda zayıfım.

hkalaycioglu

iyi akşamlar kodu oluşturdum fakat ads1115 den bir bilgi alamıyorum benim gözden kaçırdığım bir şey mi var acaba bir bakarmısınız. teşekkürler.

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _PWRTE_ON   
             
DEFINE OSC 4   
CMCON=7       


Define LCD_DREG  PORTB
Define LCD_DBIT  4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG  PORTB
Define LCD_EBIT  1
DEFINE I2C_SCL PORTA,1
DEFINE I2C_SDA PORTA,0
Define I2C_HOLD 1
PORTA = %00000000 
TRISA = %00000011
PORTB=0 
TRISB=0

a   VAR BYTE   
Data var word
Pause 100       
LCDOut $fe, 1, "I2CX" 
Pause 1000

mainloop:

LCDOut $fe, 1, "HASAN"

   I2cwrite I2C_SDA,I2C_SCL,$90,$01,[%1100000100000011]  ; konfigürasyon
                                     ; |||
                                     ; 100 = AIN0
                                     ; 101 = AIN1
                                     ; 110 = AIN2
                                     ; 111 = AIN3
   Pause 100               

    I2Cread I2C_SDA,I2C_SCL,$90,$48,Data,bogus
    pause 150
    LCDOut $fe,1,dec5 data
    pause 1000
    a =Data*0.0001869
    pause 500     
   LCDOut $fe, 1,dec2 a     
    pause 1000                               
   GoTo mainloop                       

bogus:
   LCDOut $fe,1, "zaman bitti"
   pause 100           
   LCDOut $fe, 1,dec2 a
   Pause 1000
   GoTo mainloop

   End

ete

#4
Şimdiye kadar hiç harici ADC entegresi kullanmadım. Bu entegreninde mantığını anlamış değilim. Anlamak için çok fazla okumak ve üzerinde vakit harcamak gerekiyor. Ama en azından mantıklı bir haberleşmenin nasıl olacağına dair fikirler edindim. Birinci kural komut kontrol adresi $90 bu doğru ondan sonra adress verme zorunluluğun yok. Bu bir option ve cihazdan cihaza değişiklikler arzediyor. Ama sende gerekli değil çünki o işi adress pointer yapıyor.
Köşeli parantez içindeki ilk byte adres pointer değer olmalı. %000000xx şeklinde bir değer ve yalnızca ilk iki bit 4 farklı adresi belirlemek için kullanılıyor. 00=0 nolu adres,  01=1 nolu adres 10=2 nolu adres ve 11=3 nolu adres olmak üzere 4 faklı adrese bu sayede erişebiliyorsun (anladığım bu)
Sen Config registerine bir şey yazmak istiyorsun o halde Config adresi olan 1 nolu adres için aşağıdaki komutu yollaman gerekir.
I2cwrite I2C_SDA,I2C_SCL,$90,[%00000001,buraya 16 bitlik config değeri yazılması gerekiyor]

DATA isimli bir değişken kullanımı mümkün değildir. DATA özel bir komut kelimesidir ve değişken adı olarak kullanılamaz. Derleyici burada hata vermesi gerekirdi !!!!!!!. Vermesede sen onun yerine başka bir isim kullan. Program komutları RESERVED WORDS sınıfına girerler ve değişken adı olrak kullanılamazlar.

Okuma yaparken format yine aynı,
I2Cread I2C_SDA,I2C_SCL,$90,[okunacak registerin pointer adresi, değişken adı]
Burada değişken adı şayet okunan register 16 bitlik ise değişkende 16 bitlik tanımlanmalıdır.

Bu komut gereklimidir bilemiyorum DEFINE I2C_HOLD 1 'Pause I2C transmission while clock held low
Bence onu kaldır sorun olursa deneyeceğin alternatiflerden birisi olarak denersin gerekirse.
Data ve CLK bacakları Pullup dirençli olmalıdır.

Basic  a =Data*0.0001869 bu şekilde bir çarpmaya müsaade etmez. Basic (PBP) yalnızca tam sayılarla çalışır.
Proton Basic Float denilen değişkenler yardımı ile söz konusu olan çarpma işlemini yapabilir .
PBP da bu işlemi yapmanın yolu var elbette.
0.0001869 sayısını 10.000 ile çarparsak 1.869 sayısını elde edersin. Bunu 256 ile çarparsan 478,464 sayısını elde edersin. Bu sayıyı çarpan olarak kullanıp 32 bit işlem yaptırarak sonuca şöyle ulaşabiliriz.
478,464 sayısını 100 ile çarparak 47846 sayısını buluruz (ondalık  kısmı atıyoruz)
Bu sabit çarpan ile A=(HAM */47846)/100  formülü ile elde edilen değer sonucun 10.000 ile çarpılmış halini verecektir sana. Örnek yaparak daha iyi anlarsın. HAM (senin DATA dediğin) bilgi 15750 olsun.
A=15750 * 0,0001869=2,943675 gibi bir değer verir. Aynı sonucu bulabilecekmiyiz bakalım.
Hemen belirteyim PBP da  (Z */Y)  işlemi Z sayısının Y ile çarpılarak 256 ya bölünmüş halini verir ve çarpma büyüklüğü 32 bitdir. Bu nedenle 47846 sayısını bulurken 256 ile çarptık. Formülümüzün normal matematik ile gösterilişi şöyle
A=((15750 * 47846)/256)/100= 29436 sonucunu elde ederiz. Bunu ekranda gösterirken.
LCDOUT $FE,$80,"A=",dec A/10000,",",dec A//10000 şeklinde olur bu satırın ekrandaki gösterim hali 2,9436 şeklinde olacaktır.
A/10000 sayının 10000'e bölünmüş halini verir ondalık kısımlar atılır ve tamsayı olarak 2 yi verir.
A//10000 ise MOD alma işlemidir. A sayısının 10.000 e bölündükten sonra kalanı sana verir yani 9436 rakamını verir. Araya biz bir virgül koyarak bu sayıyı 2,9436 olarak göstermiş oluruz.

Ete

hkalaycioglu

cevap için teşekkürler sağolun ete hocam. A0 girişini GND'ye bağladığımda 31743 5 volta bağladığımda 65535 değerini alıyorum ama çok sağlıklı bir değer alamıyorum. ads1115 i resetlemekmi lazım anlamadım ama çalışmaya devam.

hkalaycioglu

#6
en sonunda devrem şimdilik bitti 4 kanaldan voltaj okuyabiliyorum. yazılımımızın son şekli budur ve çalışmaktadır. similasyon ekleyemiyorum direk olarak devre üzerinde çalıştırarak denedim.ads1115 proteus kütüphanesini bulamadım.
Bilmeyenler için Ads1115 modül girişleri 5 volt ölçebilir daha yüksek voltajları ölçmek için gerilim bölücü dirençler kullanmak gerektiğini belirteyim. İşlemci olarak 16F628 kullandım. 

   
@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _PWRTE_ON & _BODEN_OFF             
DEFINE OSC 20   
CMCON=7       


Define LCD_DREG  PORTB
Define LCD_DBIT  4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG  PORTB
Define LCD_EBIT  1


PORTA = %00000000 
TRISA = %00000001
PORTB=0 
TRISB=0

a VAR word
a1 VAR word
a2 VAR word
a3 VAR word
a=0
a1=0
a2=0
a3=0
ham var word
ham1 var word
ham2 var word
ham3 var word
ham=0
ham1=0
ham2=0
ham3=0
b var word
b1 var word
b2 var word
b3 var word
Pause 100       
LCDOut $fe, 1, "I2CX" 
Pause 1000
LCDOut $fe, 1

main:
   
  I2cwrite porta.0, porta.1, $90, $01,[%1101000100000011]  ; konfigürasyon
                                              ; |||
                                              ; 100 = AIN0 12-13-14 üncü bitler
                                              ; 101 = AIN1 12-13-14 üncü bitler
                                              ; 110 = AIN2 12-13-14 üncü bitler
                                              ; 111 = AIN3 12-13-14 üncü bitler
    pause 15 
    I2Cread porta.0, porta.1, $91, $48,[ham2]
    A2=(HAM2 */474)
    pause 15
    LCDOUT $FE,$80,"VOLT1=",dec a/10000,",",dec a//10000/100," V."
    PAUSE 1000
    LCDOUT $FE,1 
   
   
   
   I2cwrite porta.0, porta.1, $90, $01,[%1100000100000011]
    pause 15               
    I2Cread porta.0, porta.1, $91, $48,[ham1]
    A1=(HAM1 */474)
    pause 15
    lCDOUT $FE,$c0,"VOLT2=",dec a1/10000,",",dec a1//10000/100," V."
    PAUSE 1000
    LCDOUT $FE,1
     
    i2cwrite porta.0, porta.1, $90, $01,[%1111000100000011]
    pause 15
    I2Cread porta.0, porta.1, $91, $48,[ham]
    A=(HAM */474)
    pause 15
    LcdOUT $FE,$80,"VOLT3=",dec A2/10000,",",dec a2//10000/100," V."
    PAUSE 1000
    LCDOUT $FE,1
   
    I2cwrite porta.0, porta.1, $90, $01,[%1110000100000011]
    pause 15
    I2Cread porta.0, porta.1, $91, $48,[ham3]
    A3=(HAM3 */474)
    pause 15
    LCDOUT $FE,$c0,"VOLT4=",dec a3/10000,",",dec a3//10000/100," V."
    PAUSE 1000
    LCDOUT $FE,1
    GoTo main                       
       

       


Powered by EzPortal