Autor: Zoran Ristić .

 

 

Brojač impulsa upravljan PIC-om

Brojači impulsa su sveopšte prisutni u svakodnevnom životu i teško je u ovom trenutku zamisliti da će jednoga dana prestati njihova upotreba. Skoro svi muzeji vrše brojanje posetilaca, nije redak slučaj da to rade i pozorišta, a u nekim gradskim sredinama autobuski prevoznici broje svoje putnike elektronskim putem. U industriji svaka kontrola proizvodnje sadrži aspekt brojanja artikala, a time se često vrši i kontrola potrošnje robe. Na stadionima pokazatelj kvaliteta utakmice je broj posetilaca. Postoje slučajevi kada se ne broje fizički opipljive veličine, kao što je na primer brojanje impulsa u telefonskim centralama, merenje vremena i slično.

Brojač impulsa se grubo može svesti na tri bloka. Prvi blok je davač impulsa. Druga celina je sam elektronski sklop koji vrši brojanje, pamti stanje i priprema rezultat za prikazivanje. Konačno, treći deo predstavlja konvertor električne veličine u stanje koje je dostupno našim čulima. Najčešće su to optički pokazivači.

Razmotrićemo jednu varijantu brojača impulsa, čija jednostavnost zadivljuje.

Ulaz brojača su naponski pravougaoni impulsi čija donja ivica ne pada ispod 0V, a gornja ne prelazi 5V (TTL). Odnos trajanje/pauza ovih impulsa nije bitan, ali zbog tačnosti brojanja bitno je da pauza ili visoko stanje ne traju kraće od 50us.

Povorka impulsa se dovodi u brojač, memoriju i konvertor u sedamsegmenti kod. Sve ove funkcije objedinjene su u PIC-u 16F84 (Microchip).

Rastuća ivica impulsa aktivira prekid (interrupt) u mikrokontroleru. Tokom prekidne rutine interni registar jedinica 'one' se poveća za jedan i ispituje se da li je vrednost u registru jedinica dostigla vrednost 10. Ako jeste, u registar 'one' upisuje se nula, a sadržaj registra desetica 'ten' poveća se za 1. Kada vrednost broja u registru desetica dostigne 10, u registar 'ten' upisuje se nula nakon čega brojanje kreće od početka (procedura 'next').

Tokom izvršavanja glavnog programa vrednosti jedinica i desetica naizmenično se prikazuju na sedmosegmentnom displeju sa zajedničkom katodom. Ovaj proces naizmeničnog korišćenja jednog porta kontrolera se naziva multipleksiranje. U našem slučaju PORTB služi za prikaz cifre, a PORTA aktivira pokazivače.

Sedmosegmentni LED pokazivači su vezani paralelno jedan za drugi osim zajedničkih katoda. Katoda pokazivača desetica (gnd1) je preko tranzistora vezana za nožicu br. 18, a katoda gnd2 preko drugog tranzistora za nožicu br. 17. U kratkim vremenskim intervalima PIC naizmenično gasi jedan pokazivač i uključuje drugi. Kada se ovo brzo radi stiče se utisak da oba pokazivača rade istovremeno. Smanjivanje brzine multipleksiranja prvo izaziva utisak da pokazivači slabije svetle, a zatim se vidi treperenje pokazivača.

Takt mikrokontrolera se kontroliše kristalom i veoma je visok (1MHz). Za istu namenu može se koristiti i RC oscilator, ali treba obratiti pažnju da se takt isuviše ne uspori.

Tranzistori su neophodni, jer svaki izlaz PIC-a po specifikaciji proizvođača može maksimalno da primi 25mA. Kako LED dioda može da povuče do 50 mA i s obzirom da u najgorem slučaju svetle sve diode (cifra 8), sledi da kroz zajedničku katodu može da protiče struja jačine do 350mA. Ova struja bi dovela do uništavanja izlaza PIC-a. Stoga se koriste tranzistori koji vuku malu struju sa izlaza PIC-a, a dozvoljavaju veliku struju kroz katodu pokazivača, npr. BC182 ili 2N2222.

Resetovanje brojača se vrši spajanjem pina br.4 na masu čime se resetuje PIC, t.j. počinje izvršavanje programa od nulte instrukcije (org 0). Ovaj način resetovanja je moguć u slučaju da se koriste četiri LED pokazivača kada nema slobodnih nožica.

Zaustavljanje brojača se vrši jednostavnim prekidanjem veze između davača impulsa i nožice br.13. Koristiti poseban ulaz PIC-a za zaustavljanje brojača je zaista bespotrebno trošenje resursa i komplikovanje programa.

Osim brojeva sedmosegmentni pokazivači mogu pokazivati i neka slova: A, C, E, F, H, J, L, N, P, i U. Genijalnost domaćih (?) inžinjera me je oduševila kada sam u jednom butiku u gradu video da na pokazivaču piše EPOP!

Listing 1
PROCESSOR 16F84
INCLUDE "P16F84.INC"

acc equ 0
same equ 1
one equ 0x0C
ten equ 0x0D 
w_keep equ 0x0E


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:
bcf porta,0 ; turn displays off
bcf porta,1
movf one,acc
call table
movwf portb ; show number
bsf porta,0 ; enable ones display

movf ten,acc
call table
movwf portb ; show number
bcf porta,0
bsf porta,1 ; enable tens display
goto mplx

;------------------
next:
clrf one
incf ten,same
bcf status,c
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

Sugestije za deo koda označen crvenom bojom: Mikan


Pročitajte više o ovoj temi
Povezivanje LCD-a
Step motor i PIC 
PIP02 
Portovi
Primopredajnik sa proširenim spektrom upravljan PIC-om

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji