I2c Veri okuma problemi

Başlatan aRci, 01 Temmuz 2025, 18:55:57

aRci

Merhaba SHT4X den veri okumaya çalışıyorum pic veri okurma yaparken veri alamıyor olarak gözüküyor ancan lagicanalizer ile veri hattına bakınca veri okunduğunu görüyorum. devrenin tamamı 3,4v ile besleniyor. pic18F25k22 veri hattında 4k7 pull up dirençler vardır.

Basla:
SHTAdr=$89 
SHTCmd=$FD
I2Cwrite SDA,SCL,SHTAdr,SHTCmd,[0]
pause 25
SHTAdr=$88  
I2CREAD SDA,SCL,SHTAdr,[ShtVeri[0],ShtVeri[1],ShtVeri[2],ShtVeri[3],ShtVeri[4],ShtVeri[5]]
hserout[dec ShtVeri[0]," ",dec ShtVeri[1]," ",dec ShtVeri[2]," ",dec ShtVeri[3]," ",dec ShtVeri[4]," ",dec ShtVeri[5]," ",13]
pause 1000
goto basla

ne yapabilirim yardımcı olurmusunuz.


mehmet

#1
Adresin doğru olduğundan emin misiniz?


Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

aRci

ilk mesajdaki haberleşme şeması sensörden alınan değerleri gösteriyor ben ise pic tarafında hiç veri alamıyorum. haberleşme adresi $88 olarak giriyorum bu şekilde lajik analizöre göre veri alınıyor. şuan 5vden 3.3v ye dönüştüren devre yapacağım mosfetli yapılan bir çizim var elimde IRF44N var bununla deneyeceğim benim sorunum pic 3.5 ve de gelen verileri alamıyor gibi alttaki çizimi uygulayacağim

https://www.picproje.org/index.php?topic=78101.0

aRci

devreyi yaptım ama clock sinyali tamamen kayboldu sadece hattı gnd ye çekili bıraktı ğı için haberleşme olmamaya başladı.belkide mosfeti değiştirmeliyim şimdilik pic verileri alamıyor.

mehmet

Lojik analizör çıktısı doğru ise, mcu datayı alıyor. Zira ack sinyalini alıcı taraf yollar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

aRci

Kodun geri kalanı bu şekilde. her saniyede bir sensör den veri alıp bunu uart tan gönderiyor. her hangi bir hesaplama yapmadan ilk olarak veri almayı denedim ama serial den sadece sıfır gözüküyor.

pic ve sensör tek besleme ile çalışıyor. pic hiç veri olarak sıfır gösterdiğine göre acaba data hattının yüksek kenar voltaj seviyesi düşükmü oluyor.

ASM    
 __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_ON_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H            
 __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_ON_2L & _BORV_285_2L     
 __CONFIG _CONFIG2H, _WDTEN_ON_2H & _WDTPS_512_2H                                       
 __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_EXTMCLR_3H    
 __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L    
 __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L    
 __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H   
 __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L     
 __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H    
 __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L    
 __CONFIG _CONFIG7H, _EBTRB_ON_7H 
endasm

    OSCCON = %01111000      '8*4 mhz internal clock, PLL on
    OSCCON2.4= 0
    OSCTUNE= %01000000
    define OSC 64
    INTCON=%00000000
    INTCON2.7=0
    
    PIE1= 0'%00100001
    PIR1= %00000000
    RCSTA= %10010000
    TXSTA= %00100100
    BAUDCON=%01001010
    
    'T1CON  = %00110011  'T1CON.0 aktif etme
    'T1GCON = %01110100        

    ANSELA           = %00000011
    ANSELB           = 0
    'ANSELC           = 0 
    Porta            = 4
    portb            = %11111110
    portc            = %10101011
    
    TRISA            = %00000011
    TRISB            = %11111110  'B portu giriş yapıldı
    TRISC            = %10110110  'C portu 3 giriş/4'ü çıkış yapıldı
    
    WPUB             = %1111110
'===============================================================================
'===============================================================================    
    symbol Bzr       = PORTA.2 'Buzzer
    symbol MtrDogu   = Porta.3
    symbol MtrBati   = Porta.4
    Symbol Rl1       = Porta.5
    
    'Symbol Led       = PORTB.0 'Led
    symbol BtM       = PORTB.1
    symbol BtA       = PORTB.2
    symbol BtY       = PORTB.3
    Symbol YAkim     = Portb.4
    Symbol SnrDg     = Portb.5
    Symbol SnrBt     = Portb.6

    
    'symbol TmSDA     =   PORTC.5
    'symbol TmSCL     =   PORTC.3
    symbol TmSTB     =   PortA.7
    
    WPUB             = %11110111
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////Analoglar///////////////////////////////      
    Symbol GODONE    = ADCON0.1  'Dönüştürme Durum Biti Devam ediyor = 1
    Symbol ADONE     = ADCON0.0  'Dönüştürme Modülü Etkin = 1
    'ADCON1           = %10100000
    'ADCON2           = %10111001
    Symbol ADIF      = PIR1.6      'ADC okuma bitti kesme bayrağı      
    Define  ADC_BITS     10   ' Set number of bits in result
    Define  ADC_CLOCK    32    ' Set clock source Fosc/4
    Define  ADC_SAMPLEUS 50   ' Set sampling time in uS
'///////////////////////////////////////////////////////////////////////////////  
'////////////////////portb - TMR - Genel Kesmeler///////////////////////////      
    Symbol GIE       = INTCON.7    'genel kesmeler aktif                         
    Symbol PEIE      = INTCON.6    'Çevresel kesmeler aktif
    'Symbol IPEN      = RCON.7      'Oncelikler aç kapat
    Symbol TMR0E     = INTCON.5    'TMR0 Kesme 
    Symbol INT0      = INTCON.4    'RB0 Kesme Etkinleştir
    Symbol IOCE      = INTCON.3    'RB Değişim Kesme 
    Symbol TMR0IF    = INTCON.2    'TMR0 Taşma Bayrağı Ouyarak Sıfırlanmalı
    Symbol INT0IF    = INTCON.1    'INT0 harici Kesme Bayrağı Okutarak Sıfırla
    Symbol IOCF      = INTCON.0    'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol RCIE      = PIE1.5      'EUSART alma kesmesi              
    Symbol RCIF      = PIR1.5      'EUsart Kesme Bayrağı             
    'Symbol RCIP      = IPR1.5      'EUsart ALma Kesintisi Öncelik    
    Symbol SPEN      = RCSTA.7    'Seri Bağlantı Noktası Etkin = 1
    Symbol CREN      = RCSTA.4    'Sürekli veri alma etkin = 1
    Symbol OERR      = RCSTA.1    'Sürekli veri alma etkin = 1
    Symbol FERR      = RCSTA.2 
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    'T1CON = %00110000
    Symbol TMR1ON     = T1CON.0    'TMR1 Etkinleştir = 1
    Symbol TMR1E      = PIE1.0     'TMR1 Kesme izni
    Symbol TMR1F      = PIR1.0
    'TMR1H=$63:TMR1L=$C2
'===============================================================================
'===============================================================================
    INT0             = 0  'INT0 kesme açık =1
    PEIE             = 0  'Çevresel Kesmeler Aktif                                                                                
    SPEN             = 1  'Seri Bağlantı Noktası Etkin = 1
    CREN             = 0  'Sürekli veri alma etkin = 1
    CREN             = 1
    RCIE             = 0  'EUsart Alma Kesmesi Aktif  = 1
    'IOCBP            = %00000000 'yükselen kenar değişim kesmesi için pin seçimi
    'IOCBN            = 0'%00000001 'düşen kenar değişim kesmesi için pin seçimi
    IOCE             = 0'1  'RB değişim kesmesi Aktif = 1
    GIE              = 0  'Tüm kesmeler açık = 1
'===============================================================================
'===============================================================================

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 130 ' 9600 Baud @ 64MHz, -0,02%
SPBRGH = 6
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
pause 100
'===============================================================================
'=============================================================================== 
    ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)
    GIE              = 0  'Tüm kesmeler açık = 1  
'=======================    Include Configuration    ==========================
    Symbol Clk = Portc.3
    Symbol Dta = Portc.5
    
    ShtVeri var byte [10]
    Drce    var word
    Nem     var word
    
    Tmp1    Var word
    Tmp2    Var word
    
    
    pause 1000
'===============================================================================
'===============================================================================
'i2cwrite   Dta,CLK,$8A,$94,[0]:pause 200
'i2cwrite   Dta,CLK,$8A,$94,[0]:pause 100
low Bzr
SDA     VAR		portc.5		' change if needed
SCL     VAR		portc.3		' change if needed
SHTAdr var byte
SHTCmd var byte

Basla:
SHTAdr=$89 
SHTCmd=$FD
I2Cwrite SDA,SCL,SHTAdr,SHTCmd,[0]
pause 25
SHTAdr=$88  
I2CREAD SDA,SCL,SHTAdr,[ShtVeri[0],ShtVeri[1],ShtVeri[2],ShtVeri[3],ShtVeri[4],ShtVeri[5]]
hserout[dec ShtVeri[0]," ",dec ShtVeri[1]," ",dec ShtVeri[2]," ",dec ShtVeri[3]," ",dec ShtVeri[4]," ",dec ShtVeri[5]," ",13]
pause 1000
goto basla
'===============================================================================
'===============================================================================
DISABLE
SimGln var byte [10]
KstUart var bit
Kesme:
GIE = 0
'===============================================================================
'Uart kesmesi. Sim800 yada ESP8266 dan gelen veriler alınıyor.
'===============================================================================
SimTmp var byte
if RCIF = 1  then
   hserin 20, Gecc,[str SimGln\10] 
Gecc:
    KstUart    = 1
    SimTmp     = RCREG
    RCIF       = 0
    goto Atla1
endif
'===============================================================================
' Portb.4-7 kesmesi.
'===============================================================================
'if RBIF = 1 then
'   if Aux = 0 and LoraDrm = 0 then 
'   Serin2  LoraR,84,100,LoraAtla,[wait("aRci"),LoraGln]
'   endif
'LoraAtla:
'   KsmTemp = portb
'   Serout2 NextTx,84,["Lora",13]
'   RBIF = 0
'endif
'===============================================================================
'Timer kesmesi. zaman sayaçları için
'===============================================================================
'if TMR0IF = 1 then 
'    TMR0IF = 0
'    TMR0   = 0
'endif
'===============================================================================
'Portb.0 değişim kesmesi. Mcp23017 girişlerinde değişim olunca kesme oluşturuyor.
'===============================================================================
'if INT0IF = 1 then 
'         pause 50
'         i2cread     SDA,SCL, chip1,GPIOB,[Giris]
'         PlcKnt[0] = portb
'         KstGrs  = 1        
'         INT0IF = 0
'endif

Atla1:
GIE = 0
Resume

enable

aRci

Merhaba
Başka bir denetletyiciyi bağladım aynı kodlar ile çalışmaya başladı sıcaklık ve nem değerini okuyabildim.
18F46K20 ile deneyince oldu


ete

I2C haberleşmede Device adres denilen Cihaz kodu yada haberleşme adresi denilen şey sürekli olarak kafa karıştıracak şekillerde açıklanır. Genelde bu adresi 7 bit üzerinden veriyorlar. Bunun başlıca sebebi Okuma işleminde soldan 7 bit verilen adres sağdaki son bit ise 1 yapılarak kullanılıyor.
Yazma işleminde ise sağdaki bit 0 sıfır yapılarak kullanılıyor.Şimdi mesajlara bakıyorum. Arci adresi $88 bir başka yerde $89 bir başka yerde $8A ve $8B olarak kullanmış yada denemiş.
Mehmet'in verdiği ve data sheet den alıntı olarak yapılan açıklamada ise $44 olarak verilmiş bu adres. Ben önceden de benzer durumlar ile çok fazla karşılaştığım için kendimce bu sorunun adres değerinden kaynaklandığını düşünüyorum.
Biraz daha sesli düşünür isek ;
$44 değeri binary olarak  %0100 0100 olarak gözüküyor.
$88 değeri ise bin olarak  %1000 1000 şeklinde görülüyor. Sanki $44 değerinin bir bit sola kaydırılmış hali gibi gözüküyor.
Data Sheet'i inceledim. Hiç bir yerinde bu device adresin 7 bit üzerindenmi yoksa 8 bit üzerindenmi verildiği belirtilmemiş. C dilindeki örneklere baktım hemen her kes bu adresi 0x44 olarak kullanmış.
Bu durumda ben bu adresin okumada $45 (%0100 0101) ve yazmada $44 (%0100 0100) şeklinde kullanılması gerektiğine karar verdim.
Genelde 7 bit üzerinden verilen Device adresler için bu data sheetlerde belirtiliyor. Gerçi buda kafa karışıklığı yaratan bir husus zira %xxxxxxx0 şeklindemi 7 bit kullanılacak yoksa  %0xxxxxxxx şeklindemi kullanılacak belli olmuyor. Ancak mantık yürütürsek en sağdaki bit değişebildiği için 7 bitin %xxxxxxx0 şeklinde kullanılması gerekir.

Her neyse bir hususu daha belirteyim. I2C yazma ve okuma komutlarındaki device adresin en sağındaki bitin ne olacağını Basic otomatik olarak ayarlamaktadır. Bu nedenle siz bu adresi okumada da yazmada da $44 olarak kullanın. Basic bunu yazmada kendisi $44, okumada ise $45 yapacaktır.

Ben olsam öncelikle Serial Number değerini okur ve ard arda okumalarda aynı rakamı (16 bit) okuyup okumadığıma bir bakardım. Şayet aynı sensörden iki adet var ise onunda seri numarasını okuyup farklı okuma yapıp yapmadığıma da bakardır.
Her şey uygun ise diğer dataların okumasına geçerdim.

Mesajı yazarken Arci bir mesaj daha yollamış ve başka bir işlemci ile bilgileri okuyabildiğini söylemiş.
Bu gibi durumlarda ben hayrete düşüyorum. Nasıl olabiliyor. Ortada data sheet var bir haberleşme adresi veriyor ve farklı bir adres kullanılarak o bilgiler okunabiliyor. Kimin doğru yaptıuğını yada söylediğine karar veremedim. Enteresan bir durum. Zİra okunan bilgiler mantıklı arda arda okumalarda mantıklı bilgiler gelmiş. Yanlış adres kullanılmış olsa ya bilgi okunamaaycak yada abuk subuk şeyler okunacak idi. Biri bana bu durumu açıklasın. Neden data sheet $44 dediği adresi $8B olarak kullanarak doğru bilgi okuyabiliyoruz. Yada bu $8B adresinin nereden bulunduğunu da açıklarsanız ikna olacağım. İki farklı üreticimi var acaba. ???.


Ete



aRci

#8
Merhaba
sensör adresi $44 ancak veri okuma yazmada dediğiniz gibi $88 olarak kullanmak gerekiyor.bu şekilde veri alışverişi oluyor. 18F25K22 bir pcb üzerinde montajlı ve rc3-rc5 pcb üzerinde bir modüle direnç üzerinden bağlı idi. sonradan dirençleri sökerek bağlantıyı kestim.
lojik analizör haberleşme var gösterirken pic neden bunu algılayamadı bilemiyorum bu pic le çok bir çalışmam olmadı belki sigorta ayarları yüzündendir bilmiyorum.
  25K22 de kullandığım kodlarda sadece sigortayı değiştirip 18F46K20 de denedim ve çalışmaya başladı.  buda beni sigorta ayarlarından veya pcb deki bir tür problemden dolayı olduğunu düşündürdü.
  lojik level hakkında ise mosfetli devreden sonuç olamayınca sda ve scl pinlerine seri 1k direnç attım ve ams1117 ile de 5v yi 3.3v ye düşürüp sensörü besledim bu hali ile sensörden veri alabiliyorum.

ete

Device adresleri daima yazma üzerinden verilir ve burada $44 yazma için veriliyor ise okuma için o adres $45 olur hiç ve bir zaman $88 olmaz. Sen bu $88 rakamını nereden buldun.?

Her neyse okuma yapabiliyor isen sorun yok. Demek senin sensör bu adresi kullanıyormuş demek en iyisi.

Ete

aRci

Aslında sizin ilk mesajınızdaki anlatımdaki gibi $44 verisini sola 1 bit kaydırınca ortaya bu $88 çıkıyor. bundan ibaret altta paylaştiğim lojik analizerin yakaladığı sensörün ısı okuma talebine karşı veri gönderimini göstermekte.
burada soldaki 0x44 pic tarafından gönderilen sorgu sonrasındaki 6 byte ise ısı nem ve crc verileri. ben burada ısı verisini okurken alttaki kodla yapmaktayım dikkat ederseniz adres olarak $88 kullanılmış. ama grafikte ilk yakalanan veri $44 olarak gözükmekte bunun ise analizerin I2c modunda olmasına ve start biti ardından gelen verinin adres verisi olduğunu ve buna göre değerlendirdiğini düşünüyorum.
eğer palslere göre data hattını hesaplarsak soldan sağa doğru 7.bitden başlayarak hesapladığımızda ilk 8 bitten elde edilen değer $89 çıkarken ust kısımda yeşil renkli kısımda "Read [$44] + ack" yazmakta buda bize analizerin veriyi yorumlayarak okuma modu ve adresin $44 olduğunu ifade ediyor.

Sonuç olarak sizin ilk mesajınızdaki durumu kanıtlamış oluyoruz.

SHTAdr=$88  
I2CREAD SDA,SCL,SHTAdr,[ShtVeri[0],ShtVeri[1],ShtVeri[2],ShtVeri[3],ShtVeri[4],ShtVeri[5]]



Powered by EzPortal
▲