Ðề tài: Giao tiếp I2C
View Single Post
Old 04-07-2008, 12:29 PM   #94
hopeman
Đệ tử 6 túi
 
hopeman's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Smile

Trích:
Nguyên văn bởi electronicltv View Post
Cấu hình cho I2C của pic8F4431 dùng pin_D2 và pin_D3 như sau:
trường hợp 1:
Code:
#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C5, address=0xa0,force_hw,slow)
trường hợp 2:
Code:
#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_D2, SCL=PIN_D3, address=0xa0,force_hw,slow)
Tìm hoài k thấy tài liệu hướng dẫn về dzụ này. Với trường hợp 1 thì chạy đúng mặc dù phần mềm chọn pin_c4 và C5 còn phần cứng dùng Pin_D2 và D3. Còn trường hợp 2 là pó chíu luôn, kô xảy ra ngắt SSP luôn. Tìm ra hai trường hợp này là phải ngồi "mò" cả ngày, hic
Vậy giải thích hai trường hợp này: do CCS "chuối" hay do người dùng "gà" quá?
mình cũng đã từng gặp trường hợp như bạn. theo mình nghĩ thì có thể là vì từ khóa "force_hw" tức là dùng phần cứng mặc định, vì vậy dù bạn khai là chân D2 và D3 nhưng tín hiệu vẫn ra chân C4 C5 ( con 4431 có 2 đường i2c mà ), bạn thử bỏ từ khóa này đi xem sao .

mấy hôm rồi mình bị mất đồng bộ gửi nhận suốt, các bạn nếu mới làm nhớ để ý bên con slaver trong quá trình nhận nhé
mình khuyến cáo nên dùng cấu trúc sau để nhận trong trình xử lý ngắt #INT_SSP ssp :
while(count_i2c!=4) {

while(!i2c_poll()) ;

buffer[count_i2c++]= i2c_read(); //Read Next

}
hy vọng ko ai phải mất thời gian về i2c nhiều như mình .hichic
__________________
mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com
hopeman vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn