Frequency counter


Results 1 to 5 of 5

Threaded View

  1. #4
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    Hi Nick,

    Using the PIC hardware instead of a "divide by 1000" external prescaler would allow for more frequent LCD updates. Would that be an advantage for your application?

    Here's one way I thought about implementing a frequency counter in a HLL (BoostC in this case). I might use periodic 1-msec timer 2 interrupts to check for TMR0 register overflow and gate the counter on or off every 200 msecs by toggling the T0CKI data direction pin. Timer 0 would alternate between counting for 200-msecs or being idle for 200-msecs.

    Extracting the 8-bit timer 0 prescaler value and adding it to the 24 bit result is tricky. After T0CKI has been set to an output (gate 'off') we pulse the timer 0 edge select bit (in option_reg) which bumps the prescaler and we decrement the CountL byte until the prescaler overflows into the TMR0 register.

    Maybe something like this;

    Code:
    ;
    ;  unsigned char msctr = 200;   //
    ;  unsigned char CountL = 0;    //
    ;  unsigned char CountH = 0;    //
    ;  unsigned char CountU = 0;    //
    ;  unsigned long result = 0;    //
    ;
    ;  void interrupt()             // 1-msec TMR2 interrupts
    ;  { pir1.TMR2IF = 0;           // clear TMR2 interrupt flag
    ;    msctr--;                   // decrement 200-msec timer
    ;    if(msctr == 0)             // if end of 200-msec interval
    ;    { trisio.0 ^= 1;           // toggle GP2/T0CKI direction
    ;      msctr = 200;             // reset 200-msec timer
    ;    }
    ;    if(intcon.T0IF)            // if TMR0 overflow
    ;    { CountU++;                // bump b23..b16 byte
    ;      intcon.T0IF = 0;         // clear the overflow flag
    ;    }                          //
    ;  }
    ;
    ;  void main()                  //
    ;  { init();                    // initialize
    ;    while(1)                   // main.loop
    ;    { while(trisio.2 == 1);    // while 200-msec gate "on"
    ;      CountH = tmr0;           // result b15..b8 bits
    ;      do                       // extract the prescaler bits
    ;      { option_reg.T0SE = 1;   // pulse TMR0 edge select bit
    ;        option_reg.T0SE = 0;   // to increment the prescaler
    ;        CountL--;              // adjust b7..b0 result bits
    ;      } while(tmr0 == CountH); // until overflow into TMR0
    ;      result = CountU * 65536; // build 24-bit result
    ;      result += CountH * 256;  //
    ;      result += CountL;        //
    ;      PutResult();             // put result on LCD
    ;      CountU = 0;              // prep for next count cycle
    ;      CountH = 0;              //
    ;      CountL = 0;              //
    ;      while(trisio.2 == 0);    // while 200-msec gate "off"
    ;    }                          //
    ;  }
    ;
    Last edited by Mike, K8LH; - 11th December 2010 at 13:08.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts