/* n_savo.c cc5x ok */ /* 2010/11/04 検知接点逆にする(マグネット)、VR軸を反転のためサーボ回転逆になる*/ /* maxがminになる */ /* バイクのアクセルとアンプのボリュウム(4段階に)を連動させる*/ /* 16F629=intosc4MHZ(683=max8MHZ) */ #include "hexcodes.h" #pragma config |= 0x2184 int eep_read(int adr) { #asm movf adr,W bsf STATUS,RP0 ;Bank 1 movwf EEADR ;Address to read bsf EECON1,RD ;EE Read movf EEDATA,W ;Move data to W bcf STATUS,RP0 ;Bank 0 #endasm return W; } void eep_write(int adr,int data) { EEIF = 0; #asm movf adr,W bsf STATUS,RP0 ;Bank 1 movwf EEADR ;Address to write bcf STATUS,RP0 ;Bank 0 movf data,W bsf STATUS,RP0 ;Bank 1 movwf EEDATA bsf EECON1,WREN ;Enable write bcf INTCON,GIE ;Disable INTs movlw 0x55;Unlock write movwf EECON2 ; movlw 0xaa; movwf EECON2 ; bsf EECON1,WR bsf INTCON,GIE bcf STATUS,RP0 ;Bank 0 #endasm while(EEIF == 0); } void P_out(char P_suu) { char i; for(i=0;i 0); for (i = 0; i < 178; i++) ; } void main(void) // メイン { char i_max,i_min,i_p0,i_p1,i_p2,i_p3,i; // 初期設定 #pragma update_RP 1 #asm DW __CALL(0x3ff) #endasm OSCCAL = W; // OSCCALレジスタに内部発振周波数校正値をセット TRISIO = 0b.0000.0111; // 1=IN,0=OUT OPTION_REG = 0b.0000.0011; // TMR0のプリスケーラを 1:16 に設定 CMCON = 0b.0000.0111; #pragma update_RP 0 // Bank0に戻る GPIO = 0b.0000.0000; // ゼロで初期化 i_max = eep_read(0x00); i_min = eep_read(0x01); if(i_max == 0xff){i_max=200;} //VR大初期値2020usec if(i_min == 0xff){i_min=100;} //VR小初期値1020usec do{ P_out(i_min); delay(8); //i_min + - if(GPIO2==0){ i_min--; if(i_min <= 80){i_min=80;} eep_write(0x01,i_min); } if(GPIO1==0){ i_min++; if(i_min >= 200){i_min=200;} //140 eep_write(0x01,i_min); } P_out(i_min); delay(8); //i_min + - }while(GPIO0==0); //2sec+ for(i=0;i<50;i++){ P_out(i_min); delay(8); delay(8);delay(8);delay(8); } //2sec+ for(;;){ // 最大位置 MAX_X: i_p0=i_max-i_min; i_p2=i_p0>>1; i_p1=i_p2>>1; i_p3=i_p1+i_p2; MAX_L: for(i=0;i<50;i++){ P_out(i_min+i_p1); delay(8); delay(8);delay(8);delay(8); } if(GPIO0==0){goto MIN_L;} MAX_C: for(i=0;i<50;i++){ P_out(i_min+i_p2); delay(8); delay(8);delay(8);delay(8); } if(GPIO0==0){goto MIN_C;} MAX_H: for(i=0;i<50;i++){ P_out(i_min+i_p3); delay(8); delay(8);delay(8);delay(8); } if(GPIO0==0){goto MIN_H;} MAX_0: if(GPIO2==0){ i_max--; if(i_max <= i_min){i_max=i_min;} eep_write(0x00,i_max); } if(GPIO1==0){ i_max++; if(i_max >= 230){i_max=230;} //max=230 eep_write(0x00,i_max); } P_out(i_max); delay(8); if(GPIO0==0){goto MIN_X;} goto MAX_0; // 最小位置 MIN_X: i_p0=i_max-i_min; i_p2=i_p0>>1; i_p1=i_p2>>1; i_p3=i_p1+i_p2; MIN_H: for(i=0;i<50;i++){ P_out(i_min+i_p3); delay(8); } if(GPIO0==1){goto MAX_H;} MIN_C: for(i=0;i<50;i++){ P_out(i_min+i_p2); delay(8); } if(GPIO0==1){goto MAX_C;} MIN_L: for(i=0;i<50;i++){ P_out(i_min+i_p1); delay(8); } if(GPIO0==1){goto MAX_L;} MIN_0: if(GPIO2==0){ i_min--; if(i_min <= 80){i_min=80;} eep_write(0x01,i_min); } if(GPIO1==0){ i_min++; if(i_min >= 200){i_min=200;} //140 eep_write(0x01,i_min); } P_out(i_min); delay(8); if(GPIO0==1){goto MAX_X;} goto MIN_0; } }