/* ******************************************************************************* * picoDetector : an ultra simple and cheap metal detector ******************************************************************************* * * target : PIC12, oscillator in HS mode, watchdog enabled * * PIC PIN Assignemnt : * * GP0 : detect LED indicator * GP1 : calibrate LED indicator * GP2 : NC * GP3 : NC * GP4, GP5 : inductor * ******************************************************************************* */
#define MAXTRY 15 // number of watchdog restart to calibrate loop counter
unsigned char ctr ; // number of loops between two watchdog resets unsigned char previous ; // previous value of ctr unsigned char calibr ; // calibration value when oscillator runs free unsigned char restarts ; // number of watchdog restarts unsigned char en ; // enable flag, allows detection
/* * main loop */ void main() { unsigned char i ;
/* * configure GPIO as digital port */ CMCON0 = 7 ; ANSEL = 0 ; TRISIO = 0 ; GPIO = 0 ;
/* * if counter differs too much from calibration value */ if((previous ^ ctr) > calibr) { /* * turn detect LED on */ GPIO.F0 = en ;
/* * if not on power up */ if(STATUS.NOT_TO == 0) { /* * while in calibration mode */ if(restarts < MAXTRY) { /* * shift calibration value * and wait a little bit */ calibr <<= 1 ; Delay_ms(5) ; } } else { /* * turn detect LED off */ GPIO.F0 = 0 ; } }
/* * save last counter */ previous = ctr ;
/* * is calibration over ? */ if(restarts > MAXTRY) { /* * yes, turn calibrate LED off * and set enable flag */ GPIO.F1 = 0 ; en = 1 ; } else { /* * no, turn calibrate LED on * and clear enable flag */ GPIO.F1 = 1 ; en = 0 ; }
/* * set watchdog prescaler */ OPTION_REG = 0b11111001 ;
/* * start counter, to be interrupted by watchdog */ ctr = 0 ; for( ;; ) { ctr++ ; } }