• slider image 514
  • slider image 516
  • slider image 517
  • slider image 518
  • slider image 519
:::


Browsing this Thread:   1 Anonymous Users






Re: I2C的範例程式?
#3
新會員
新會員


查看用戶資訊
我參考了範例程式寫出來的主端和從端的程式..但是我在ICE2000裡一步一步慢慢執行時..就卡在I2C_BYTE_WRITE裡發出起始狀態候等待SSPIF為HI的迴圈...我參考了[PIC16F87X快速上手]一書中I2C章節各種模式設定..我看不出哪裡有錯誤
......................................................以下是我改的程式(如果不接受貼程式發問的話也希望建議一下可能是哪裡出錯了,我會去找板主介紹的書在試試)
(主控端)
LIST P=16F873A
#INCLUDE <P16F873A.INC>
I2C_Data equ 0x21
org 0x00
nop
goto Prog_Main
nop
nop
Prog_Main:
BANKSEL TRISB ; Select Bank 1
movlw b'11000000' ; setup PORTB
movwf TRISB
BSF OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups
call InitI2C
Main:
BANKSEL I2C_Data ; Bank Switching, in case its bank is differ than I2C_Addr !!
movlw 0x99
movwf I2C_Data ; 設定欲寫入的資料
call I2C_BYTE_WRITE ; Write to I2C Device when Address & Data are set OK
call I2C_BYTE_READ
nop ; 將中斷點設定於此 , 應該看到 W 暫存器的值
nop ; 等於剛才寫入的資料
goto $
I2C_BYTE_WRITE: ; Write a Byte to I2C_Addr with I2C_Data
call StartI2C ; Set SSPCON2.SEN
call WaitI2C ; Wait PIR1,SSPIF
BANKSEL SSPBUF
movlw B'10001110' ; Write Command................
movwf SSPBUF
call WaitI2C
BANKSEL I2C_Data
movf I2C_Data,W
BANKSEL SSPBUF
movwf SSPBUF
call WaitI2C
call StopI2C ; Initial STOP Condition
call WaitI2C ; Wait Until STOP Condition Terminated
return
I2C_BYTE_READ: ; Read a Byte @ I2C_Addr to Buffer I2C_Data
call StartI2C ; Set SSPCON2.SEN
call WaitI2C ; Wait PIR1,SSPIF
BANKSEL SSPBUF
movlw B'10001111' ; Write Read Command..........
movwf SSPBUF
call WaitI2C
call RecI2C ; Enable I2C Receive
call WaitI2C ; Wait Until Buffer Received
BANKSEL SSPBUF
movf SSPBUF,W ; Save to I2C_Data First !!
BANKSEL I2C_Data
movwf I2C_Data
call NACKI2C ; Initial NACK Response !!
call WaitI2C ; Wait until NACK sent out
call StopI2C ; Initial STOP Condition
call WaitI2C ; Wait Until STOP Condition Terminated
return
InitI2C: ; The subroutine of I2C Initialization
BANKSEL TRISC
movlw B'00011000' ; Initial PortC,bit 3 & 4 as Input
movwf TRISC ; RC3 = SCL , RC4 = SDA
BANKSEL PORTC
movlw 0xff
movwf PORTC
movlw 0x09 ; This gives 100KHz I2C clock @ 4MHz......
banksel SSPADD
movwf SSPADD
movlw b'10000000' ; Disable slew rate control.
banksel SSPSTAT
movwf SSPSTAT
movlw b'00000000' ;
movwf SSPCON2 ; Setup MSSP for continuous reception.
movlw b'00101000' ; Enable MSSP and setup for I2C master
banksel SSPCON ; mode.
movwf SSPCON
return
StartI2C: ; Initiate the I2C START condition.
banksel SSPCON2
bsf SSPCON2,SEN
return

StopI2C: ; Initiate the I2C STOP condition.
banksel SSPCON2
MOVLW B'00000001'
MOVWF SSPCON2
return

RstartI2C: ; Initiate the I2C restart condition.
banksel SSPCON2
bsf SSPCON2,RSEN
return

NACKI2C:
banksel SSPCON2
bsf SSPCON2,ACKDT ; Set the ACK bit
bsf SSPCON2,ACKEN ; Initiate the NACK sequence.
return

ACKI2C:
banksel SSPCON2
bcf SSPCON2,ACKDT ; Clear the ACK bit
bsf SSPCON2,ACKEN ; Initiate the NACK sequence.
return

RecI2C:
banksel SSPCON2 ;
bsf SSPCON2,RCEN ; Set the receive enable bit.
return


WaitI2C: ; Poll for SSPIF
banksel PIR1
FLoop: btfss PIR1,SSPIF
goto FLoop
bcf PIR1,SSPIF
return
end
_________________________________________
(從屬端)
#INCLUDE <P16C62A.INC>
TEMP EQU 20H
ORG 0000H
GOTO START
ORG 0004H
BANKSEL SSPSTAT
BTFSC SSPSTAT,R
GOTO WAS_READ
WAS_WRITE:
BTFSC SSPSTAT,D
GOTO WRITE2
BANKSEL SSPBUF
MOVFW SSPBUF ;CLEAR BF
GOTO CLRIF
WRITE2:
BANKSEL SSPBUF
MOVFW SSPBUF ;CLEAR BF
MOVWF PORTB
MOVWF TEMP
BCF PIR1,SSPIF ;CLEAR SSPIF
GOTO END_INT
WAS_READ:
MOVLW B'10101010'
BANKSEL SSPBUF
MOVWF SSPBUF ;SET BF
BSF SSPCON,CKP ;RELEASE CLOCK LINE
CLRIF:
BCF PIR1,SSPIF ;CLEAR SSPIF
END_INT:
RETFIE
START:
BANKSEL TRISA
MOVLW B'11111111'
MOVWF TRISA
MOVWF TRISB
MOVWF TRISC
BANKSEL SSPCON
MOVLW B'00111110' ;I2C SLAVE, 7-BIT WITH INTERRUPT
MOVWF SSPCON
MOVLW B'00000000'
MOVWF PIR1
BANKSEL SSPADD
MOVLW B'10001110' ;I2C ADDRESS SETTING
MOVWF SSPADD
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00001000'
MOVWF PIE1
LOOP:
GOTO LOOP
END



發表於: 2006/4/27 23:47
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: I2C的範例程式?
#2
版主
版主


查看用戶資訊
前述兩個I2C的Slave程式都是用中斷方式處理,建議你還是要從I2C的規格先讀起,舫間有很多PIC16F877的書有I2C詳細的說明,推薦一本洪正瑞老師的"詳細解析PIC16F877原理與應用"第十四章有詳細的說明與範例。台科大圖書公司出版。

發表於: 2006/4/27 15:04
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


I2C的範例程式?
#1
新會員
新會員


查看用戶資訊
請問範例程式裡
[簡單的 Master 端 (Firmware) 及 Slave 端 (Hardware) 相對應的程式範例]
[Hardware SLAVE端程式範例 (AN734)]
[簡單Hardware SLAVE端程式範例]
這三個範例的SLAVE端程式到底有什麼不同
因為程式裡有一些我看不懂的設定..

發表於: 2006/4/25 23:34
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------