////////////////////////////////////////////////// // PWMテストプログラム21(2改) // // PIC16F873 RIKIYA 2003.02.01 // // picpwm21s.c // // I2Cスレーブ役としてマスターからのデータに // // 基づいてサーボモータを動かす。 // // スレーブアドレスは、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); // プロトタイプ宣言 void ccp1_int(void); // プロトタイプ void ccp2_int(void); // プロトタイプ //メイン関数///////////////////////////////////////// void main (){ int *sspcon = (int *)20; //変数*sspconにSSPCONのアドレス20をセット long data; setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); setup_ccp1(CCP_COMPARE_INT); // CCP1コンペアマッチ割込み設定 setup_ccp2(CCP_COMPARE_INT); // CCP2コンペアマッチ割込み設定 set_timer1(0x0000); // TMR1クリア CCP_1 = 3752; // パルス幅 0.4u * 1 * 3752 = 1.5mS CCP_2 = 50000; // 周期 0.4u * 1 * 50000 = 20mS set_tris_b(0xf0); //RB 7-4:IN 3-0:OUT set_tris_c(0x18); //RC 4,3:IN 7-5,2-0:OUT output_float(PIN_C3); //I2C pin float output_float(PIN_C4); //I2C pin float output_b(0x01); //正常起動確認 // スレーブアドレス設定 add_set((input_b() >> 3) & 0x0e); enable_interrupts(INT_CCP1); //CCP1コンペアマッチ割込み許可 enable_interrupts(INT_CCP2); //CCP2コンペアマッチ割込み許可 enable_interrupts(GLOBAL); //全ての割り込みを許可 while (1) { *sspcon = *sspcon & 0xBF; //OVFのクリア data = i2c_read(); //データ受信 if(data != 0){ CCP_1 = 2500+(data*10); //パルス幅の設定 output_b(data); //受信データのモニタ } } } //パルスクリア/////////////////////////////////// #INT_CCP1 void ccp1_int(){ output_bit(PIN_C2,0); // RC3BITを0にする。 } //パルス出力///////////////////////////////////// #INT_CCP2 void ccp2_int(){ if(CCP_1 != 0x0000){ // CCP_1が0でなければ、 output_bit(PIN_C2,1); // RC3BITを1にする。 } set_timer1(0x0000); // TMR1クリア } //アドレス自動設定//////////////////////////////////// void add_set(int add){ int *sspadd = (int *)147; // 変数*sspaddにSSPADDのアドレス147をセット *sspadd = add; // SSPADDレジスタにアドレスをセット }