Shooting Ahead
Looking at a PROGRAM
Page 4
Before we start the course, let's shoot ahead and see how to tackle a simple
statement.
It's nice to know what is ahead and what you are working towards.
A request came in last week for help with a PIC program. The writer asked:
Hi, I am trying to build a project that works like an answering
machine. I am having problems programming the
PIC16F84 to get it to do
this:
Do "W". Check for "X"
to happen. If "X" does not happen in "Y" time do
"Z".
I hope you understand what I am asking.
This is a typical requirement when
writing almost
any program and although we don't know enough from the statement to create a complete program (or sub-routine) we can explain how to go about the
task.
There are two things you must remember:
1. The microcontroller has an unbuilt oscillator (called a clock) that operates all
the time. This oscillator increments a file called the Program Counter and causes the micro to keep advancing down the program. The program
may have loops and jumps that make the micro go up and down the program but
this is still "advancing down the program."
2. You should not create a program that makes the micro sit in a
loop, waiting for a particular event to occur.
The microcontroller can only do one thing at a time and if it is sitting in a
loop, it cannot be outputting to a display or carrying out other operations.
The program must be structured so that it checks or "poles" an input
line to see if the line has changed state. If you check the line on a regular
basis, the event will not be missed.
The program to satisfy the above statement is called a sub-routine. It
is called from the "Main" routine.
The first thing to do is prepare a flow diagram:
Flow diagram for "X", "Y" and "Z"
The counter/timer section "poles" or
"loops" an input line looking for a change. This is done many times
and forms a TIME DELAY. The counter/timer is loaded with a value and decrements
the count to zero. When the counter/timer is zero, the program executes the
"time-up" path.
Do "W"
AA
BB
Do "Z"
Delay
Del2
Del3
|
MOVLW 40h
MOVWF 1Ch
BSF 06h,0
CALL Delay
BCF 06,0
CALL Delay
BTFSS 06,1
GOTO BB
RETLW 00
DECFSZ 1Ch
GOTO AA
BSF 06,1
CALL Delay
BCF 06,1
RETLW 00
MOVLW 80h
MOVWF 1Ah
MOVLW 60h
MOVWF 1Bh
DECFSZ 1Bh
GOTO Del3
DECFSZ 1Ah
GOTO Del2
RETLW 00 |
;Load count-down file 1C
;Make RB0 HIGH
;Select Page0
;Make RB0 LOW
;Is input "X" HIGH?
;Yes. Return to Main
;Decrement count-down file
;Time not up. Do again
;Time up. Do "Z"
;Make RB1 LOW
;Return to Main
;Load a value into file 1A
;Load a value into file 1B
;Return to the sub-routine above
|
Program for "X", "Y" ,
"Z" statement above |
The time "Y" is made
up of the loops in the count-down file 1C and includes the length of time created by the
Delay.
The length of time taken by each of the operations "W" and
"Z" can be adjusted by the Delay sub-routine.
At the moment you don't know anything about the instructions we have used in
the program above or how to read
them but you can see approximately how may lines of code are required to
carry out the statement above.
The advantage of working in a low level language such as the instructions in
the program above, is the ability to tell the
microcontroller exactly what you want it to do, in the simplest, fastest
way. Producing a program in Machine Code or Mnemonic code is the closest you
can get to the type of instructions that are directly read by the
microcontroller and this is called a low-level language. A high level
language is an interpreter language such as BASIC or C++.
There are a number of "tricks" in the program above and these are
generally the placement of an instruction in an unusual place. One of
these is the placement of CALL Delay as the 6th instruction.
AA
|
CALL Delay
BTFSS 06,1
GOTO BB
RETLW 00
DECFSZ 1Ch |
;Is input "X" HIGH?
;Yes. Return to Main
;Decrement count-down file
|
This allows the Delay sub-routine to be called during each
loop of the counter/timer. Later in the course you will be shown the meaning of each
instruction and you will see why the only place for the CALL Delay
instruction is before decrementing the count file.
The other point you can observe at this early stage is the simplicity of the
instructions. Each letter stands for a word. For example, BTFSS 06,1
reads: Test Bit 1 of File 06 and Skip
if it is Set (1). The letters making up the instruction are called a Mnemonic and this simply means a "set of letters that are easy
to remember."
We cannot cover any more of the program until the instructions are fully
explained.
That's what we will do on the next set of pages:
Page 5: The
PIC12C508A Instruction-Set.
Page 6: The
PIC16F84 Instruction-Set.
Page 7: The
Instruction-Set Explained
To Top
|