2 tane 16f877'yi I2C ile haberleştirme

mutalipg

Üye
Katılım
20 Ara 2008
Mesajlar
2
Puanları
1
2 tane 16f877'yi I2C ile haberleştirmeye çalışıyorum. Biri master diğeri slave olacak. Yardımlarınızı bekliyorum.
 
Konuyla ilgili çalışmam olmadı (daha doğrusu yarım bırakmıştım) ama sanırım önce kullanacağın picleri master slave olarak mssp control register da tanımlamalarını yapıyorsun. Aynı registerde protokolü I2C olarak tanımlıyorsun. Sonra master ile serial data (sda) ve serial clock (scl) üretiyorsun. Sonra veri transferi için bir cihaz tanıma kodu atıyorsun. Byte tipi verileri olduğu gibi, word tipi verileri de ikiye bölüp lowbyte-highbyte olarak alıp gönderebiliyorsun. Bunları ilham vermesi için yazdım. Hatalar olabilir ama bu kadar anımsayabildim.
 
Vatandaşın biri şöyle yazmış.
I2C: Phillips şirketi tarafından geliştirilmiş. Güvenli veri transferi iççn iki hat kullanır.
Serial Clock (SCL)
Serial Data (SDA)

Aynı hat üzerine pek çok cihaz bağlanabililr ve tüm bunlar iki hat ile yapılır. Genelde master -slave olarak kullanılır. Yani bir master olur ve hattı yönetir diğer cihazları adresler. Multi-Master desteğide bulunmakta.

Haberleşme şu şekilde olur.Master hatta start biti gönderir ve haberleşeceği slave cihazı adresler. 8 bitlik bir adresleme bilgisi kullanılır(başka birde 10 bit olnaı vardı yanlış hatırlamıyorsam) ilk 7 bit asres iiçn kullanılırken son bit okumamı yazmamı olacağını belirler. Slave cihaz da bunun üzerine bir kabul biti göndererk master a iletişişme hazır olduğunu söyler. iletişişm bittiğinde hatta stop biti gönderilir.

I²C - Wikipedia, the free encyclopedia
 
Yardımlarınız için teşekkür ediyorum. Bana assebly kodu lazım. Özellikle bu iletişimde "slave" olana örnek bir assemly kodu iyi olur. Bu konuda çalışmaları olan arkadaşlardan yardımlarını bekliyorum.
 
Daha önce ben yapmıştım test için kullandığım asmleri veriyorum ben 18f452 kullanmıştım 16f877 dede çalışması lazım sadece bank seçimlerini eklemen gerekecek kolay gelsin

MASTER ASM

SERIAL

BSF TRISC,7
BCF TRISC,6
BCF TRISC,5
BSF TRISC,4
BCF TRISC,3
BCF TRISC,2
BCF TRISC,1
BCF TRISC,0

movlw B'00000000' ; SPI, middle of
movwf SSPSTAT ; output time sampling
;BANKSEL SSPCON ; BANK 0
movlw B'00110001' ; Mode 1,1 SPI Master Mode, 1/16
; Tosc bit time
movwf SSPCON1 ; SSP is on

RETURN

SENDCMD
BCF SSPSTAT , BF
MOVFF DATAM , SSPBUF
SC1 BTFSS SSPSTAT , BF
GOTO SC1
RETURN


RESPOND
BCF SSPSTAT , BF
MOVFF DATAM , SSPBUF
SC2 BTFSS SSPSTAT , BF
GOTO SC2
MOVFF SSPBUF , DATAM
RETURN

Send_DT

bcf PORTA,2 ;SS PIN Enable Chip Select Output (low)
;movf DATAM,W ; Get Ctr (Counter Value) in W
movwf SSPBUF ; put in SSPBUF
;BANKSEL SSPSTAT ; BANK 1
Char1
btfss SSPSTAT,BF ; Data transfer complete?
; (Buffer Full?)
goto Char1 ; if not, check again

movf SSPBUF,W
; Read SSPBUF register
bsf PORTA,2
;CALL Chk4Dat
RETURN
Update_Test_Counter
incf DATAM,F ; Increment counter variable
Delay
movlw H'F0' ; Simple Delay loop
movwf Dly1 ; |
movlw H'0F' ; |
movwf Dly0 ; |
DlyLoop
decfsz Dly0,F ; |
goto DlyLoop ; |
decfsz Dly1,F ; |
goto DlyLoop ; |

DoAgain

goto Send_DT
Chk4Dat
MOVF SSPBUF,W
MOVWF PORTD
RETURN
bsf PORTA,2

btfss SSPSTAT,BF ; Indirectly test
goto Chk4Dat ; New data, do a transfer
RXXData
movf SSPBUF,W ; put in SSPBUF into W
movwf PORTD ; Show the results on PORTB
RETURN ; Receive Next Byte


SLAVE ASM

SERIAL
BSF TRISC,7
BCF TRISC,6
BCF TRISC,5
BSF TRISC,4
BSF TRISC,3
BCF TRISC,2
BCF TRISC,1
BCF TRISC,0
movlw B'00000000' ; SPI with middle of
movwf SSPSTAT ; output time sampling
movlw B'00110100' ; Mode 1,1 SPI Slave Mode,
movwf SSPCON1 ; SSP is on
RETURN

SENDCMD
BCF SSPSTAT , BF
MOVFF DATAM , SSPBUF
SC1 BTFSS SSPSTAT , BF
GOTO SC1
RETURN
RESPOND

BCF SSPSTAT , BF
MOVFF DATAM , SSPBUF
SC2 BTFSS SSPSTAT , BF
GOTO SC2
bcf PORTD,0
MOVFF SSPBUF , DATAM
RETURN



Chk4Dat
btfss SSPSTAT,BF ; Indirectly test
goto Chk4Dat ; New data, do a transfer
RX_Data
movf SSPBUF,W ; put in SSPBUF into W
movwf PORTD
movf SSPBUF,W
DoAgain
;CALL Send_DT ; Optional customer code can go here
RETURN ; Receive Next Byte
Send_DT

;CALL RdRS232 ;MOVLW H'22' ; Get Ctr (Counter Value) in W
movwf SSPBUF ; put in SSPBUF
Char1
btfss SSPSTAT,BF ; Data transfer complete?
; (Buffer Full?)
goto Char1 ; if not, check again
movf SSPBUF,W ; Read SSPBUF register
RETURN
 
Yardımlarınız için teşekkür ediyorum. Bana assebly kodu lazım. Özellikle bu iletişimde "slave" olana örnek bir assemly kodu iyi olur. Bu konuda çalışmaları olan arkadaşlardan yardımlarını bekliyorum.

yazmaya başlarsanız herkes yardımcı olacaktır takıldığınız yerlerde, ancak hiçbirşey yapmadan direkt olarak kodları istemek yanlış, uygun değil. çünkü burası ödev yaptırma sitesi değil. bir paylaşım platformu. bu konuda da paylaşım olarak, bunu yaptırmayı görmek olmaz.

yapmaya başlarsanız, takıldığınız yerlerde yardımcı olunur.
 

Forum istatistikleri

Konular
129,836
Mesajlar
930,614
Kullanıcılar
452,665
Son üye
Murat açıkel

Yeni konular

Geri
Üst