Pulse Counter

Pulse counters are widely present in everyday life and it is hard to imagine that one day people will stop using them. Almost each museum counts visitors, theaters do it as well and in some urban areas bus line owners count passengers. In industry each production control includes counting. Usually market tests are performed by counting sold goods. In sports the quality of a game is shown by attendance. There are occasions when not only physical values are counted, for example phone pulses, time measurements etc.
A pulse counter could be roughly divided in three parts. The first part is a pulses source. The second unit is an electrical device which counts, memorizes states and prepares results. Finally, the third part is a converter of electrical states into states available to our senses. Often these are optical displays.
Let’s consider a simple pulse counter controlled by PIC.

Input pulses are TTL logic pulses (0V, +5V). The ratio impulse/pause is not important, but it is important that lasting of pause or impulse does not fall below 50us.
Series of pulses are brought to counter, memory and 7 segment converter integrated in PIC 16F84 (Microchip).
Rising edge of the pulse activates interrupt during which an internal counter ‘one’ is increased by one. Simultaneously, it is checked whether the value in the register ‘one’ has not reached 10. If so, then the register ‘one’ is reset (brought to zero) and register ‘ten’ increased by one. If the value in the register ‘ten’ reaches 10 it is reset as well and counting starts from the beginning (procedure next).
During the main program values of ones and tens are showed on a seven segment display with common cathode. These two numbers are multiplexed in such a way that PORTB is used for giving a number to the display and PORTA is used for deciding which display is lit.
Seven segment displays are connected in parallel except of their common cathodes. The tens cathode (gnd1) is connected via transistor to pin no. 18 and the cathode gnd2 to pin no. 17. In short intervals PIC turns on one display and turns of the other one. By doing this we get the impression that both displays are lit simultaneously. Decreasing the multiplexing rate it is possible to notice dimming of the displays and later on their blinking.
PIC’s clock is controlled by quartz and it’s very high (1MHz). For the same purpose we could use RC oscillator, but we should think of not decreasing the clock too much.
The transistors are necessary, because each PIC’s output can give up to 25 mA according to Microchip. if we know that a LED could take up to 50mA and considering the worst case when all seven segments are lit, we will see that the maximum current could be 350mA. This current could destroy PIC’s output. Therefore we use transistors which drive little current from PIC, but allow larger current through the display, for example BC182 or 2N2222.
To reset the counter it is enough to connect pin no.4 to ground. In this way the program starts from the address 0 (org 0). This enables us to reset the counter even if we used four LED displays when there are no free pins.
To stop the counter simply ‘cut’ the way pulses use to come to the PIC. Using a separate pin to stop counting is a waste of time and resources.
Beside the numbers 0-9 it is possible to show some letters: A, C, E, F, H, J, L, N, P and U.

 Listing 1 PROCESSOR 16F84 INCLUDE "P16F84.INC" acc equ 0 same equ 1 one equ 0x0Ch ten equ 0x0Dh  w_keep equ 0x0Eh org 0 goto init org 4 goto rutina init: bsf status,rp0 movlw 10000000b tris portb ; set portb(6:0) as outputs ;and portb(7) as input (interrupt) clrf porta ; porta as output bcf status,rp0 bcf option_reg,7 movlw 0 movwf one movlw 0 movwf ten ; start counting from 00 clrf portb clrf porta bcf intcon,rbif bsf intcon,gie bsf intcon,rbie mplx: bsf porta,0 ; enable ones display movf one,acc  call table movwf portb ; show number bcf porta,0 bsf porta,1 ; enable tens display movf ten,acc  call table movwf portb ; show number bcf porta,1 goto mplx ;------------------ next: clrf one incf ten,same movlw 246 addwf ten,acc btfsc status,c clrf ten return ;------------------ table: addwf pcl,same ;format= gfedcba retlw 00111111b ;0 retlw 00000110b ;1 retlw 01011011b ;2 retlw 01001111b ;3 retlw 01100110b ;4 retlw 01101101b ;5 retlw 01111101b ;6 retlw 00000111b ;7 retlw 01111111b ;8 retlw 01101111b ;9 ;------------------ rutina: bcf intcon,rbie movwf w_keep btfss portb,7 ; rising edge only goto exit incf one,same bcf status,c movlw 246 ; one >= 10? addwf one,acc btfsc status,c call next ; if yes exit: bcf intcon,rbif bsf intcon,gie bsf intcon,rbie movf w_keep,acc return ;------------------ end

[ About me | Acronyms  | CW | Data Sheets | Docs | Download | E-mail | HOME | Ham projects | Hobby circuits | Photo galery | PIC | QTH photos |