P1   P2   P3

2-Input Alarm

The Program
The program is presented on the next page. It is very complex and needs a lot of explaining. That's the the purpose of this project. It's to teach programming.
Up to now our programming has been very simple; consisting of sub-routines, followed by a Main routine. We call it "linear programming" as you can look down the program and see what the micro is doing. We now come to a completely different approach.
A microcontroller can only do one thing at a time. It can only be in one place in the program and although it can execute one million instructions per second (for this particular microcontroller), a project such as the 2-Input Alarm needs a number of things done at the same time.
For instance, the output devices need to be turned on and off at different times, with some of the times overlapping.
To do this the micro needs to be organizing a number of things at the same time and each is given a time-duration in the form of a value in a file.
These files are then placed in the program, (one after each other) and accessed by the micro and decremented each time it goes through this part of the program. When a file becomes zero, an action is performed. 
But this decrementing cannot be done if the micro is concentrating on the main program, looking for the press of a push-button or the trigger of a detector etc.
So we have to devise a way to get the microcontroller to do two things at the same time.
This is done by a concept called INTERRUPT. The micro is interrupted while executing the main program and is taken to the Interrupt Routine, then returns.
The microcontroller has a number of "counters" or "timers" that consist of 8-bit files or registers and can be incremented. These can be used to perform this requirement.
The main oscillator is connected to a counter called the Program Counter (PC). This counter causes the microcontroller to advance down the program, "read" each instruction and carry out each instruction. At the same time, the timers can be programmed to increment.
When combined with a feature called Global Interrupt Enable we can get the timer to interrupt the micro and make it go to a particular location - called the Interrupt Vector location (address 04).
To get the micro to do this we add instructions to the program and every time the timer "ticks-over" from FF to 00,  the micro stops the current instruction and goes to address 04. The timer is called "Timer0" and at address 04, the microcontroller executes the "goto" instruction placed at this location. We call our "goto" routine, the ISR (
Interrupt Service Routine) (you can give it any name). This routine can be considered a "secret" or "hidden" routine as it is not obvious how it is accessed. There are no "calls" or "jumps" to this part of the program.
In our program we have added a pre-scaler to the front of timer0 to divide the incoming clock-line by 8. It can be configured to divide by 2 or any value up to 32. In our case we have selected a divide-by-8 by setting bit 2 of the counter.
We now have the situation where the micro carries out 256x8 = 2048 instructions of the main program then goes to address 04 and performs the Interrupt Service Routine then comes back to the main program and carries out another 256x8 instructions.
When the micro is carrying out the Interrupt Service Routine instructions, it is not called back to address 04 - luckily!  At the end of the Interrupt Service Routine it finds an instruction RETFIE (Return From Interrupt) and goes back to the main program.
This type of programming introduces lots of complications. Especially timing, as time-intervals will change if the Interrupt Service Routine is increased in length. This can be overcome by fine-tuning at the completion of writing the program.

The instructions that create the Interrupt Service are shown below:









isr



isr_0


isr_1



Main
ORG 0
GOTO Main
NOP
NOP
ORG 4
GOTO isr


instructions go here
etc
etc

instructions go here
etc

instructions go here
etc

RETFIE

instructions go here
BSF STATUS, RP0
MOVLW b'00000100'
MOVWF Option_Reg ^ 0x080
BCF STATUS, RP0
CLRF TMR0
MOVLW 0xA0
MOVWF INTCON
instructions go here
GOTO Main




















;select bank 1 (the special registers area)
;set bit 2
;load prescaler to create a divide by 8.
;select bank 0 (the program area)
;clear Timer0 register
;set GIE <7> and T0IE <5> (see below)
;enable Interrupts



0xA0 = 1010 0000
GIE = Global Interrupt Enable
T0IE = Timer Zero Interrupt Enable


If you don't know the reason for selecting Bank 0 and Bank 1, or any of the other instructions, you will need to go to one of our PIC projects  - such as PIC LAB-1.
We are only dealing with advancements and improvements over our older-style "linear-mode" programming.
The next thing you will notice is a name has been given to each file. This may be its "computer name" or one generated by the developer of the program.
Since all microcontrollers have an abundance of files, it is possible to use a new file for each sub-routine. In older style microprocessors, the lack of files meant you had to reuse files and had to remember if a file was available for re-use. This has now changed. Files are in abundance.
Assign a short name to each file to allow you to remember its function.  At the beginning of the program, tell the assembler the name you have used by creating an identity called an "equate" (equ). This means "equal to" or "applies to."
When assembling the program, MPASM will need to find <P16F628.inc> file. Place it in the same folder as the file you are assembling. If the assembler does not detect the <P16F628.inc> file, you will need to put all the relevant equates into your .asm file. This has been done in 2-InputAlarm.asm so you will be able to assemble it immediately in MPASM.
Make sure the programmer you are using will burn PIC16F628 chips. 
Refer to Multi Chip Programmer article for a suitable programmer.

DELAYS
A delay is created by adding a sub-routine to the isr section of the program. Use one or two files and load them with 80h (the maximum value is 0FFh). The actual delay-time can be trimmed after the program has been written.
Each decrement is approximately equal to 2048
mS  plus the number of instructions in the isr section, with the answer in microseconds.

ENTRY DELAY
The entry delay was the last modification to the program and is not executed in the isr section. It consists of 48 flashes and "beep-beep" from the entry/exit piezo  - creating a delay of approx 45 seconds. File 4Dh is loaded with 30h to create the delay at Alrm_z
At the completion of 48 flashes, the program executes a 2 second delay via isr. To execute a delay in the main part of the program, interrupts are turned off.

Alrm_z





Entry














Entry1

Entry2






CLRF 4Eh
MOVLW 0x00
MOVWF INTCON
MOVLW 30h
MOVWF 4Dh
BCF 06,1
BSF 06,0
BSF 06,4
CALL Del2
BCF 06,4
CALL Del2
BSF 06,4
CALL Del2
BCF 06,4
CALL Del1
BCF 06,0
CALL Del1
BTFSS 4Eh,0
GOTO Entry1
BCF 4Eh,0
GOTO Entry2
DECFSZ 4Dh,1
GOTO Entry
MOVLW 0x0A0
MOVWF INTCON
MOVLW 0x0FF
MOVWF tmr_Delay1
MOVLW 0x02
MOVWF tmr_Delay2
;clear "button-pressed" flag file

;turn off interrupts
;48 beeps/flashes for entry

;clear orange LED
;turn on red LED
;turn on beeper
;short delay
;turn off beeper
;short delay
;turn on beeper
;short delay
;turn off beeper
;call long delay


;test button-detect flag

;clear button-detect flag in delay routine




;turn on interrupts
;Set delay time for two extra seconds


 


EXIT DELAY

The exit delay was also a last-minute inclusion in the program and consists of 48 flashes and "beep"  from the entry/exit piezo  - creating a delay of approx 45 seconds. File 4Dh is loaded with 30h to create the delay at Exit.



Exit




MOVLW 30h
MOVWF 4Dh
BSF 06,2
BSF 06,4
CALL Del2
BCF 06,4
CALL Del1
;number of beeps/flashes
;storage file for decrementing
;turn on green LED
;turn on beeper
;short delay
;turn off beeper
;call long delay

CHANGING THE PROGRAM
Any changes to the program must be done in very small steps.
This is done in Notepad. Always save with a new name, such as Alarm-A.asm,
Alarm-B.asm etc.
Go to MPASM and change  -A, -B in the top window and click: assemble. Make sure you have selected: 16F628 as the processor, TAB size "8,"  Default Radix, Warning Level: Default, Hex output: Default, Generated Files: Error File and List File.
MPASM will only generate a .hex file when no errors are present.
Test the operation of the circuit fully before making any more changes and save each modification with the new name in case you need to back-track.

One of the values you may want to change is the duration of the siren. It is only short in the program as its "on-time" will depend on your local laws. Some laws limit it to 5 or 10 minutes.
We have found the best arrangement is to put a piezo tweeter inside the house. The noise it produces will send the invader away as he will not be able to hear if anyone is nearby. It's better than putting a wailing siren outside.

 

P1   P2   P3

 
1-5-2004