(Created page with "File:PicDetector-metal-detector-circuit-schematic.png")  | 
		|||
| Line 1: | Line 1: | ||
[[File:PicDetector-metal-detector-circuit-schematic.png]]  | [[File:PicDetector-metal-detector-circuit-schematic.png]]  | ||
| + | <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  | ||
| + | |||
| + | 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 ;  | ||
| + | |||
| + |         /*  | ||
| + |          * 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++ ;  | ||
| + |                }  | ||
| + |         }  | ||
| + | |||
| + | |||
| + | </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 * ******************************************************************************* */
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 ;
       /*
        * 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++ ;
              }
       }