// ej-pwpack.c // エレキジャックNo.6パワーパックプログラム for PIC12F675 by.智田聡丞 // delay.hとdelay.cはPICC-Liteのサンプルの中にありますので、 // このファイルと同じ場所にコピーしてからコンパイルしてください。 #include #include "delay.h" __CONFIG(UNPROTECT & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO); // MCLRが生きているので、これを利用して非常停止も可能 unsigned char SPD=0; // 現在の速度 unsigned char MAX=0; // 最高速 unsigned char ACC=0; // 加速度 unsigned char I=0; // ループ作業用 main() { OSCCAL=_READ_OSCCAL_DATA(); // OSCCALを代入(PIC12F629/675のみ) GPIO= 0b00000000; // ポート出力をすべてオフにする TRISIO=0b00111011; // ポート設定 GP3以外はすべて入力 CMCON= 0b00000111; // コンパレータ−はオフ ANSEL= 0b00010011; // Fosc/8、GP0,GP1をADC入力に設定 ADCON0=0b00000001; // ADCオン while(GPIO4); // 加減速スイッチを「停止」にしないと先に進まない while(1){ // ここから無限ループ CHS0=1; // 最高速はGP1/AN1から読む DelayUs(20); // ADC安定するまで待つ GODONE=1; // ADC起動 while(GODONE); // ADC終了まで待つ MAX=ADRESH; // ADCの上位8ビットを最高速に代入 CHS0=0; // 加速度はGP0/AN0から読む DelayUs(20); // ADC安定するまで待つ GODONE=1; // ADC起動 while(GODONE); // ADC終了まで待つ ACC=ADRESH; // ADCの上位8ビットを加速度に代入 if(GPIO4 && GPIO5){ // 「注意」の時は最高速は半分 MAX/=2; } if(!GPIO4 && GPIO5){ // 「停止」の時は最高速は0 MAX=0; } // 「進行」の時はここまでスルーしてくる if(GPIO4 || GPIO5){ // ホールドスイッチOFFの場合 if(SPDMAX){ // 現在の速度が最高速よりも遅い場合 SPD--; // 現在の速度から1を引く } } // ↑ここまでのデータをPWMに使用 // ここより下、PWM駆動 発振周波数 約350Hz while(ACC){ // 加速度、ADCで得た回数ループ ACC--; // ループのために1つづつ減らす I=255; // この後のループ、必ず256回ループする while(I){ // PWM発生部分 I--; // ループのために1つづつ減らす if(I