Trích:
Nguyên văn bởi electronicltv
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