A complete dialing alarm the size of a pack of
cigarettes
- with features that will amaze you
This is
the lowest-cost dialing alarm on the market and
shows what can be done with a PIC
microcontroller. The complete circuit is shown
below. You cannot see all the features of this
project by looking at the circuit - most of them are
contained in the program. So, read on and see what
we have included. . .
The programming socket is not on the PC board - it has been added for
the time when you want to modify the program and "burn" a new chip.
The arrows on the diagram show the direction of a signal. Outputs RA4
and RA6 produce rail voltage for the stages they are supplying.
Dial Alarm-2 has a single input (although a
number of sensors can be placed in parallel on the
same input line). The circuit requires a trigger
pulse to turn on the Alarm. This is achieved by
placing a 1u on the input line and keeping it
discharged via two 100k resistors. When the input
goes low, the 1u transfers the LOW to the micro and
if the input remains LOW, the 1u charges via the
second 100k resistor.
The micro
executes the program and outputs a low on RB7 to
turn on the LED in the opto-coupler and this causes the line to be
"picked up" via a high-gain Darlington transistor. The micro then dials two
phone numbers and produces a Hee Haw sound to
alert the called party of an intrusion. The circuit
also has a sensitive microphone with a high-gain
amplifier. This is connected to the phone line when
the alarm is triggered.
Amplified audio of
the room is then passed down the line after the Hee
Haw tone. This signal
is clear enough to detect conversations and/or
movement in the target area and the listener can
determine the situation. If the sounds are
determined to be family or staff etc, the alarm can be de-activated by
pressing any of the buttons on the receiving phone. This will pass a
tone down the line and is picked up by the alarm to shut it off. If the
first number is not answered within a few seconds, a second number is
called and the process is repeated. The two numbers
are then called again and the alarm closes
down. Simple but brilliant. The flow Diagram for the
alarm is shown below:
Dial Alarm-2 Flow
Diagram
Use
Dial Alarm-2
as a "Back-Up" Alarm
This alarm has been developed in response to a
number of recent large robberies reported in the
news. Robberies are a constantly increasing crime,
but very few are reported, unless they have a
"twist." Recently, the robbers navigated the
conventional alarm system and broke into the night
safe in the Manager's office. The haul was quite
significant and it's surprising such a large amount
of cash was kept on the premises. The weakest link
in most alarm systems are the PIR detectors, used to
detect movement. It's a known fact that they are
very easy to foil. It's so easy we are forbidden to
print details of how to do it. But many thieves must
be aware of the trick and that's why a back-up
system is essential.
The cheapest back-up system is the use of the phone
line. I know what you are going to say. Cutting the
telephone line is an easy matter and offers little
security. But finding the line in a premises is
not very easy and if there are two or more incoming
lines, it's difficult to know which is connected to
the dialler. Nothing is infallible, but for a lot
less than $50 you can build this project and have a
back-up to protect your property.
The other advantage of our design is the "set and
forget feature." The alarm is designed to ring your
mobile and if you keep your phone beside you 24
hours a day, you can have this peace of mind,
whether you are in your office, factory, holiday
house or quietly dining at your favourite
restaurant.
You can protect any area where a telephone line can
be installed. This includes houses-under-
construction and outlying sheds.
Talking Electronics has been producing security
devices for more than 15 years and this project is a
culmination of those years of experience.
The high-sensitivity amplifier in the alarm is our development
and comes from our highly successful Infinity Bug.
This device connects to the phone line anywhere in
the world and when the number is rung, the infinity
bug answers the call and lets you listen in to the
activities in the room. It's just like being there.
We have used the same circuit in this project. When
it is activated, you can easily work out if it has
been triggered by staff, a family member or an
intruder. At least it prevents unnecessarily
attending 90% of false alarms
and offers enormous peace of mind.
The secret lies in the placement of the triggering
device. We have provided only one input (trigger
input). And there's a reason for this. The idea is
to place the sensor near the target area or on an
actual device, near the microphone.
For instance, it you are protecting a house, a thief
always goes to the main bedroom and rummages through
the drawers and cupboards. In this case a drawer
that is never used should be wired with a magnetic
switch (reed switch) or a movement detector such as
a mercury switch. These switches can be housed in a
plastic case for easy screwing to a wall or door and
are very reliable in operation. When the drawer is
pulled out or the door opened, the switch is
activated. If you are protecting a wall safe, the
switch is placed near the safe in a clipboard or
picture so that when the board or picture is moved,
the alarm is activated. If a room is to be
monitored, the switch is placed on the door so that
when it is opened, the alarm is activated. If other
valuables are being protected (such as a VCR,
scanner etc) a suggestion is to place a clipboard
against the item. The idea is the clipboard has to
be moved to get at the "valuables." The clipboard
contains a magnet and the switch is nearby. The
clipboard keeps the switch open (or closed) and when
it is moved, the alarm is activated.
The ideal arrangement is to avoid touching the
clipboard, drawer, door or other "prop" during
normal activities and this keeps the alarm activated
at all times.
Another suitable trigger device is a pressure mat.
This is something that can be avoided by "those in
the know" and you can monitor an area during your
absence. The alarm can be used for other things
too. You can determine when your business premises
are opened up in the morning by placing a pressure
mat or reed switch on a door. The same can apply to
a particular room in your establishment.
The purpose of this article is not only to produce
the worlds smallest dialling alarm but also show you
how the program runs so you can modify any of the
routines to suit your own particular requirements.
The program can be re-written to dial only one
number for two rings then hang up, or three rings,
then again after 2 minutes or any combination to
suit your requirements. Many mobile phones identify
the caller on the display and you can keep track of
the exact time of arrival and departure of different
personnel.
The alarm can be programmed to monitor machinery and
dial your mobile when a breakdown occurs. It can
monitor water level or even your mail box. The
possibilities are unlimited and it's just a matter
of modifying the program to suit your own needs.
But before you change any of the program you have to
understand what the program does and be capable of
changing the instructions without upsetting the
operation of the alarm.
Remember: A little knowledge is a dangerous thing.
Before doing any re-writing of the program you need
to read our notes on programming and carry out one
small modification at a time.
This is really a very advanced project. The fact
that is looks simple is the power of the
microcontroller. It's taking the place of at least
10 chips in a normal alarm.
Timing and DTMF tones have all been converted to
instructions of a program. And the advantage of a
program is the simplicity of alteration. A
time-interval can be changed or a phone number
altered with a few lines of code. Even new features
can be added without the need for additional
hardware. This project uses the PIC16F628A to its maximum
and shows what can be done with a PIC
microcontroller.
You can program a new number or change a number at
any time by using the 4 buttons. The number is
stored in EEPROM so it will not be lost when the
power is removed.
Before we go any further we must
state that this project cannot be connected to the
public telephone system. Only approved devices can
be connected to the Public Phone System and any
experimental device must be approved for
experimentation and connected via a "telephone Line
Separating Device." These are available from Altronic Imports for approx $100.
This is unfortunately the case and when we discuss
connecting the project "to the line," we are
referring to an experimental telephone system such
as the one we have put together at Talking
Electronics, to test and develop projects such as
these.
See the section "Testing The Project" for
more details of the Test Circuit. It consists of 27v
derived from 9v batteries, a 12v relay, a telephone
and a socket, all in series. The 12v relay is
included to limit the current.
Dial Alarm-2 is not isolated from the phone line nor does it have
any spike protection. Normal phones has 5,000v isolation The maximum
input rejection of Dial Alarm-2 is 125v made up of 80v via the
collector-emitter of the BD679 transistor and 45v via the
collector-emitter of the BC547 transistor. The "ring-voltage" can be as
high as 120v and the transistors are just at the point of zenering. They
may clip the ring voltage if it exceeds 130v.
THE
CIRCUIT
The circuit consists of 6 building blocks.
1. The trigger input.
2. The tone (whistle) detector.
3. The DTMF wave-shaping circuit.
4. The high-gain audio amplifier.
5. The microcontroller.
6. The programming buttons
1.
THE
TRIGGER INPUTS
The project is connected to a 6v supply at all times
and to extend the battery life, the micro turns
off after use. The current drops to less than 1uA.
The trigger must be a pulse to prevent the circuit
re-triggering. This is called a TRIGGER PULSE.
Two trigger inputs have been provided.
L trigger is a LOW trigger and
this means the switch connects between the L Trigger input and 0v.
The H Trigger connects between the H Trigger line and 5v rail.
See below for circuit.
CONNECTING MORE INPUT DEVICES
Input devices are connected to the "L Trigger" (Low
Trigger) and "H Trigger" (High Trigger) inputs.
For a sensor such as a mercury switch (tilt switch) or reed switch, it
does not matter if they are placed on the L Trigger or H trigger. The
alarm is "polling" both inputs.
But if the trigger device is a transistor or output from an alarm
module, you need to know if the trigger will be LOW or HIGH when
activated. The second diagram below shows how to connect these to the
Alarm.
Only one input has been shown on the main circuit but if you want to add
a High Trigger, the following circuit can be added. You will have
to add the necessary code to the program to detect the H Trigger.
Adding a HIGH Trigger
Connecting tilt switch "high" and "low"
Connecting transistor "low" and output of PIR Module "high"
More than one trigger device can be fitted to the
alarm provided they are connected in parallel as
shown in the diagram below.
2.
THE TONE DETECTOR
The simplest building block in the project is the
Tone Detector. It is designed to detect any tone of
about 500Hz on the phone line such as a whistle or
DTMF. When this tone is detected, the alarm will
turn off. In this case the hardware does the
detection.
The circuit amplifies the signal on the phone line
and this turns on the second transistor. On the output is a 1u electrolytic. The stage sits with the collector
at rail voltage, due to the biasing components
keeping the first transistor on and the second
transistor off. When a signal is
delivered, the first transistor turns off and the collector
of the second transistor goes low. This causes the electrolytic to
discharge. This will
be detected by the micro as a LOW.
3.
THE DTMF WAVE-SHAPING CIRCUIT
Dialing a phone number is carried out by sending a
tone down the line. So that whistling can not carry
out a dialing operation, the telephone company
decided to make the tone impossible to produce "by
accident."
Each dialing tone consists of two frequencies, sent
at the same time. These frequencies must be
in the shape of a sinewave as the detecting device
"locks onto" each of the frequencies at the same
time and produces a very-fast result. The only
problem is a micro can only produce a square wave.
To convert a square wave into a sinewave, we need a
wave shaping circuit. In essence this consists of
charging and discharging a capacitor with a square
wave and "picking off" the waveform.
The charging of a capacitor is exponential but if we
take the beginning of the curve and compare it to a
sinewave, the two match up fairly closely.
That's what we have done. We have charged a
100n capacitor very quickly via a 1k resistor so that it is
nearly fully charged and then we begin to discharge
it. The result is a fairly "peaky" sine wave. The
waveform
is picked off the capacitor via a 4k7
resistor and passed into an amplifier transistor
(same transistor that amplifies the audio at the
target zone). The two tones are produced
at the same time by the micro and combined after
the square waves have been shaped.
The component values have been especially chosen to
produce the required sinusoidal waveform. The 10u on
the output is very critic al as it determines the
amplitude of the DTMF as well as the shape of the
signal.
Getting the DTMF tone generator to work was one of the
most difficult parts of this project as the tone
detectors at the exchange are very "exacting" and
critical.
Although we have generated ten tones in the micro,
there are tone-generating chips that
produce 16
tones, while only 12 tones are used on the
telephone keypad. The additional 4 tones are shown
on the diagram below as A, B, C and D. The two
symbol keys are called "star" (*) and "hache"
(hash) key # (also known as the
pound key).
The extra tones can be generated by the program but
are not needed in our situation. In the early days
of DTMF, the 4 extra tones were used by the
telephone companies to route the calls and create
call-charges. The basis of defeating these charges
was through "blue boxes" held to the mouth-piece,
while creating the extra tones. Things have been
tightened up since then.
4.
THE HIGH GAIN AMPLIFIER
The high gain amplifier is the two-transistor
amplifier at the bottom-right of the circuit. It is used
to pick up sounds in the target area during an alarm
activation. It is directly coupled to the phone line
via a Darlington transistor and bridge. The bridge
delivers the correct polarity to the circuit, irrespective of the
polarity of the phone line and the change in impedance of any of the
components connected to the phone line will result in a signal being
sent down the line. The output stage of the high-gain amplifier is one
of these components and it is biased ON via a 220k resistor. This turns
it ON only very slightly, so that the audio signal will drive it
correctly. The "load" for the transistor is all the other components
connected in series with the transistor and this includes the
"holding-in" relay and any isolating transformer at the exchange.
So, we have a two-transistor high-gain amplifier. A
20mV signal from the microphone will produce a
1,000mV signal on the collector of the first
transistor and this will be passed to the output
transistor.
The amplitude of the waveform across the output
transistor is about 2-3v.
The unusual layout of the circuit may be confusing.
The pre-amplifier section is powered from the micro
while the output transistor is driven from the phone line and the AC signal
through the 100n is amplified by the buffer
(output) transistor.
The audio amplifier is turned off when the DTMF
tone is sent down the line and when a
"turn-off tone" is being detected from the receiving
party.
5. THE
MICROCONTROLLER
The heart of the project is the microcontroller. It
is a 18-pin chip with 15 input/output lines and one
input-only line (RA5 - pin 4) and one line that is
"input and half-output" (RA4 - pin
3). The output lines change from
low-to-high-to-low very quickly and each line can
deliver a maximum of 25mA.
The program inside the micro determines what happens
on each of the lines and the parts around the micro
are merely interfacing components. In other words
they adapt or modify or amplify a signal to suit the
micro or phone line.
The micro never stops "running" and it executes
instructions at the rate of one million per
second (1 MIPS).
You need to understand PIC language to program the
micro and Talking Electronics has produced
PIC Programming pages on the web to help you
develop a program.
6. THE
PROGRAMMING BUTTONS
The 4 programming buttons are connected to a single line and a
button-press is determined by the length of time it takes to discharge
the 100n capacitor.
The capacitor is firstly charged by making the line a "high-output" and
then turning it into an input and testing it at regular intervals
to see when it is low.
We have already calculated how long it should take for the various
buttons to discharge the 100n and we look at these intervals. But we
don't know if a button has been pressed at exactly the beginning of the
discharge cycle or part-way through. This will give a false reading. So we look initially to see if any of the buttons have
been pressed and then repeat the cycle knowing the button has
already been pressed.
The resistor values have been chosen to give different timing intervals
for each button.
INSERTING A PHONE NUMBER
The micro is fully programmed but no phone numbers have been placed in
EEPROM.
However we have placed a series of 1's to represent the first phone
number and 2's to represent the second phone number.
The first thing you must do is install your own numbers.
ADDING A NEW PHONE NUMBER
1. Press first button (1st Phone No) for first phone number or 2nd
button (2nd Phone No) for second number.
2. Keep first or second button pressed for 10 seconds. The first or
second phone number will appear on the 7-segment display and then the
bottom, middle, top segments will illuminate to show the number has been
erased. You will now see the lower segment illuminated.
3. Use the Incr Digit button to scroll though the numbers.
4. Press Store when appropriate digit shows on 7-segment display.
5. When all the digits of the phone number have been inserted, turn the
project OFF. Turn on again.
VIEWING NEW NUMBER
1. Press first button for half-second for (1st Phone No) for first phone
number or press 2nd button for half-second for (2nd Phone No) for second
number. Pressing longer than 5 seconds will erase the number.
CHANGING A NUMBER
1. Press first button (1st Phone No) for first phone number to be
changed or press 2nd button (2nd Phone No) for second number.
2. Keep first or second button pressed for 10 seconds. The first or
second phone number will appear on the 7-segment display and then the
bottom, middle, top segments will illuminate to show the number has been
erased. You will now see the lower segment illuminated.
3. Use the Incr Digit button to scroll though the numbers.
4. Press Store when correct digit shows on 7-segment display.
5. When all the digits of the phone number have been inserted, turn the
project OFF. Turn on again.
Note:
If the display shows "junk" or dashes when button 1 or 2 is
pressed, press 1st or 2nd button for 10
seconds to clear the display. You will now be in "programming mode" and
can insert new phone number. Turn project off when finished and turn it
on. Dial Alarm-2 is now "armed."
Dial Alarm-2 does not have a delete or cancel button when in the
programming mode.
If you make a mistake when adding a new phone number, turn the project
OFF and ON. Push 1st or 2nd button for 10 seconds to get into
programming mode and go to the instructions: Adding A New Phone Number,
above.
THE PHONE VOLTAGE
Before designing any project for operation on the
phone line, you have to understand how the 50v line
operates. It's not like a normal 50v power supply.
You cannot simply design something for 50v on your
bench power-supply and
connect it to the phone line.
The phone line is a 50v battery (actually
slightly higher than 50v - about 52v - however some
of the newer phone systems deliver a voltage as low
as 35v - 40v) with a 1k relay in series with one
line. When you short the two phone lines together,
the relay pulls in to indicate the handset has been
lifted. Under these circumstances the current
flowing through the line will be 50/1,000 = 50mA.
The relay will drop out at 15mA and so you can add
devices to the phone line until the current falls to
about 15mA without the line dropping out. It is best
to keep the current high to prevent the line
dropping out.
Most phones drop about 8 - 12v
across them when they are working and this voltage
can be used by the phone for the amplifying
circuits, tone generators etc. Our design has a
separate supply, however it could be designed to use
the phone voltage, if you wish. The 8v-10v across the
audio output transistor gives it
plenty of voltage for a good waveform. The
audio is sensitive enough to hear a clock ticking in
the target area.
The 10v is produced by the 560R resistor plus the
effective resistance of the audio output transistor
that has been turned on slightly via the 220k
base-bias resistor.
The DTMF transistor is also turned on and this
provides a load that has an effect on producing the
8-10v we need to keep the line "active."
BUILDING THE PROJECT
All the components fit onto a PC board labelled
Dial Alarm-2. The placement of each component is
clearly shown by the overlay on the board and the
only component requiring careful attention is the bridge.
The bridge has positive (+) and negative (-) marked
on the top of the device as well as AC inputs
indicated by squiggle lines. Here is the
original prototype. It has been designed with
exactly the same layout as the PC board (shown
below) to make it easy to design the board and
prevent any mistakes. This is one of the secrets of
"getting things right."
Dial Alarm-2 built on matrix board - the kit comes with PC board (shown
below)
Button details
PC board for Dial Alarm-2
The
outside case of the electret microphone must go to
the negative rail. The microphone can be fitted to a
short length of twin lead or fine screened
microphones lead (as supplied in the kit) so it can
be positioned near the audio you wish to detect.
Solder the 8-pin IC socket for the microcontroller
to the board so that the cut-out, covers the cut-out
on the board. This way the chip will always be
fitted around the correct way.
The 4-core telephone cable comes with 4-pin plugs
crimped on each end. A 4-pin modular telephone
socket is soldered to the board.
Dial Alarm-2
PARTS LIST
Cost
$45.75
plus $6.50
postage
or the pre-programmed chip as a
separate item is $15.00 plus $5.00
post |
|
1 - 220R
1/4 watt
7 - 470R "
2 - 560R "
3 - 1k "
3 - 4k7 "
2 - 10k "
2 - 22k "
1 - 47k "
1 - 82k "
5 - 100k "
1 - 120k "
1 - 220k "
1 - 1M "
8 - 100n ceramics
(monoblock)
4 - 1u 25vw electrolytics
1 - 10u 25vw electrolytics
1 - 1N4148 signal diode
4 - BC 547 transistors or similar
1 - BD 679 transistor
1 - 7-segment display FND 500
or 560
1 - electret microphone insert
1 - DF 04 bridge
1 - -4N24 opto-coupler
1 - 4 pin US phone
socket
4 - tactile switches
1 - 18 pin IC socket
1 - 4-cell AA battery holder
1 - on/off slide switch
4 - AA cells
2 - 2-way terminal
blocks
3m - 4-core telephone cable with
plugs
crimped on the ends
1m - fine screened microphone lead
1m - fine tinned copper wire
1m - fine enamelled wire
2m - very fine solder
1 - PIC16F628A - Alarm2
(full version)
1 - Dial Alarm-2
PC
board |
|
TESTING THE PROJECT
The project is tested either on a 50v line or the
Test Circuit shown in the diagram below. The
supply is three 9v batteries.
It does not matter which way around
the phone or Dial Alarm-2is connected as both have a
diode bridge to accept either polarity. When the
mercury switch is activated, the alarm sends a Hee
Haw tone down the line and this is detected by
listening to the line via another telephone
connected in series with the Dial Alarm-2
project, as shown in the diagram above. The audio
from the room is then sent down the line. After 15
seconds the Hee Haw is produced again over the
audio and this is repeated at a further 15 seconds.
The project then closes down, waits a few seconds
then dials the second number and repeats the
operation. The two numbers are dialled again and
the Alarm closes down.
You can repeat the sequence in the Test Circuit and
during the listening period, push any of the buttons
on the phone to send a DTMF tone down the line.
The project will close down.
If the input of the alarm is connected to a reed or
mercury switch on a door, the door will have to be
closed again to produce another trigger pulse.
IF THE
PROJECT DOESN'T WORK
If the project doesn't work you will have to go to
one of the following sections:
1.
The turn-on circuit.
The project turns ON when a trigger pulse is
detected on RA5 or RA7. RA5 detects a LOW and RA7
detects a HIGH. Make sure the project is in "Active"
mode by pressing button 1 and viewing the 1st phone
number.
Make sure RA5 is HIGH when the project is in
active-mode and RA7 is LOW. The trigger pulse will
be very brief.
2. The
tone detector amplifier
The operation of the Tone Detector circuit is very
clever. The quiescent conditions are set by the two
100k biasing resistors. This puts the base of the
first transistor at mid rail.
The emitter will be slightly less than this and the
first transistor will be turned ON and the second
transistor will be OFF.
When a signal is delivered to the first transistor,
some part of the waveform will turn the transistor
OFF and the emitter will drop just
like an emitter-follower. The base of the second
transistor will remain fixed by the 10u and when the
first transistor turns off, the current though the
lower 10k resistor will reduce and the voltage
across this resistor will reduce. This means the base-emitter
voltage of the second transistor will increase. This
will turn on the second transistor and it will
discharge the 1u. The 1u will discharge faster than
it can charge via the 10k resistor and this will
result in a LOW and be
detected by the micro.
This means the signal actually passes through the
stage via the emitters and not via the base of the
second transistor.
This circuit is a form of Schmitt Trigger.
The voltage across the 1u is very easy to detect via
a multimeter.
3.
The DTMF Section.
The quickest way to determine if this section is
working is to pick up the phone and activate the
alarm, by tilting the mercury switch.
You will hear the DTMF tone being sent down the
line if you have the project on a test-rig."
If these tones are not heard, you can produce a
constant DTMF tone for say "0" by inserting the
following instructions into the program:
Replace the last instruction for the sub-routine
DTMF with: goto DTMF The first
data-byte in EEPROM must be 3fh.
Make sure they are removed after the testing is
complete.
Placing a piezo between pin 17 and ground will allow
you to hear one of the tones and between pin 18 and
ground, the other tone.
The tones will be produced continuously and you can
view them on a CRO and observe their wave-shape
entering the phone line.
4.
The High-Gain Audio Amplifier
The audio amplifier consists of two stages. The
pre-amplifier (the low-signal stage) and the buffer
stage (output stage).
The pre-amplifier section consists of a standard
common-emitter amplifier with AC coupling (capacitor
coupling) to the microphone.
You will need either a CRO or an audio tracer to
listen to or observe the signal from the microphone
through to the output transistor.
Our circuit had a gain of 50, with a 20mV signal
(whistle) from the microphone producing 1,000mV (1v)
signal into the base of the pre-amplifier stage. The output transistor amplifies this to
produce a signal of about 3v on the phone line. You
will need a CRO to view the waveforms if you think
the audio stages are not operating correctly. A
dual-trace CRO is best so you can observe the input
and output of a particular stage at the same time.
This completes the coverage of all the individual
building blocks in the circuit. If a fault still
persists, the best way to tackle the problem is to
get another electronics person to check the board.
It may be a simple mistake such as swapping two
components, a solder bridge or dry joint.
As a last resort, you can build another kit and with
the second project working, compare the two.
THE
PROGRAM
The program presented in
this article has reduced
features. The full version comes with the kit. This version only dials
one number and does not detect a whistle to turn off. A PIC16F628A
containing the full program is available for $15.00 plus $5.00 post - if
you want to provide your own parts and PC board. A full kit is available
by emailing
Colin Mitchell.
However this program will provide a lot of features for experimenting.
The program does not follow the conventional line of
looping Main and calling sub-routines. This
program loops Main and goes to a sub-routine,
depending on the result of a button press or
trigger. From the sub-routine the micro goes to
another sub-routine, depending on 1st number or 2nd
number requirement and will go to a loop, requiring
the project to be turned off. Refer to the
following diagram to see how the micro advances
through the various sub-routines. If a trigger
pulse is detected, the micro will advance down Main
and dial the two numbers (twice) and produce Hee Haw
and listen for a tone to turn off. At the end, the
project will return to "active state," waiting for
another trigger pulse.
Here is the file for Dial Alarm-2, in 4 different
forms. The program is a reduced version for
experimenting. Full version is supplied in the Dial
Alarm-2 kit.
DialAlarm2-1No.asm
DialAlarm2-1No.hex
DialAlarm2-1NoAsm.txt
DialAlarm2-1NoHex.txt
;****************************************************************
; Started 15/8/2009 Reduced version 6-10-2009
; DIAL ALARM-2 with Hee Haw
;This is a reduced version of the program.
; It does not dial the second number and does not turn off
; via whistle or DTMF. It only detects a LOW trigger input on RA5.
;A PIC16F628A containing the full program is available for $15.00 plus $5.00 post, if you
; want to provide your own parts and PC board. A full kit is available by emailing Colin Mitchell.
;
;Port B drives 7 segment display
;
;Project comes on with a number for first and second phone number.
;To clear fist phone number, push "First Phone Number for 10 secs
; "_" will appear 16 times then "_" "-" "-" This indicates number erased
;and "incr digit" will work for first phone number. Store each number
;and switch project off when finished. New number will now be available
;for dialling. If fist number is "_" you must hold first sw for 10 secs to
;get into "Incr digit" to produce first number via incr Digit and Store.
;
;****************************************************************
list P = 16F628 ;microcontroller
include ;registers for F628
__Config _cp_off & _lvp_off & _pwrte_on
& _wdt_off & _intRC_osc_noclkout & _mclre_off
errorlevel -302 ;remove message about using proper bank
;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 and Hee Haw
temp2 equ 21h ;for delay and Hee Haw
temp3 equ 22h ;for delay
Sw_Flag equ 26h ;
count equ 27h ;loops of discharge time for 100n
tempA equ 29h ;temporary storage for EEPROM read
tempB equ 2Ah ;temporary storage for EEPROM read
pointer equ 2Bh ;pointer for table
carrier equ 2Ch ;carrier file
lowtone equ 2Dh ;low tone
lowdec equ 2Eh ;decrementable low tone
hightone equ 2Fh ;high tone
highdec equ 30h ;decrementable high tone
epromstart equ 31h ;eeprom start address
loops equ 32h ;dtmf loops and others
secondNo equ 33h ;to ring second number
secondtime equ 34h ;to ring second time
count2 equ 35h ;counter to show "-" when alarm is working
;****************************************************************
;Equates
;****************************************************************
status equ 0x03
cmcon equ 0x1F
rp1 equ 0x06
rp0 equ 0x05
portA equ 0x05
portB equ 0x06
trisA equ 0x85
trisB equ 0x86
;****************************************************************
;Beginning of program
;****************************************************************
reset org 00 ;reset vector address
goto SetUp
table1 addwf PCL,F ;02h,1 add W to program counter
retlw b'00001000' ; "_" -|-|-|D|-|-|- ready for number 08h
retlw b'00001000' ; "_" -|-|-|D|-|-|- ready for number 08h
retlw b'00111111' ; "0" -|F|E|D|C|B|A 3Fh
retlw b'00000110' ; "1" -|-|-|-|C|B|- 06h
retlw b'01011011' ; "2" G|-|E|D|-|B|A 5Bh
retlw b'01001111' ; "3" G|-|-|D|C|B|A 4Fh
retlw b'01100110' ; "4" G|F|-|-|C|B|- 66h
retlw b'01101101' ; "5" G|F|-|D|C|-|A 6Dh
retlw b'01111101' ; "6" G|F|E|D|C|-|A 7Dh
retlw b'00000111' ; "7" -|-|-|-|C|B|A 07h
retlw b'01111111' ; "8" G|F|E|D|C|B|A 7Fh
retlw b'01101111' ; "9" G|F|-|D|C|B|A 6Fh
;Table2 DTMF Low tones
Table2 ADDWF 02,1 ;
NOP
retlw 075h ;1
retlw 075h ;2
retlw 075h ;3
retlw 06Ah ;4
retlw 06Ah ;5
retlw 06Ah ;6
retlw 05Fh ;7
retlw 05Fh ;8
retlw 05Fh ;9
retlw 056h ;0
;Table3 DTMF HIGH tones
Table3 ADDWF 02,1 ;
NOP
retlw 044h ;1
retlw 03Dh ;2
retlw 037h ;3
retlw 043h ;4
retlw 03Dh ;5
retlw 037h ;6
retlw 043h ;7
retlw 03Dh ;8
retlw 037h ;9
retlw 03Ch ;0
;****************************************************************
;* port A and B initialisation
;Button Up and Button Down recognised when project turned on. *
;****************************************************************
SetUp bsf status,rp0
clrf trisA ;Make all RA output
clrf trisB ;Make all RB output
bsf trisA,5 ;Make RA5 input for LOW trigger
bsf trisA,6 ;make RA6 input for tone detect
movlw b'10000000' ;Turn off T0CKI, prescale for TMR0 = 1:
movwf option_reg
bcf status,rp0 ;select programming area - bank0
clrf portA ;Clear Port A of junk
clrf portB ;Clear Port B of junk
clrf Sw_Flag
clrf pointer
movlw 07h ;turn comparators off and enable
movwf cmcon ; pins for I/O functions
goto Show ;Show "dIAL-2"
;Delays
_1mS nop
decfsz temp1,f
goto _1mS
retlw 00
_4mS movlw 04h
movwf temp2
_b nop
decfsz temp1,f
goto _b
decfsz temp2,f
goto _b
retlw 00
_10mS movlw 0Ah
movwf temp2
_c nop
decfsz temp1,f
goto _c
decfsz temp2,f
goto _c
retlw 00
_50mS movlw 40h
movwf temp2
_d nop
decfsz temp1,f
goto _d
decfsz temp2,f
goto _c
retlw 00
_100mS movlw 64h
movwf temp2
_e nop
decfsz temp1,f
goto _e
decfsz temp2,f
goto _e
retlw 00
_250mS movlw 0FFh
movwf temp2
_ee nop
decfsz temp1,f
goto _ee
decfsz temp2,f
goto _ee
retlw 00
_750mS goto $+1
goto $+1
goto $+1
goto $+1
decfsz temp1,1
goto _750mS
decfsz temp2,1
goto _750mS
retlw 00
_2Sec movlw 05h
movwf temp3
movwf temp2
_2 nop
decfsz temp1,f
goto _2
decfsz temp2,f
goto _2
decfsz temp3,f
goto _2
retlw 00
_5Sec movlw 0Ch
movwf temp3
movwf temp2
_5 nop
nop
nop
nop
decfsz temp1,f
goto _5
decfsz temp2,f
goto _5
decfsz temp3,f
goto _5
retlw 00
;clear1 clears the first phone number in EEPROM (from Read1) then
; goes to incrA
clear1 movlw 08h ;scans display "_" "-" "-"
movwf portB
call _100mS
movlw 40h
movwf portB
call _100mS
movlw 01h
movwf portB
call _100mS
movlw 00h
movwf tempA
movlw 0Fh
xorwf tempA,0
btfsc status,2 ;zero flag in status file. Set if pointer is 0Fh
goto incrA ;exits when 0Fh locations have "_" at each address
movf tempA,0
bsf status,rp0 ;select bank1
movwf eeadr ;
movlw 08h ;put a "_" at each address
movwf eedata ;
bcf status,rp0 ;select bank0
call write
incf tempA,1
goto $-.12
;clear2 clears the second phone number in EEPROM (from Read2) then
; goes to incrB
clear2 movlw 08h
movwf portB
call _100mS
movlw 40h
movwf portB
call _100mS
movlw 01h
movwf portB
call _100mS
movlw 20h
movwf tempA
movlw 2Fh
xorwf tempA,0
btfsc status,2 ;zero flag in status file. Set if pointer is 2Fh
goto incrB ;exits when 0Fh locations have "_" at each address
movf tempA,0
bsf status,rp0 ;select bank1
movwf eeadr ;
movlw 08h ;put a "_" at each address
movwf eedata ;
bcf status,rp0 ;select bank0
call write
incf tempA,1
goto $-.12
;dials the whole DTMF phone number and returns on finding "_" (08h)
;only start of EEPROM is needed 00h for 1st No and 20h for 2nd No
Dial movf epromstart,0 ;eeprom start address
bsf status,rp0
movwf EEADR
bsf EECON1,0 ;starts EEPROM read operation. Result in EEDATA
movf EEDATA,0 ;move read data into w
bcf status,rp0
movwf tempA ;convert display value in tempA to 0-9 in "carrier"
movlw 08h
xorwf tempA,0 ;
btfsc status,2 ;
retlw 00 ;end of number detected (08h) return
movlw 01h
movwf carrier ;create a value 0-9
movlw 06h
xorwf tempA,0 ;compare tempA with 06h
btfsc status,2 ;zero flag in status file. Set if pointer is 06h
goto dddd
incf carrier,1
movlw 5Bh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 4Fh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 66h
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 6Dh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 7Dh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 07h
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 7Fh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 6Fh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
movlw 3Fh
xorwf tempA,0 ;
btfsc status,2 ;
goto dddd
incf carrier,1
dddd movf carrier,0 ;carrier will be 1,2,3 ..0A
call table2 ;Get low-tone value
movwf lowtone ;Put low-tone into low
movwf lowdec ;Decrementable low-tone
movf carrier,0
call table3
movwf hightone ;Put high-tone into high
movwf highdec ;Decrementable high-tone
call DTMF
call _100mS ;100mS delay between tones
call _100mS ;100mS delay between tones
incf epromstart,1
goto dial
DTMF movlw 0FFh ;80 loops of tone to produce 1/10th sec
movwf loops ;temp file for decrementing dtmf
decfsz highdec,1
goto $+5
movlw 01h ;to toggle RA0
xorwf portA,1
movf hightone,0
movwf highdec
decfsz lowdec,1
goto $-7
movlw 02h ;to toggle RA1
xorwf portA,1
movf lowtone,0
movwf lowdec
decfsz loops,1
goto $-.13
bsf portA,0 ;turn on output to keep Alarm on line
bcf portA,1
retlw 00
;HeeHaw produces alarm-sound via opto coupler
Hee movlw 0FFh
movwf temp1
movlw 0C0h
movwf temp2
bsf portB,7
nop
decfsz temp2,1
goto $-2
movlw 0C0h
movwf temp2
bcf portB,7
nop
decfsz temp2,1
goto $-2
decfsz temp1,1
GOTO $-.13
Haw movlw 0C0h
movwf temp1
movlw 0FFh
movwf temp2
bsf portB,7
nop
decfsz temp2,1
goto $-2
movlw 0FFh
movwf temp2
bcf portB,7
nop
decfsz temp2,1
goto $-2
decfsz temp1,1
goto $-.13
bcf portB,7 ;Keep opto-coupler ON after Hee Haw
retlw 00
;incr digits for first phone number (from Clear1)
;then detects "store." Turn off project when finished new number.
incrA movlw 08h
movwf portB ;produce "_"
movlw 01h
movwf pointer ;pointer looks at table1 value
call Sw
btfsc Sw_Flag,3 ;has "Incr Digit" been pressed?
call Up
call Sw
btfsc Sw_Flag,7 ;has "Incr Digit" been released?
goto $-2
call Sw
btfss Sw_Flag,4 ;has "store" been pressed?
goto $-8
movlw 00h
movwf tempA
movf tempA,0 ;find first blank location
bsf status,rp0
movwf EEADR ;find first location 00 in EEPROM
bsf EECON1,0 ;starts EEPROM read operation. Result in EEDATA
movf EEDATA,0 ;move read data into w
bcf status,rp0
movwf tempB ;see if location contains 08h
movlw 08h
xorwf tempB,0 ;compare tempB with 08h
btfsc status,2
goto $+3
incf tempA,1
goto $-.12
movf pointer,0 ;copy pointer value into w
call table1 ;display value will return in w
bsf status,rp0 ;select bank1
movwf eedata ;display values are stored in EEPROM
bcf status,rp0 ;select bank0
movf tempA,0 ;tempA will contain address
bsf status,rp0 ;select bank1
movwf eeadr ;
bcf status,rp0 ;select bank0
call write
goto incrA
;incr digit for second phone number (from Clear2)
;then detects "store." Turn off project when finished new number.
incrB movlw 08h
movwf portB ;produce "_"
movlw 01h
movwf pointer ;pointer looks at table1 value
call Sw
btfsc Sw_Flag,3 ;has "Incr Digit" been pressed?
call Up
call Sw
btfsc Sw_Flag,7 ;has "Incr Digit" been released?
goto $-2
call Sw
btfss Sw_Flag,4 ;has "store" been pressed?
goto $-8
movlw 20h
movwf tempA
movf tempA,0 ;find first blank location
bsf status,rp0
movwf EEADR ;find first location 20 in EEPROM
bsf EECON1,0 ;starts EEPROM read operation. Result in EEDATA
movf EEDATA,0 ;move read data into w
bcf status,rp0
movwf tempB ;see if location contains 08h
movlw 08h
xorwf tempB,0 ;compare tempB with 08h
btfsc status,2
goto $+3
incf tempA,1
goto $-.12
movf pointer,0 ;copy pointer value into w
call table1 ;display value will return in w
bsf status,rp0 ;select bank1
movwf eedata ;display values are stored in EEPROM
bcf status,rp0 ;select bank0
movf tempA,0 ;tempA will contain address
bsf status,rp0 ;select bank1
movwf eeadr ;
bcf status,rp0 ;select bank0
call write
goto incrB
;Read First Phone Number then to Clear1 if more than 10 secs
Read1 movlw 00h ;first address in EEPROM for second number
movwf tempA
movlw 0Fh
xorwf tempA,0
btfsc status,2 ;zero flag in status file. Set if pointer is 0Fh
goto $+.13
movf tempA,0
bsf status,rp0
movwf EEADR
bsf EECON1,0 ;starts EEPROM read operation. Result in EEDATA
movf EEDATA,0 ;move read data into w
bcf status,rp0
movwf portB ;data stored as values for 7-seg display
call _750mS
clrf portB
call _100mS
incf tempA,1
goto $-.15
call Sw ;see if sw pressed for 10 secs
btfss Sw_Flag,1
retlw 00
call _750mS
call Sw
btfss Sw_Flag,1
retlw 00
call _750mS
call Sw
btfss Sw_Flag,1
retlw 00
call _750mS
call Sw
btfss Sw_Flag,1
retlw 00
goto clear1 ;clear first phone number
;Read second Phone Number then to Clear2 if more than 10 secs
Read2 movlw 20 ;first address in EEPROM for second number
movwf tempA
movlw 2Fh
xorwf tempA,0
btfsc status,2 ;zero flag in status file. Set if pointer is 2Fh
goto $+.13
movf tempA,0
bsf status,rp0
movwf EEADR
bsf EECON1,0 ;starts EEPROM read operation. Result in EEDATA
movf EEDATA,0 ;move read data into w
bcf status,rp0
movwf portB ;data stored as values for 7-seg display
call _750mS
clrf portB
call _100mS
incf tempA,1
goto $-.15
call Sw ;see if sw pressed for 10 secs
btfss Sw_Flag,2
retlw 00
call _750mS
call Sw
btfss Sw_Flag,2
retlw 00
call _750mS
call Sw
btfss Sw_Flag,2
retlw 00
goto clear2 ;clear second phone number
;Shows "dIAL-2" on start-up
Show call _750mS ;delay to allow micro to start-up
movlw b'01011110' ; "d" G|-|E|D|C|B|-
movwf portB
call _750mS
movlw b'00000110' ; "I" -|-|-|-|C|B|-
movwf portB
call _750mS
movlw b'01110111' ; "A" G|F|E|-|C|B|A
movwf portB
call _750mS
movlw b'00111000' ; "L" -|F|E|D|-|-|-
movwf portB
call _750mS
movlw b'01000000' ; "-" G|-|-|-|-|-|-
movwf portB
call _750mS
movlw b'01011011' ; "2" G|-|E|D|-|B|A
movwf portB
call _750mS
clrf portB
bsf portB,7 ;turn off optocoupler
goto Main
;Sw subroutine generates bit 1,2,3,4 in Sw_Flag file
Sw bsf status,rp0
bcf trisA,3 ;Make bit 3 output
bcf status,rp0
bsf portA,3 ;make bit 3 HIGH
call _1mS ;create delay to charge 100n
bsf status,rp0
bsf trisA,3 ;Make bit 3 input
bcf status,rp0
call _10mS
call _10mS
btfss portA,3 ;if set, no sw pushed
goto $+3 ;sw pushed
clrf Sw_Flag ;no sw pressed
retlw 00 ;
btfsc Sw_Flag,7 ;test "first-pass" sw flag
retlw 00
clrf count
bsf status,rp0
bcf trisA,3 ;Make bit 3 output
bcf status,rp0
bsf portA,3 ;make bit 3 HIGH
call _1mS ;create delay to charge 100n
bsf status,rp0
bsf trisA,3 ;Make bit 3 input
bcf status,rp0
call _4mS
incf count,f
btfsc portA,3 ;is input HIGH?
goto $-3 ;count exits with 1-5
bsf Sw_Flag,0 ;set button-pushed flag
decfsz count,f
goto $+3
bsf Sw_Flag,1 ;set a flag-bit for first sw
retlw 00
decfsz count,f
goto $+3
bsf Sw_Flag,2 ;set a flag-bit for second sw
retlw 00
decfsz count,f
goto $+3
bsf Sw_Flag,3 ;set a flag-bit for third sw
retlw 00
bsf Sw_Flag,4 ;set a flag-bit for fourth sw
retlw 00
Up incf pointer,1
movlw 0Ch ;put 13 into w
xorwf pointer,0 ;compare pointer with 12
btfsc status,2 ;zero flag in status file. Set if pointer is 12
clrf pointer
movf pointer,0 ;copy unit value into w
call table1 ;display value will return in w
movwf portB
bsf Sw_Flag,7 ;set "first-pass" sw flag
retlw 00
write bsf status,rp0 ;select bank1
bsf eecon1,wren ;enable write
movlw 55h ;unlock codes
movwf eecon2
movlw 0aah
movwf eecon2
bsf eecon1,wr ;write begins
bcf status,rp0 ;select bank0
writeA btfss pir1,eeif ;wait for write to complete
goto writeA
bcf pir1,eeif
bsf status,rp0 ;select bank1
bcf eecon1,wren ;disable other writes
bcf status,rp0 ;select bank0
retlw 00
;****************************************************************
;* Main *
;****************************************************************
Main call Sw
btfsc Sw_Flag,1
call Read1
btfsc Sw_Flag,2
call Read2
btfss portA,5 ;trigger input for alarm - normally HIGH
goto $+8
decfsz count2,1 ;dec counter to show "-" alarm working
goto $+4
bsf portB,6 ;show "-"
call _4mS
bcf portB,6 ;clear "-"
btfsc portA,5 ;trigger input for alarm - normally HIGH
goto Main
;secondNo to ring second number
;secondtime to ring second time
movlw 14h ;show "ii" when dialing numbers
movwf portB
Main1 movlw 02
movwf secondNo ;to ring 2nd number
movwf secondtime ;to ring numbers second time
bcf portB,7 ;to keep circuit ON
Main1a call _5Sec ;delay before starting to dial
movlw 00
Main2 movwf epromstart ;start of EEPROM for 1st Number
call Dial
movlw 04h ;Put 4 loops into W
movwf loops
call _5Sec ;5 second delay
call Hee ;Hee Haw outputs through opto coupler
call _750mS ;for silence
bsf portA,2 ;turn on high-gain amplifier
call _5Sec ;listen to target area for sounds
call _5Sec ;listen to target area for sounds
bcf portA,2 ;turn off high-gain amplifier
bsf portA,7 ;turn on Tone Detector Cct
call _2Sec ;listen for whistle and let circuit settle
btfss portA,6 ;detect DTMF or whistle - will produce a LOW
goto Main3
call _2Sec ;listen for whistle
btfss portA,6 ;detect DTMF or whistle - will produce a LOW
goto Main3
call _2Sec ;listen for whistle
btfss portA,6 ;detect DTMF or whistle - will produce a LOW
goto Main3
decfsz loops,1
goto $-.17
bsf portB,7 ;hang up phone
call _5Sec ;Delay before ringing
bcf portB,7 ;pick up phone line
decfsz secondNo,1 ;ring 2nd number
goto Main4
decfsz secondtime,1 ;Ring number the second time
goto Main5
Main3 clrf portB ;turn off display
bcf portA,7 ;turn off Tone Detector Cct
bsf portB,7 ;hang up phone
GOTO Main2 ;loop and call numbers again
Main4 movlw 00h ;to ring phone number again
goto Main2
Main5 movlw 02
movwf secondNo
goto Main1a
;****************************************************************
;*EEPROM Values to burn into EEPROM *
;****************************************************************
org 2100h ;16 locations 00 to 0F
de 06h, 06h, 06h, 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh,
7Dh, 07h, 7Fh, 6Fh, 08h, 08h, 08h
org 2120h ;16 locations 20 to 2F
de 5Bh, 5Bh, 5Bh, 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh,
7Dh, 07h, 7Fh, 6Fh, 08h, 08h, 08h
org 2130h
de 3Fh
END
|
MODIFYING THE PROGRAM
To work on the program, you need to buy a PROGRAMMER
(PICkit2
- see above
or
Multi Chip Programmer
) and put the chip on a
prototyping board with a 5-pin programming socket so it
can be "burnt." The connections for the
Programming Socket are shown on the Dial Alarm-2
circuit above.
The next thing you will need is the
.asm
file and
open it in NotePad2. Notepad2 is called a text
editor and it will display the code in columns so
that each line can be assembled in MPASM to create a
.hex file. Call your program by a different
name so that you can identify your changes.
MPASM will also produce
a .lst file that shows any mistakes you have
made.
When your program is mistake-free, MPASM will
produce a .hex file.
Download MPASM (v02.70),
click:
MPASM. The latest version of MPASM is very
messy. Use the one we provide.
You will
also need a text program such as TextPad or NotePad
You cannot use the .asm file above for
TextPad as it has added spaces. These spaces will
upset MPASM when it tries to compile the
file to produce a .hex file. If you get an
error on a line (from MPASM) that seems to be
correct, try re-typing the line(s) as it may contain
unseen spaces!
Then use
Chip Programmer - PICkit2
or
Multi Chip Programmer -
to "burn" the program into the chip. The phone numbers
are stored in EEPROM and are changed via software
when the project is powered. You don't need to
"burn" them into the chip.
If the program does not work, you may be told about
and Emulator or Single Stepper, that will "solve all your problems."
Let's see . . .
USING AN
EMULATOR
An Emulator is a single-stepping program that goes
though the code, one instruction at a time, so you
can see what is happening.
A Single-Stepper program comes on the CD with
PICkit-2 and you can use it if you wish. We have
found it helpful in some ways as you can see the
contents of each register before and after an
instruction has been executed and this will let you
know why an instruction may not be working. It is
most helpful when executing a Boolean instruction as
the result has to be worked out on paper and the
single-stepper will let you check the result.
Our method of developing a program is slightly
different. We suggest using the "cut and paste"
method of creating a project.
Start by using one of the projects already available
on our website by clicking
HERE
and removing the unwanted
sub-routines. You will then have a layout for the
processor, a few equate files, some sub-routines and
Main.
Fir the micro to an experimental PC board containing
5 pins for In-Circuit Programming, add a LED and
resistor and create a sub-routine that loops and
blinks the LED.
You have now started.
Add a few more lines of code and test its
operation.
This is exactly how we start every project.
It's wishful thinking to write a large program and
expect it to "run." It possibly won't. Just add a
few lines at a time and check the operation.
For the Dial Alarm-2 project, we tested each section
separately and this consisted of more than 7
different blocks.
Not only do you have to get the electronics to work
but you also need to get the program to interface to
the block.
This is where an Emulator or Single-Stepper falls
down. It cannot detect if the electronics section is
working and responding to the code.
For instance it cannot detect switch-bounce or if
the 7-segment display is showing the correct
segments.
Secondly, delays take a long while to execute and
either the emulator skips over them or takes a long
time to execute.
I have used a single-stepper and emulator for the
PIC and these are some of the problems it did not
solve.
By far the best method is MINE. It's simple and it
works every time. It's back to basics.
If you are having trouble detecting if the micro is
advancing though a sub-routine correctly, add an instruction that takes the
micro to a small routine that outputs a tone to a
piezo diaphragm or blinks a LED.
Put a GOTO instruction, say before
a CALL instruction. If the LED blinks, the micro has
reached the instruction. Then put the GOTO after the
CALL. If the LED does not blink, the micro has not
come out of the sub-routine. It may be stuck in the
sub-routine or jumped to another address. Go to the
sub-routine and work your way through each line with
the GOTO concept.
It may be time-consuming but it is the only real way
to follow the actual progress of the
microcontroller. This approach was used to solve a
problem with the original tone routine in the
Alarm. The investigation solved the problem
and also showed the sub-routine was not
well-designed. A much simpler routine was put in
its place. So, the hands-on approach solved two
things at the same time.
A CRO was also used initially to check the quality
of the DTMF waveform. It appeared to be perfect on
the screen but was only being accepted by the
exchange 80% of the time. By changing the
wave-shaping components, the acceptance rose to 100%.
The difference between the two waveforms could not
be seen on the CRO, but a 8870 DTMF tone detector
detected the difference. This is another case of going
back to basics and using your knowledge of
electronics to improve the quality of a
waveform.
The point I am making is this . . .
All the tools of assistance for getting a project
up-and-running have been provided in the
articles on Talking
Electronics website. The only test equipment you
need is a multimeter (either analogue or digital)
and a Logic Probe. Don't dream: "If only I had
an emulator!" or "If only I had a CRO." You can do
it all with basics and that is what the Talking
Electronics
PIC course is all about. Building this project
and some of our other projects will show you how
things go together, so you can design your own
projects.
As I said above, one of the biggest problems is
working out the correct order for testing a project.
Things have to be done in the correct order and this
quite often requires stripping the project down to
the simplest circuit. In our case the first section
to work on was the DTMF tones. Once these were 100%
accepted by the exchange, the turn-on circuit and
opto-coupler sections could be added. Then the audio
amplifier had to be placed in parallel with the DTMF
section without affecting the quality of the
waveform of either the tones or the audio. This was
quite a challenge and even though the final
circuitry
is simple, a lot of testing had to be done to make
sure other designs were not better. The DTMF circuit
was loaded with capacitors and resistors to see if
the tone was still recognised by the exchange. This
way you know you have a margin-of-error and any
tolerances generated in the building of the project
will not affect the outcome.
As each problem was solved, the project got nearer
completion. By working with basics, the feeling is
the project is advancing.
With the Dialling Alarm, there were more than 10
things to sort out.
Producing digits on the 7-segment display
Detecting 4 buttons
Reading and writing to EEPROM
The DTMF tone - duration, amplitude, clarity,
getting 100% acceptance on the line,
The Darlington transistor
The audio amplifier, reducing hum, reducing
motor-boating, improving output amplitude, gating.
The tone detecting circuit - detecting a tone but
not detecting noise or talking
None of these would have been helped with an
emulator or CRO. There is too much circuitry
interdependence and the big problem with a CRO is
the introduction of hum when the earth clip is
connected to the
project.
If there is any magic package or device that speeds
up the process of development, I will let you know.
By adding some instructions to output to a display, you can see if the
micro is going past the code you are having trouble with.
We also suggest creating your program by using sub-routines from other
projects that are known to work correctly.
There is only one problem with an Emulator or Single-Stepper. They are
nice, but relying on them is a crutch.
You tend to think they will solve your problems.
This is a dangerous misconception because, in most
cases the final solution will be to go back to
basics. They can be of assistance, but I am
going to show the real way to problem-solving is
using "tricks-of-the-trade."
The big problem with an emulator is INPUTS. If you
have a push button in a circuit, the emulator does
not carry out the operation of the push button.
The way to learn programming is to go through a
project that has been written by some one else and study each line of
code. You need to know two things. Firstly you need to know what each
instruction is doing and then you need to know why the instruction has
been used. In the Dial Alarm-2 program we have used a very simple
format called linear programming.
The sub-routines are long and very few calls are made. In addition we
have used very few Boolean commands and the simplest way to convert from
a display value to a numerical equivalent.
24/8/09
|