| 
       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
      |