HOME Technical Tips  


Counter based on PIC16F628A . Included C code and circuit diagram. Input is a TTL type. The counting repeats every about 5 sec. The 32K crystal is for generating accurate time base for counting the input frequency. The MCU uses the 4 MHz internal oscillator.
PIC16F628A TMR0 input can count frequency up to 50 MHz if the signal is 50% duty cycle. If the duty cycle is 10% then the max frequency is 10 MHz. TMR0 can count up to 2 MHz , the prescaler is used to increase the input frequency range to 64 MHz. Frequencies up to 1 MHz are counted with resolution of 1 Hz, frequencies above 1MHz are counted at resolution of 32 Hz.
I tested the counter up to 2 MHz only, I don't have the means to do better tests.
The 7 segment LED is common cathode, cc8 is the common cathode of the digit on the left. 100 ohm resistor for the segments is for a current of 20mA, the max output current of the pic is 25mA, so if you change the resistors make sure you don't exceed this current.
To drive 8 digits from 5 outputs I used a system of 2 out of 5 that gives up to 10 outputs by AND gating to outputs. I used one output to drive the base of the transistor and the other a diode. the emitter of the transistors are elevated by 0.7V by a diode, this to make sure they are switched off when the diode at the base is low. It is possible to reduce the number of digits by deleting them and by deleting the lines in the code that drives the digits.

Software includes PIC code. You are free to use the circuit diagram and the software with no limitations.

Circuit Description
See also Technical Tips

All transistors are BC337 or equivalent.
Total 5V supply current can reach145mA.
The 8 digits display is common cathode, for red LEDs the 7 resistors of 100 ohms enable current of 20 mA total, average of 2.5 mA through each segment which is on for eighth of the time. To increase the brightness the resistors can be decreased to max current of 25 mA. The seven segments, a to g, of one digit are linked to the corresponding seven segments in the other digits. cc8 is the common cathode of the digit on the left.
The 8 digits are multiplexed by 5 pic's outputs, for each group of 2 out of 5 a digit is switched on. The diode to ground from the emitters is to insure full switch off when the gating diode at the base is low.


Comments and questions

Copy the number from the picture It stops net-robots from adding comments.

14.07.2019 - 20:27
Name: Moty
Comment: Hi Brian, The LEDs i used are old: Toshiba TS358. Choose common cathode that you can buy and I will tell you if they are ok.

14.07.2019 - 03:47
Name: Brian Scott
Comment: What make/model 7-segment LED are you using?

27.02.2019 - 21:10
Name: cc
Comment: All transistors are BC337 ... equivalent

27.02.2019 - 21:09
Comment: hello

26.02.2017 - 09:54
Name: Bryan Watson
Comment: Like the circuit , I would like to built a 4 digit one ( only using last 4 digits of a 144 .??? transceiver but using a very small readout I have several HDSP2002 DOT MATRIX UNITS but cant find out how to drive them from a normal LED 7 segment as these are a 4 digit unit that connect differently to normal LEDS .Bryan VK7KWB bjwatson3@optusnet.com.au

21.02.2017 - 00:09
Name: Moty
Comment: The LEDs are off during counting because the CPU is quite busy with the count. If we had A32 bits timer/counter it could have done the counting without the CPU.

20.02.2017 - 18:28
Name: Александр
Comment: the led should be off during the measurement?

24.12.2016 - 17:21
Name: Moty
Comment: Hi Bryan, The code converts Long Integer to 8 decimal digits, you can display only the 4 digits that you want. Driving the display will be an interesting task.

24.12.2016 - 04:49
Name: Bryan Watson VK7KWB
Comment: Dear Sir i wish to make a counter using last 4 digits only to count frequency 144 -145 mhz using a by 100 divider to only indicate last for digits example : 144.200 = 4200, using small LED DOT MATRIX readout HCMS2002 from HP . TO fit a small space on my ICOM IC202. BUT MAY need to findout how to program 10.7 off set.

18.04.2016 - 20:41
Name: Carol
Comment: cod hex vrong!!

28.09.2015 - 00:31
Name: Fabio Alexandre
Comment: Hi, First thank you for the great project. Is possible they counting over a period of 0.5 second and not 2 seconds? I want to detect variations in frequency but 2 seconds is too long time for my purpose. I have intended to use 70 - 140 Khz signal. Best Regard.

29.12.2014 - 14:19
Name: Brian Clark
Comment: Hi You have a nice page keep up the good work I will look back at a later time thank you.

20.07.2014 - 02:15
Name: Moty
Comment: Hi Vinay, Try programming the PIC with the led_counter_c.hex.

19.07.2014 - 14:18
Name: vinay
Comment: This circuit is not working, need to change any hardware?

14.06.2014 - 16:36
Name: Moty
Comment: Hi Jack. The circuit is back now. Try programming the PIC with the led_counter_c.hex. The other hex file is compiled from the ASM code and it is not a clever code. If you get clear 0 to 9 seven segments figures then it is likely that you wired it ok.

14.06.2014 - 07:39
Name: Jack Schmidling
Comment: The circuit is not displayed on this page so I may have it wired wrong but it sort of works in a general sense. The display works and blinks every 3 seconds but when a signal is applied, the number displayed has little to do with the freq and is not repeatable. Any ideas? Jack

iconFlag Countermoty22.co.uk  2008-2022