snooer
Joined: 22 Apr 2009 Posts: 14
|
Low frequency counter |
Posted: Mon Apr 27, 2009 6:45 am |
|
|
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? |
|