HomeArticlesProjectsBlogContact
Articles
Lift Counter
Colin Mitchell
Colin Mitchell
August 07, 2009
Make sure to subscribe to our newsletter and be the first to know the news.

  • Instruction Set for PIC16F628
  • PIC16F628 PDF Data Sheet
  • BlankF628.asm
  • Chip Programmer - PICkit2 from Modtronix
    (MPASM and MPLAB come with PICkit2)
  • PIC16F628A.inc

No kits are available for this project, however all the
[components](mailto:colin@elechelp.com?Subject=Buying components for the 2 Digit Up/Down counter&Body=Please e-mail the cost of components for the 2 Digit Up/Down counter on prototype PC board by air mail to my country:****___**** and send details of how I can pay for it. My name is:____) are available from Talking Electronics.

See more projects using micros:Elektor,EPE,Silicon Chip

The files for Lift Counter

This project has been developed due to a request from Mr Moshweunyane (dmoshweunyane8@gmail.com). He asked for a circuit that would count up when someone entered a lift and count down when someone exited, using two infra-red sensors.
All we had to do was take the 2-digit up/down counter and add two optical sensors.

These sensors could be any type of detector and we have shown two LDR’s (Light Dependent Resistors) and two amplifying transistors mounted on a sub-board. You can use infrared or photo-transistors as the sensors to get equal results.
All the “detection” is done via the software and the program “polls” the detectors and works out if a person is entering or leaving the lift.
The reason for polling the sensors is clever. It prevents the micro being caught in a loop and allows the program to display numbers at the same time.
The same design can be used for a shop or any activity where you need to know if a room is getting too crowded.
This arrangement has been requested for bathrooms in an attempt to control and avoid unsavory behavior.
The circuit is designed around a PIC16F628A. It has been presented on an experimental PC board using surface-mount components and was built in less than 1 hour, with about 2 hours to write and finalise the program.
It uses “In Circuit Programming” via PICkit-2 or Talking Electronics Multi-Chip Programmer, plus the adapter (specific to each programmer) shown below.
You can add an alarm feature if the lift gets overcrowded or if someone is in the bathroom when the shop is closing.


The Lift Counter Circuit

This project has been created as an add-on for the 2-Digit Counter. We placed the two transistors, LDR’s and pots on a small PC board and connected it to the 2-Digit Counter via a plug and socket.

The light detectors have to be set up for the application. The best is to use infra-red detectors as they are not upset by ambient light.
Each detector has to be set up so that light falling on the detector makes the input line LOW.
When the beam is broken, the line goes HIGH.
We have directly coupled the output of the detector to the micro however you could use capacitor coupling and breaking the beam will produce a pulse.

The files for Lift Counter

;************************************************
; Lift Counter    Started 8/8/2009
;Count the number entering and leaving a lift
;Port B drives 7 segment display
;enter on RA2   exit on RA3
;Units drive on RA0   Tens drive on RA1     *
;*                      *
;************************************************

    list P = 16F628     ;microcontroller
    include ;registers for F628


    __Config    _cp_off & _lvp_off & _pwrte_on
        & _wdt_off & _intRC_osc_noclkout & _mclre_off

;code protection - off
;low-voltage programming - off
;power-up timer -  on
;watchdog timer - off
;use internal RC for 4MHz - all pins for in-out


;*********************************************
; variables - names and files
;*********************************************


        ;Files for F628 start at 20h


temp1       equ 20h ;for delay
temp2       equ 21h ;for delay
SwUp        equ 22h ;
SwDwn       equ 23h ;
units       equ 24h ;
tens        equ 25h ;
Sw_Flag     equ 26h ;
counter     equ 27h ;max count is 2Hz

;********************************************
;Equates
;*******************************************
status      equ 0x03
cmcon       equ 0x1F
rp1         equ 0x06
rp0         equ 0x05
portA       equ 0x05
portB       equ 0x06

;*******************************************
;Beginning of program
;*******************************************
reset   org 00  ;reset vector address
    goto    SetUp   ;goto SetUp


table   addwf   PCL,F           ;02h,1  add W to program counter
        retlw   b'00111111'     ; "0"   -|F|E|D|C|B|A
        retlw   b'00000110'     ; "1"   -|-|-|-|C|B|-
        retlw   b'01011011'     ; "2"   G|-|E|D|-|B|A
        retlw   b'01001111'     ; "3"   G|-|-|D|C|B|A
        retlw   b'01100110'     ; "4"   G|F|-|-|C|B|-
        retlw   b'01101101'     ; "5"   G|F|-|D|C|-|A
        retlw   b'01111101'     ; "6"   G|F|E|D|C|-|A
        retlw   b'00000111'     ; "7"   -|-|-|-|C|B|A
        retlw   b'01111111'     ; "8"   G|F|E|D|C|B|A
        retlw   b'01101111'     ; "9"   G|F|-|D|C|B|A


;****************************************************************
;* port A and B initialisation                  *
;****************************************************************

SetUp   bsf status,rp0
    movlw   b'00001100' ;Make RA0,1 out   RA2,3 in
    movwf   05h
    clrf    06h     ;Make all RB output
    bcf status,rp0  ;select programming area - bank0
    movlw   b'10000000' ;Turn off T0CKI, prescale for TMR0 = 1:
    movwf   option_reg
    clrf    portB       ;Clear Port B of junk
    clrf    units       ;zero the units file
    clrf    tens        ;zero the tens file
    clrf    Sw_Flag
    movlw   07h     ;turn comparators off and enable
    movwf   cmcon       ;    pins for I/O functions
    goto    Main


;************************************************
;* Delay 10mS       10 x 1,000uS
;******************************************

D_10mS  movlw   0Ah
    movwf   temp2
D_a nop
    decfsz temp1,1
    goto    D_a
    decfsz temp2,1
    goto    D_a
    retlw   00


Up  btfsc   Sw_Flag,2
    retlw   00
    bsf Sw_Flag,2
    incf    units,1
    movlw   0Ah   ;put 10 into w
    xorwf   units,0   ;compare units file with 10
    btfss   status,2  ;zero flag in status file. Will be set if units is 10
    retlw   00
    clrf    units
    incf    tens,1
    movlw   0Ah   ;put 10 into w
    xorwf   tens,0    ;compare units file with 10
    btfsc   status,2  ;zero flag in status file. Will be set if tens is 10
    clrf    tens
    retlw   00    ;display passes 99 but not below 0


Dwn btfsc   Sw_Flag,3
    retlw   00
    bsf Sw_Flag,3
    decf    units,1
    movlw   0FFh      ;put FFh into w
    xorwf   units,0   ;compare units file with FFh
    btfss   status,2  ;zero flag in status file. Will be set if units is 10
    retlw   00
    movlw   09
    movwf   units     ;put 9 into units file
    decf    tens,1
    movlw   0FFh      ;put 0FFh into w
    xorwf   tens,0    ;compare tens file with 0FFh
    btfsc   status,2  ;zero flag in status file. Will be set if tens is 0FFh
    goto    $+2   ;tens file is 0FFh
    retlw   00
    clrf    tens
    clrf    units
    retlw   00    ;display  not below 0


;****************************************************************
;* Main                             *
;****************************************************************

Main    movlw   040h        ;maximum count is 2Hz
    movwf   counter     ;

Main1   btfss   portA,2     ;test for enter (will go HIGH on enter)
    goto    $+3     ;entry not detected
    call    Up
    goto    Main2
    btfss   portA,3 ;test for exit (will go HIGH on exit)
    goto    $+3     ;exit not detected
    call    Dwn
    goto    Main2
    clrf    counter
    incf    counter     ;effectively bypass counter


        ;DISPLAY DIGITS

Main2   movlw   b'00000001' ;Make RA0 HIGH for units drive
    movwf   portA
    movf    units,0     ;copy unit value into w
    call    table       ;unit display value will return in w
    movwf   portB       ;output units value
    call    D_10mS      ;call delay
    clrf    portB       ;clear display
    movlw   b'00000010' ;Make RA1 HIGH for tens drive
    movwf   portA
    movf    tens,0      ;copy tens value into w
    call    table       ;tens display value will return in w
    movwf   portB       ;output tens value
    call    D_10mS      ;call delay
    clrf    portB       ;clear display
    btfsc   portA,2     ;bit 2 is zero when enter LDR illuminated
    bcf Sw_Flag,2
    btfsc   portA,3     ;bit 3 is zero when exit LDR illuminated
    bcf Sw_Flag,3
    decfsz  counter
    goto    Main2
    goto    Main

    END

Going Further

This program can be modified to suit your particular application.
You can add a relay, buzzer, set of LEDs, globes to the project to create a valuable piece of industrial equipment.


Tags

#elektor#PIC16F628
Colin Mitchell

Colin Mitchell

Expertise

electronics
writing
PIC-Chips

Social Media

instagramtwitterwebsite

Related Posts

TODO
PIC Elmer 160
March 06, 2012
© 2021, All Rights Reserved.

Quick Links

Advertise with usAbout UsContact Us

Social Media