Documente Academic
Documente Profesional
Documente Cultură
1 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
New Projects
Updated
Facebook Like
Thch 6 ngi thch iu ny. ng k xem nhng g bn
b ca bn thch.
Simple frequency counter using PIC16F877A with source code. MPLAB v7 IDE
and HITEC PICC compiler ware used to coding.
11/15/2014 2:44 PM
2 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
11/15/2014 2:44 PM
3 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// File name : Simple_frequency_counter_PIC16f877A.c
// Copyright http://sites.google.com/site/ehobbyprojects, All Rights Reserved.
// Some pages may also contain other copyrights by the author.
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Distribution: You can freely use this code in your own applications, but you may
not reproduce
//
source
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Project : Simple frequency counter using PIC16F877A, crystal frequency 4Mhz
// compiler : HITEC PICC
///////////////////////////////////////////////////////////////////////////////////////////////////////////
ovrflw ;
unsigned long x ;
unsigned int
y;
///////////////////////////////////////////////////////////////////
unsigned char digit0, digit1, digit2, digit3;
const char ssd[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//SSD
mask for common cathode type
///////////////////////////////////////////////////////////////////
void decode(unsigned int value){
digit3=value/1000;
digit2=(value%1000)/100;
11/15/2014 2:44 PM
4 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
digit1=(value%100)/10;
digit0=(value%10);
}
///////////////////////////////////////////////////////////////////
void display(){
unsigned char i;
for(i=0;i<5;i++){
PORTD=0b00000001;
PORTC=ssd[digit0];
DelayUs(150);
PORTD=0b00000010;
PORTC=ssd[digit1];
DelayUs(150);
PORTD=0b00000100;
PORTC=ssd[digit2];
DelayUs(150);
PORTD=0b00001000;
PORTC=ssd[digit3];
DelayUs(150);
}
}
///////////////////////////////////////////////////////////////////
main(){
TRISD=0b11110000;
TRISC=0; //
TRISB = 3 ;
//input
///////////////////////
OPTION = 0b11011000 ;
INTCON = 0b10110000 ;
//no prescaler
//T0IF, INTF and GIE enabled
while(1){
if (RB1 == 1) y=(x/1000);
else y=x;
decode(y);
display();
}
}
///////////////////////////////////////////////////////////////////
11/15/2014 2:44 PM
5 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
}
else if(T0IF==1){
ovrflw++ ;
T0IF = 0 ;
}
if (ovrflw > 3906) {
GIE = 0;
x=cntr;
cntr = 0 ;
// clear counters
ovrflw = 0 ;
INTCON = 0b10110000 ; // T0IF, INTF and GIE enabled
}
}
To compile the above code you must add "Delay.h" and "Delay.c" files to project.
the codes are below.
//////////////////////////////////////////////////Delay.h header
file////////////////////////////////////////////////////////
/*
high level delay routines - see delay.h for more info.
Designed by Shane Tolmie of www.microchipC.com corporation. Freely
distributable.
Questions and comments to webmaster@microchipC.com.
PICuWEB - Program PIC micros with C. Site has FAQ and sample source code.
www.microchipC.com.
For Microchip 12C67x, 16C7x, 16F87x and Hi-Tech C
*/
#ifndef __DELAY_C
#define __DELAY_C
11/15/2014 2:44 PM
6 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
#include <pic.h>
unsigned char delayus_variable;
#include
"delay.h"
i;
i = (unsigned char)(cnt>>8);
while(i>=1)
{
i--;
DelayUs(253);
CLRWDT();
}
DelayUs((unsigned char)(cnt & 0xFF));
}
void DelayMs(unsigned char cnt)
{
unsigned char
i;
do {
i = 4;
do {
DelayUs(250);
CLRWDT();
} while(--i);
} while(--cnt);
}
//this copy is for the interrupt function
void DelayMs_interrupt(unsigned char cnt)
{
unsigned char
i;
do {
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
}
void DelayBigMs(unsigned int cnt)
{
11/15/2014 2:44 PM
7 of 12
unsigned char
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
i;
do {
i = 4;
do {
DelayUs(250);
CLRWDT();
} while(--i);
} while(--cnt);
}
void DelayS(unsigned char cnt)
{
unsigned char i;
do {
i = 4;
do {
DelayMs(250);
CLRWDT();
} while(--i);
} while(--cnt);
}
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////Delay.c
file////////////////////////////////////////////////////////
#define PIC_CLK 4000000 //4Mhz
/*lowlevel delay routines
Designed by Shane Tolmie for www.microchipC.com. Freely distributable.
Questions and comments to webmaster@microchipC.com.
For Microchip 12C67x, 16C7x, 16F87x and Hi-Tech C
Example C:
#define PIC_CLK 4000000
#include "delay.h"
unsigned int timeout_int, timeout_char;
DelayUs(40); //do NOT do DelayUs(N) of N<5 @ 4Mhz or else it executes
DelayUs(255) !!!!
11/15/2014 2:44 PM
8 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
DelayUs(255); //max
dly250n;
dly1u;
//delay 250ns
//delay 1us
timeout_char=timeout_char_us(1147);
while(timeout_char-- && (RA1==0)); //wait up to 1147us for port RA1 to go high
// - this is the max timeout
timeout_int=timeout_int_us(491512);
while(timeout_int-- && (RA1==0)); //wait up to 491512us for port RA1 to go high
// - this is the max timeout
*/
#ifndef __DELAY_H
#define __DELAY_H
extern unsigned char delayus_variable;
#if (PIC_CLK == 4000000)
#define dly125n please remove; for 32Mhz+ only
#define dly250n please remove; for 16Mhz+ only
#define dly500n please remove; for 8Mhz+ only
#define dly1u asm("nop")
#define dly2u dly1u;dly1u
#elif (PIC_CLK == 8000000)
#define dly125n please remove; for 32Mhz+ only
#define dly250n please remove; for 16Mhz+ only
#define dly500n asm("nop")
#define dly1u dly500n;dly500n
#define dly2u dly1u;dly1u
#elif ( (PIC_CLK == 16000000) || (PIC_CLK == 16257000) )
#define dly125n please remove; for 32Mhz+ only
#define dly250n asm("nop")
#define dly500n dly250n;dly250n
#define dly1u dly500n;dly500n
#define dly2u dly1u;dly1u
#elif (PIC_CLK == 20000000)
#define dly200n asm("nop")
#define dly400n dly250n;dly250n
#define dly2u dly400n;dly400n;dly400n;dly400n;dly400n
#elif (PIC_CLK == 32000000)
#define dly125n asm("nop")
#define dly250n dly125n;dly125n
#define dly500n dly250n;dly250n
11/15/2014 2:44 PM
9 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
11/15/2014 2:44 PM
10 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
PORT=0;
}
Time taken:
optimisations on:
optimisations off:
optimisations on:
(PIC_CLK/4.0)
To use:
loop, optimizations on
#define timeout_char_us(x)
(unsigned char)((x/LOOP_CYCLES_CHAR)*
(PIC_CLK/4.0))
unsigned char timeout;
timeout=timeout_char_us(1147);
//wait
16
loop, optimizations on
#define timeout_int_us(x)
(unsigned int)((x+/LOOP_CYCLES_INT)*
(PIC_CLK/4.0))
unsigned int timeout;
timeout=timeout_int_us(491512);
//wait
8Mhz
*/
#define LOOP_CYCLES_CHAR
11/15/2014 2:44 PM
11 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
optimizations on
#define timeout_char_us(x)
(long)(((x)/LOOP_CYCLES_CHAR)*(PIC_CLK
/1000000/4))
#define LOOP_CYCLES_INT
16
optimizations on
#define timeout_int_us(x)
(long)(((x)/LOOP_CYCLES_INT)*(PIC_CLK
/1000000/4))
//if lo byte is zero, faster initialization by 1 instrucion
#define timeout_int_lobyte_zero_us(x)
(long)(((x)/LOOP_CYCLES_INT)*
(PIC_CLK/4.0)&0xFF00)
//function prototypes
void DelayBigUs(unsigned int cnt);
void DelayMs(unsigned char cnt);
void DelayMs_interrupt(unsigned char cnt);
void DelayBigMs(unsigned int cnt);
void DelayS(unsigned char cnt);
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Download complete project files >> Simple_frequency_counter_PIC16f877A.c ,
Delay.h , Delay.c
PIC, dsPIC Microcontroller programmer
Microcontroller programmer
MSP430
Comments
11/15/2014 2:44 PM
12 of 12
https://sites.google.com/site/ehobbyprojects/make-a-simple-frequency-c...
Online
Sign in | Recent Site Activity | Report Abuse | Print Page | Powered By Google Sites
11/15/2014 2:44 PM