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 |
Sign
in my guestbook | View
my guestbook ]
© 2001 - YO5OFH, Csaba Gajdos
|