////////////////////////////////////////////////// // I2Cスレーブテストプログラム // // PIC16F873 RIKIYA 2002.12.09 // // i2cslv34.C // // ID = 自動設定 // // 1:3通信スレーブ側プログラム // // マスター側とデータを送受信し // // 受信データをPBに表示する。 // // スレーブアドレスは、PB4〜7ビット // // から読み込むデータで自動設定する // ////////////////////////////////////////////////// #include <16f873.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use delay(clock = 10000000) // clock 10MHz #use fast_io(B) // 固定入力モード #use i2c(SLAVE,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0x00,FAST,FORCE_HW) void add_set(int add); // プロトタイプ宣言 int DATA = 0; // 送信データの宣言 //SSP割り込み処理関数//////////////////////////////// #INT_SSP void ssp_interupt (){ if(i2c_poll()){ //データ受信判定 output_b(i2c_read()); //マスターからの受信 } else{ i2c_write(DATA + 1); //マスターにDATAを送信 delay_ms(250); //250mS待機 output_b(0x00); //自分のPBに0x00を出力 } } //メイン関数///////////////////////////////////////// void main (){ set_tris_b(0xf0); //RB 7-4:IN 3-0:OUT set_tris_c(0x1f); //RC 7-5:OUT 4-0:IN output_float(PIN_C3); //I2C pin float output_float(PIN_C4); //I2C pin float output_b(0x01); //正常起動確認 // ハードウエア配線から出力データを作る DATA = (input_b() >> 4) & 0x07; // スレーブアドレス設定 add_set(DATA * 2); enable_interrupts(GLOBAL); //全ての割り込みを許可 enable_interrupts(INT_SSP); //SSP割り込みを許可 while (1) {} //無限ループ } //アドレス自動設定//////////////////////////////////// void add_set(int add){ int *sspadd = (int *)147; // 変数*sspaddにSSPADDのアドレス147をセット *sspadd = add; // SSPADDレジスタにアドレスをセット }