| The design for the 
		project comes from a University research scientist. His requirement was 
		to count the movement of a bee in a tube.
 
 Two sets of Infrared photo-detectors were set up so movement from one 
		end of the tube could be counted when the bee returns to the opposite 
		end of the tube. It's a simple flip-flop or toggle requirement.
 
		 Bee Counter on 
		experimenter board
 
		
		 Bee 
		Counter
 
 
  IR 
		Receiver and IR LED (Transmitter)
 
 
							
								| INSTRUCTIONS FOR USE Set-up the two IR detectors and two IR 
								LEDs (transmitters) so the circuit produces a 
								low-pitched beep when the left detector is 
								interrupted and a high-pitched beep when the 
								right detector is interrupted.
 |    
		
		 
 
		The CIRCUITThe circuit is very simple. It is 
		just 2 IR LEDs, two IR receivers a switch to listen to the count 
		(low-tone beeps represent 10's and high-pitched beeps represent 1's) and a piezo diaphragm. All the work is done by the micro.
		It is powered by 4 AAA cells.
 
 CONSTRUCTION
 You can build the circuit on matrix board.
 The kit of components comes with all the parts you need to get the 
		project working, including a pre-programmed chip and the matrix 
		board.
 To modify the program you will need a PICkit-2 programmer and this comes 
		with 2 CD's containing all the software needed for In-Circuit 
		Programming.
 You will also need a lead (comes with PICkit-2) to connect the programmer to your lap top via 
		the USB port and an adapter we call 6pin to 5 pin 
		Adapter to connect 
		the PICkit-2 to your project.
 
		PROGRAMMING THE 
		CHIP
		The kit comes with a pre-programmed PIC chip but if you want to program 
		your own chip or modify the program, the .hex file is available as well 
		as the assembly file, so you can see how the program has been written 
		and view the comments for each line of code.
 The PIC12F629 is one of the smallest micros in the range but you will be 
		surprised how much can be achieved with such a tiny micro.
 The program contains sub-routines to produce delays, sequences on the 
		display and both read and write EEPROM; jobs that require accurate code 
		- including a special sequence - called a handshaking sequence that 
		prevents the EEPROM being written due to glitches.
 Even a program as simple as this is not easy to put together and to 
		assist in this area, we have provided a whole raft of support material.
 Not only do we provide a number of programs with full documentation but 
		our approach to programming is simple.
 It involves a method of "copy and paste" whereby sub-routines 
		are taken from previously written code and copied into your program. Any modifications are 
		made in very small steps so that each can be tested before adding more 
		code.
 This is exactly how we produce a complex project. Each step is written 
		and tested before adding the next step.
 This saves a lot of frustration as it is very easy to add a line 
		of code that is incorrect and get an unsuspected result.
 If you follow our suggestions you will buy a programmer ("burner") 
		called a PICkit-2 if you are using a laptop. It is the cheapest and best on the market 
		and comes with 
		a USB 
		cable and 2 CD's containing the programs needed to "burn" the chip. 
		If you are using a desk-top and/or tower with a serial port, you can use 
		a cheaper programmer called MultiChip Programmer from Talking 
		Electronics. You 
		will also need NotePad2 to write your .asm program. This can be 
		downloaded from Talking Electronics website. You will use
		BeeCounter.asm or
		BeeCounter-asm.txt as a 
		basis and it is best to change only a few lines at a time to see what 
		effect is created. You will also need a 6 pin to 5 pin connector that fits between the burner 
		and the project. This is also available on Talking Electronics website.
 As we said before, this project is for medium-to-advanced programmers as 
		it is very compact and does not have in-circuit programming pins.
 To be able to modify the chip you will need a programming socket and 
		this can be obtained from one of our other projects that contains the 5 
		pins for in-circuit programming. Or you can build a programming socket 
		by adding a socket to a surface-mount PC board and solder 5 pins to one 
		edge and connect the socket to the pins.
 You can then put the chip into the socket and program it.
 
 PROGRAMMING LANGUAGE
 There are a number of kits, programs and 
		courses on the market that claim and suggest they teach PIC Programming.
 Most of these modules and courses use a PIC microcontroller as the chip carrying out 
		the processes, but the actual programming is done by a proprietary 
		language invented by the designer of the course.
 Although these courses are wonderful to get you into "Programming 
		Microcontrollers" they do not use any of the terms or codes that apply 
		to the PIC microcontroller family.
 All our projects use the 33 instructions that come with the PIC 
		Microcontroller and these are very easy to learn.
 We use the full capability of the micro and our pre-programmed chip is 
		less than the cost of doing it any other way.
 In addition, anything designed via our method can be instantly 
		transferred to a PIC die and mass produced. And we use all the input 
		pins and all the memory of the chip. The other approaches 
		use less than 25% of the capability of the memory and one of the pins is not available.
 In fact it would be difficult to reproduce this project via any of the opposition 
		methods. It would require a larger chip and more expense.
 You can use our method or the opposition. Just be aware that the two are 
		not interchangeable.
 Ours is classified as the lowest "form" (level) of programming - commonly called 
		machine code - invented in the early days of microprocessors - and now 
		called mnemonic programming as each line of code is made up of  
		letters of a set of words. The opposition uses a higher level language 
		where one instruction can carry out an operation similar to a 
		sub-routine.
 But you have to learn the "higher level language" in order to create a 
		program. And this requires a fair amount of skill and capability.
 It sounds great and it is a good idea. But if you want to learn PIC 
		programming, it does not assist you. It is "a step removed" from 
		learning PIC language. The other disadvantage of the opposition is the 
		"overhead." The 1,000 spaces allocated for your program is filled with 
		pre-written sub-routines. You may require only 10 of these sub-routines but ALL 
		of them are loaded in the memory space. And they take up all the memory.
 You have no room for your own program.
 To get around this the opposition uses the 128 bytes in EEPROM to deliver 
		instructions on how to apply the sub-routines. This provides about 30 powerful instructions using their 
		language called BASIC (or a similar language).
 It's a bit like selling a diary filled with all the paragraphs you need 
		to express yourself, and leaving a few blank pages at the back for you 
		to write single lines such as: see page 24, paragraph 7, see page 63 
		paragraph 4, to create your diary entries.
 It depends on how much you want to be in charge of writing a program. Using 
		our method is like writing your own auto-biography. Using the opposition 
		is like getting a "ghost writer."
 When using a higher level language to create a program, you have absolutely no 
		idea how the code is generated for the micro.
 In some of the developmental kits, the code is "locked away" and you are 
		NEVER able to access it.
 Everything runs smoothly until a fault appears. With our method you can 
		see the code. With the other methods, you cannot see the code - it's 
		like doing key-hole surgery without the advantage of an 
		illuminated endoscope to see what you are doing.
 Everything has its place and our method of hand-assembly is only 
		suitable for very small micros and you will eventually need to "learn a 
		high level language."   The PIC12F629 has over 1,000 locations for code 
		and this equates to more than 20 pages when printed, so this is about 
		the limit to doing things by hand.
 But our drive is to show how much can be done with the simplest devices 
		on the market, at the lowest cost.
 Anyone can show you high-technology at a high price but this is not 
		where you start and this is not where you get enthusiasm.
 We provide the things to get you started. That's the difference.
 
		The
		PROGRAM 
		 The program starts in a loop 
		to detect when the left IR detector is interrupted. It then goes to a 
		second loop to detect when the right IR detector is interrupted. When an 
		IR detector is interrupted, the output goes HIGH. The sensitivity can be adjusted by moving the IR LED closer to the receiver. 
		A 10k pot is also included to adjust the sensitivity.
 When the right IR detector is interrupted, a "count file" is incremented 
		and a 10mS output is produced via a PNP transistor. A 100R on the output 
		protects the transistor from any short-circuits.
 A LED indicates the output has been sent.
 The project keeps a tally of the number of "cycles" and this can be 
		"read" by pressing the switch.
 The count is recorded by listening to low-pitched beeps to represent 
		10's and high-pitched beeps to represent 1's.
 
 
 Here are the files you will need:
 BeeCounter.asm
 BeeCounter-asm.txt
 BeeCounter.hex
 
 
		
			| 	
;*************************************************************
;;Bee Counter.asm       
;*************************************************************
;Left IR detects then increments count on right-side detection
;   12F629.asm
;  8-1-2012 
	list	p=12F629
	radix	dec
	include	"p12f629.inc"
	
	errorlevel -302	; Don't complain about BANK 1 registers 
	__CONFIG _MCLRE_OFF & _CP_OFF 
           & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.
temp1	  equ 20h	;
temp2	  equ 21h	;
temp3	  equ 22h	;
units	  equ	23h	; 
tens	  equ	24h	;
del_x     equ	28h
del_y     equ	29h
tempunits   equ	2Ah
temptens    equ	2Bh
;****************************************************************
;Equates
;****************************************************************
status	equ	0x03
rp1	equ	0x06
rp0	equ	0x05
GPIO 	equ     0x05
			
status		equ 03h
option_reg	equ 81h
	; bits on GPIO
				
pin7	equ	0	;GP0  left IR detector - input
pin6	equ	1	;GP1  goes low to produce HIGH signal - output
pin5	equ	2	;GP2  Sw input  sends count to beeper - input
pin4	equ	3	;GP3  right IR detector - input
pin3	equ	4	;GP4  beeper  - output
pin2	equ	5	;GP5     
 
	;bits
				
rp0	equ	5	;bit 5 of the status register
;****************************************************************
;Beginning of program
;****************************************************************
Start	org	0x00	;reset vector address
	nop
	nop
	nop
	nop	;NOPs to get past reset vector address
	nop
	nop     ;set up to allow counting from external oscillator
SetUp	bsf	status, rp0 	;Bank 1			
       	movlw	b'11001001'	;Set TRIS  
	movwf	TRISIO	   		
	bcf	status, rp0	;bank 0  
	movlw   07h         	;Set up W to turn off Comparator ports
        movwf   CMCON       	;must be placed in bank 0  
	clrf 	GPIO       	;Clear GPIO of junk		
	clrf	flags	
	clrf	units	    	;initialise count = 0
	clrf	tens     	;initialise count = 0
	goto 	Main	
;****************************************************************
;* Delays 
;****************************************************************
			
		
_10mS	movlw	0Ah
	movwf	temp2
D_a	nop
	decfsz  temp1,1
	goto    D_a
	decfsz temp2,1
	goto    D_a	
	retlw   00
		
	;Delay 0.25 sec
D_250mS	movlw 	01h
	movwf 	temp3	
DelX	decfsz 	temp1,1	
	goto 	DelX	
	decfsz 	temp2,1		
	goto 	DelX
	decfsz 	temp3,1
	goto 	DelX
	retlw 	00
;****************************
;* Sub-routines		*
;****************************
    ;output produces long beeps for tens 
    ;and short beeps for units to signify count.
output	movf	units,0
	movwf   tempunits
	movf	tens,0
	movwf   temptens
	movf	temptens,1   ;check for zero
	btfsc	status,2	;zero flag Will be set if file is zero
	goto    $+4		
	call    tensbeep
	decfsz	temptens,1
	goto	$-2		
	call	D_250mS	
	call	D_250mS	
	call	D_250mS	
	call	D_250mS	
	movf	tempunits,1   ;check for zero
	btfsc	status,2	;zero flag Will be set if file is zero
	retlw	00		
	call    unitsbeep
	decfsz	tempunits,1
	goto	$-2			
	retlw	00
		
		
	;produces "beep" to indicate bee has moved and outputs to output.
			
shortbeep	
	movlw	0ffh
	movwf	del_y
	movlw	.45
	movwf	del_x
	nop
	decfsz	del_x,1
	goto	$-2
	movlw	b'00010000'
	xorwf	gpio,1		;toggle GP4		
	decfsz	del_y,1
	goto	$-8
	call	D_250mS		
	retlw	00
		
		
		
	;short beep to indicate units
		
unitsbeep	
	movlw	80h
	movwf	del_y
	movlw	.45
	movwf	del_x
	nop
	decfsz	del_x,1
	goto	$-2
	movlw	b'00010000'
	xorwf	gpio,1		;toggle GP4		
	decfsz	del_y,1
	goto	$-8
	call	D_250mS
	call	D_250mS
	retlw	00			
		
			
leftbeep	
	movlw	80h
	movwf	del_y
	movlw	.45
	movwf	del_x
	nop
	decfsz	del_x,1
	goto	$-2
	movlw	b'00010000'
	xorwf	gpio,1		;toggle GP4		
	decfsz	del_y,1
	goto	$-8
	call	D_250mS
	call	D_250mS
	retlw	00	
		
		
		;long beep to indicate tens
		
tensbeep
	movlw	0ffh
	movwf	del_y
	movlw	0ffh
	movwf	del_x
	nop
	decfsz	del_x,1
	goto	$-2
	movlw	b'00010000'
	xorwf	gpio,1		;toggle GP4		
	decfsz	del_y,1
	goto	$-8
	call	D_250mS
	call	D_250mS	
	retlw	00		
				
		
rightbeep
	movlw	0ffh
	movwf	del_y
	movlw	0ffh
	movwf	del_x
	nop
	decfsz	del_x,1
	goto	$-2
	movlw	b'00010000'
	xorwf	gpio,1		;toggle GP4		
	decfsz	del_y,1
	goto	$-8
	call	D_250mS
	call	D_250mS	
	retlw	00	
	
		
Up	incf	units,1
	movlw	0Ah		;put 10 into w
	xorwf	units,0		;compare units file with 10
	btfss	status,2	;zero flag 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
	btfss	status,2	;zero flag will be set if tens is 10
	retlw	00		
	clrf	tens
	retlw	00
		
			
;****************************************************************
;* Main 							*
;****************************************************************
	
Main	bsf	status, rp0 	;Bank 1			
       	movlw	b'11101101'	;switch and IR receivers GP0 GP2 GP3 
	movwf	TRISIO	   		
	bcf	status, rp0	;bank 0 
	bsf     GPIO,1		;turn off output LED
		
	call	D_250mS
	btfss	GPIO,2	        ;input will be LOW when sw pressed
	call    output
	nop		
	btfss	GPIO,0	        ;input will be HIGH when bee detected
	goto	$-5 		;Left IR not detecting
	call    leftbeep
	call	D_250mS
	btfss	GPIO,2	        ;input will be LOW when sw pressed
	call    output
	nop
	btfss	GPIO,3	        ;input will be HIGH when bee detected
	goto	$-5 		;right IR not detecting
	call    Up		;increment count
	call    rightbeep
	bcf		gpio,1
	call    _10mS
	bsf		gpio,1
	goto	$-18
		
	end		 |  
				
				
             
	  			  
							
								|  |  
								| 
									
										| 2
										  -  100R 
										SM resistors 2  -  330R 
										
										 SM resistors
 2  -  1k  
										
										 SM resistors
 3  -  2k2 
										
										 SM resistors
 2  -  4k7 
										
										 SM resistors
 1  -  10k  
										
										 SM resistor
 
 2  -  10k mini trim pots
 
 1  -  100n SM capacitor
 2  -  1u SM electrolytics
 2  -  10u  SM electrolytics
 
 1  -  BC847  SM 
										transistor
 1  -  BC857  SM 
										transistor
 1  -  1N4004 SM diode
 2  -  IR LEDs (supplied in 
										kit)
 2  -  IR transistors (supplied 
										in kit)
 
 1  -  3mm red LED
 1  -  SPDT mini slide switch
 1  -  mini tactile switch
 1  -  8 pin IC socket
 1  -  PIC12F629 chip (Bee routine)
 1  -  piezo diaphragm
 1  -  10mH choke
 5  -  machine pins for 
										in-circuit-programming
 1  -  4 AAA cell battery 
										holder
 1  -  30cm fine enamelled wire
 3m fine screened lead
 20cm very fine solder
 1  -  Experimenter PC board
 |  |  
						 9/1/2012 |