Advertise Box

NEW:: picoDetector : How to detect metal with a PIC

 


* 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 resetsunsigned char   previous ;      // previous value of ctrunsigned char   calibr ;        // calibration value when oscillator runs freeunsigned char   restarts ;      // number of watchdog restartsunsigned 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++ ;               }        }
Related Posts Plugin for WordPress, Blogger...

Followers