CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Low frequency counter

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
snooer



Joined: 22 Apr 2009
Posts: 14

View user's profile Send private message

Low frequency counter
PostPosted: Mon Apr 27, 2009 6:45 am     Reply with quote

Code:

#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
//#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT 
#use delay(clock=20000000)
#include <stdlib.h>
#include <lcd.c>
#include <ctype.h>
#include <1wire.c>           
#include <ds1820.c>

#define XTAL_FREQUENCY  8000000
#define TIMER1_FREQUENCY (XTAL_FREQUENCY / 4)

#bit t1_overflow=0x0C.0

// #bit t1_overflow=0xF9E.0  (PIC18, Reminder)

void main() {
   int cycles8, cycles;
   int32 freq;
   long freqc_high;
   long freqc_low;
 float temp;

   while (TRUE) {
      cycles8=0;
      cycles=0;
      freqc_high=0;
      t1_overflow=0;
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
      set_timer1(0);
/* ___ wait one second ___  */
      while (cycles!=0xFF) { //true=3, false=4
       cycles8=0; //1 cycle
       //start inner loop
       while (cycles8!=0xFF) { //true=3, false=4
         if (t1_overflow)//true=2,false=3             //----|
            {t1_overflow=0;freqc_high++;}//6 cycles   //    |
         else                                         //    |-- 8 cycles
            {delay_cycles(5);}                        //----|
         delay_cycles(63); //x
         cycles8++; //1
 ///2 cycles to jump to top
 //math: end inner loop
 //math: total inner loop=((3+8+x+1+2)*255 + 4)*255
 //math: if x=62.87781 then inner loops takes 5mil instructions
 //math: if x=62 then inner loop takes 4942920, have to fill 57080 cycles
  }
 delay_cycles(218);      //y
 cycles++;          ///1 cycle
 ///2 cylces to jump to top
 //math: outer=(3+1+y+1+2)*255+4=57080
 //math: y=(57080-4)/255)-(3+1+0+0+1+2)
 //math: if y=216.827450980392156862745098039216 then outer loop cylces is 57080
 //math: if y=216 then outer loop cycles is off by 211 cycles.  z=211
}
      delay_cycles(211);   //z
/* ___ end waiting 1 second ___ */
      setup_timer_1(T1_DISABLED);//turn of counter to prevent corruption while grabbing value
      temp = ds1820_read();
      if (t1_overflow)            //check one last time for overflow
      freqc_high++;
      freqc_low=get_timer1();      //get timer1 value as the least sign. 16bits of freq counter
      freq=make32(freqc_high,freqc_low);//use new make32 function to join lsb and msb
     
      lcd_init();
      printf(LCD_putc "Speed:%Lu Hz\r\nTemp: %3.1f%cC ",freq,temp,223);      //and print frequency
   
   }
}

The problem is that I need low frequency counter. I used a freqc.c example but it show 0. Then freq is 1 and 1-2 then freq is 2. Any solution to solve this problem?
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group