mikroC PRO project files for PIC12F683, should work also with most of PIC
picoDetector C source code
picoDetector .HEX files
picoDetector circuit schematic
picoDetector circuit schematic
picoDetector source code
/*
*******************************************************************************
* picoDetector : an ultra simple and cheap metal detector
*******************************************************************************
*
* Author : Bruno Gavand, april 2009
* see more details on http://www.micro-examples.com/
*
* source code for mikroC PRO compiler V1.65
* feel free to use this code at your own risks
*
* 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
unsignedcharctr;// number of loops between two watchdog resets
unsignedcharprevious;// previous value of ctr
unsignedcharcalibr;// calibration value when oscillator runs free
unsignedcharrestarts;// number of watchdog restarts
unsignedcharen;// enable flag, allows detection
/*
* main loop
*/
voidmain()
{
unsignedchari;
/*
* configure GPIO as digital port
*/
CMCON0=7;
ANSEL=0;
TRISIO=0;
GPIO=0;
/*
* power up ?
*/
if(STATUS.NOT_TO)
{
/*
* yes, init variables
*/
restarts=0;
calibr=1;
}
/*
* watchdog reset counter
*/
if(restarts<255)restarts++;
/*
* 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++;
}
}