////////////////////////////////////////////////// // PWMテストプログラム1 // // PIC16F873 RIKIYA 2002.12.15 // // picpwm1.C // // TMR1をつかってサーボーモータ用のPWM波形を出力// // CCP2コンペアマッチ割込で周期20mSを生成 // // CCP1コンペアマッチ割込でパルス幅を生成 // ////////////////////////////////////////////////// #include <16f873.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use delay(clock = 10000000) // clock 10MHz #use fast_io(C) // 固定入力モード void ccp1_int(void); // プロトタイプ void ccp2_int(void); // プロトタイプ //メイン関数//////////////////////////////////// main(){ 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 = 0; // パルス幅 0 CCP_2 = 50000; // 周期 0.4u * 1 * 50000 = 20mS set_tris_c(0x00); //RC 7-0:OUT enable_interrupts(INT_CCP1); //CCP1コンペアマッチ割込み許可 enable_interrupts(INT_CCP2); //CCP2コンペアマッチ割込み許可 enable_interrupts(GLOBAL); //全設定割込み許可 while(1){ CCP_1 = 3752; //パルス幅 0.4u * 3752 = 1.5mS delay_ms(1000); CCP_1 = 2500; //パルス幅 0.4u * 2500 = 1.0mS delay_ms(1000); CCP_1 = 5000; //パルス幅 0.4u * 5000 = 2.0mS delay_ms(1000); } } //パルスクリア/////////////////////////////////// #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クリア }