/*********************************************** * トリケラトプスを使ったロボット No2 * アナログ入力値から前進更新に分離して * デューティ値に出力 ***********************************************/ #include <16f873A.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NODEBUG #device ADC=10 //A/D変換10ビットモード #use delay(CLOCK = 10000000) //クロック10MHz //// グローバル変数定義 long data; //計測データ int interval, counter; //目玉点灯周期用変数 //// タイマ0割込み処理 #int_timer0 void isr_timer0() { set_timer0(interval); counter --; if(counter == 0) { counter = 50; //カウンタ再セット output_bit(PIN_A5, !(input(PIN_A5))); //発光ダイオードの点滅 } } ///// メイン関数 void main() { /// 初期設定 counter = 50; //目玉周期初期設定 output_high(PIN_C0); //初期状態は停止 output_high(PIN_C3); set_tris_a(1); //RA0のみアナログ入力 set_tris_b(0); set_tris_c(0); //全部出力 /// CCP1の初期設定 setup_ccp1(CCP_PWM); // CCP1をPWMモードに設定 setup_ccp2(CCP_PWM); // CCP2をPWMモードに設定 setup_timer_2(T2_DIV_BY_1, 0xFF, 1); // タイマ2設定 /// A/D変換の初期設定 setup_adc_ports(RA0_ANALOG); //RA0ピンがアナログ入力 setup_adc(ADC_CLOCK_DIV_32); //Fosc/32 速度設定 ///// Timer0 Start setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); set_timer0(0); //タイマ値初期設定 enable_interrupts(INT_TIMER0); //タイマ0割込み許可 enable_interrupts(GLOBAL); //グローバル割込み許可 ///// 制御メインループ while(1) //永久ループ { set_adc_channel(0); //チャネル0選択 delay_us(20); //アクイジション待ち data = read_adc(); //A/D変換データ10ビット読み込み /// デューティ制御出力 if(data > 0x210) { output_high(PIN_C0); //一旦停止 output_high(PIN_C3); set_pwm2_duty(2*(data-0x200)); // デューティ値設定 set_pwm1_duty(0); // デューティ値設定 output_low(PIN_C3); //CCP2で回転 interval = (data-0x200)/2; } if(data < 0x1F0) { output_high(PIN_C0); //一旦停止 output_high(PIN_C3); set_pwm2_duty(0); // デューティ値設定 set_pwm1_duty(2*(0x1FF-data)); // デューティ値設定 output_low(PIN_C0); //CCP1で回転 interval = (0x1FF-data)/2; } if((data >= 0x1F0) && (data <= 0x210)) { /// 停止出力 output_high(PIN_C0); output_high(PIN_C3); set_pwm1_duty(0); // デューティ値設定 set_pwm2_duty(0); // デューティ値設定 interval = 0; } delay_ms(20); } }