I2C donanımsal haberleşme

Başlatan homer380, 02 Şubat 2016, 12:15:55

homer380

merhaba. i2c ile donanımsal haberleşmek üzerine çalısıyorum. haberleşme başlıyor ama stop biti ile sonlandırmayı yapamadım. yardım edebilecek varmı?

         Device 16F877A		
@ CONFIG_REQ 
@ __config CP_ALL & CPD_ON & WDT_OFF & HS_OSC & PWRTE_OFF & BODEN_OFF & WRT_1FOURTH & LVP_OFF & DEBUG_OFF
        Xtal 4			'Osilatör Hızı 4 Mhz
         All_Digital TRUE
        TRISC=255
        
         
Symbol SCL = PORTC.3 ' I2C clock input
Symbol SDA = PORTC.4 ' I2C data input

SSPSTAT=$80
SSPCON=$28

ANA:


GoSub I2C_BASLA
GoSub I2C_YAZ
DelayMS 1000

GoTo ANA

I2C_BASLA:
SSPCON2.0=1
While PIR1.3=1
PIR1.3=0
Wend
Return

I2C_YAZ:

SSPBUF=$77
While PIR1.3=1
PIR1.3=0
Wend
sspcon2.2=0               ' stop biti

Return


sspcon2.2=0  ekliyorum ama iletisim sonlanmadı. yada sspstat.4 =0 denedım olmadı. nerde hatam var.


ferit06

#1
SCL ve SDA için declare komutunu eklemelisiniz.

Declare SDA_Pin = PORTC.4 'SDA pin
Declare SCL_Pin =PORTC.3 'SCL pin


Donanımsal olarak kullanmak için aşağıdakı kod örneğini inceleyebilirsiniz.
progtea5767:
    adval=advaly
    Frekans=869+adval
    Pll = Frekans * 100000 -112500 
    Frekans=Pll
    Frek=Frekans/100000
    Frek=frek+3
    'Pll = Pll * 4 / 32768  =>  4/32768=1/8192
    Pll=Pll/8192

    data_yaz[0]=Pll.Byte1
    data_yaz[0]= data_yaz[0]& %00111111
    data_yaz[1]=Pll.Byte0
    data_yaz[2]=$00
    data_yaz[3]=$12 ' stereo noise cancelling on
'    data_yaz[3]=$10 'stereo noise cancelling Off
'    data_yaz[4]=$40  deamphasis 75 uS ( amerika
    data_yaz[4]=$00   'deamphasis 50 uS ( avrupa
I2COut SDA, SCL, tea5767,[Str data_yaz\5] '[Pll.Byte1,Pll.Byte0,$10,$10,$00]'istek yaz 
I2CIn SDA, SCL, tea5767R,[Str data_oku\5]'[data_oku[0],data_oku[1],data_oku[2],data_oku[3],_
 '                           data_oku[4]]'durum oku 
    ses = data_oku[3]>>4 
    'istasyon=data_oku[0] 
    data_oku[0]= data_oku[0]& %00111111
    Pll_R=data_oku[0]*256
    Pll_R=Pll_R+data_oku[1]
    FrekansR=Pll_R*8192
    FrekansR=FrekansR +225000
    'FrekansR=FrekansR/100
    FrekR=FrekansR /100000
'    FrekR=994
    stereo=data_oku[2]
    If stereo.7=1 Then 
            LED=1 ' yayın stereo
        Else LED=0
    EndIf

Return


homer380

benim asıl sorun yazılımsal olarak $77 olarak gönderdiğim veriyi $76 olarak alması sonucu donanımsal i2c denemeye karar verdim. haberleşme başlıyor ama sonlandıramadım. declare eklememe rağmen hala sonlanmadı.

ferit06

#3
Neden Protonun I2C komutunu kullanmıyorsunuz?

yukarıda verdiğim örnekte yer  alan şu gibi?
I2COut SDA, SCL, tea5767,[Str data_yaz\5] '[Pll.Byte1,Pll.Byte0,$10,$10,$00]'istek yaz
I2CIn SDA, SCL, tea5767R,[Str data_oku\5]'[data_oku[0],data_oku[1],data_oku[2],data_oku[3],_


Burada tea5767 ve tea5767R (daha önce symbolenmiş)slave yazma ve okuma adresleridir.

homer380

kullandım ama isis de $77 olarak gönderdiğim verinin $76 olarak gittiğini gördüm. olmaması gereken birseydi.

ferit06

#5
Kodunuzun içerisinde

SSPADD kulanılmamış. Adres kullanılmadığı için adres eşlemesi yapılamadığı için haberleşmeyi tamamlamıyor olabilir.

SSPCON1 de ayarlanmalı....

aşağıdaki bağlantılarda Microcihip in uygulama notları var asm olarak. bu asm uygulamaları protona ilave edebilirsin.

PIC Slave ;     http://ww1.microchip.com/downloads/en/appnotes/00734b.pdf 

PIC Master;  http://ww1.microchip.com/downloads/en/appnotes/00735a.pdf

setting up a network protocol for environmental monitoring   http://ww1.microchip.com/downloads/en/appnotes/00736a.pdf


Burada da PICBasi için Slave  PIC örneği var;  http://www.picbasic.co.uk/forum/showthread.php?t=10141&p=70366#post70366