Simple A/D for MCUs without Built-In A/D Converters

Order this document
as AN477/D
Freescale Semiconductor
AN477
Simple A/D for MCUs without built-in
A/D converters
By Åke Webjörn,
Freescale AB,
Sweden
Freescale Semiconductor, Inc...
1.0 Introduction
Non-critical measurement of resistance is needed in many applications. Examples are temperature, light,
pressure and position measurements using devices where the sensor is a variable resistance. Those
measurements can be made at minimal cost using existing MCUs, if a simple A/D-converter is added.
This application note describes a method of measuring an unknown resistance with an MC68HC05 type
MCU that does not have a built-in analog-to-digital converter. Both the theoretical and the practical aspects
of the method are covered.
The method requires two digital I/O lines on the MCU, one external capacitor, and two known and one
unknown external resistors. The values of the external components can be selected for the desired
performance. In the example outlined below, typically 6 bits of resolution can be achieved. The size of the
entire program is about 450 bytes, with the actual A/D-conversion taking 250 bytes.
The MCU used in the example is the MC68HC705J2. For more information on this device, see the technical
reference manual, MC68HC705J2/D.
2.0 Background
If the MCU had a digital input port with an accurately defined threshold level between high and low voltage,
then the task of measuring an external resistance would be quite simple. As this is not the case, it is
necessary to use an extra calibration cycle where a fixed resistor is used instead of an accurate reference
voltage. In this method the unknown resistor is compared with the known one. Thus a reference resistance
is measured and the calibration value is stored. Then, the actual measurement is made and finally, the
result is modified according to the calibration value.
2.1 System design
See Figure 1 for details of the system schematic.
– There are four I/Os used on the MCU.
– ADCTL is used both as an output and as an input.
– ADINP is always a high impedance input.
– Two outputs are used for debugging the system.
– SCITR is used to transmit the result serially.
– SYNC is a triggered signal for an external oscilloscope.
© Freescale Semiconductor, Inc., 2004. All rights reserved.
Freescale Semiconductor, Inc.
37 pF
1
4 MHz
MC68HC705J2
4.7 MΩ
2
13
SYNC
37 pF
RS232
Driver
ADCTL 15
ADINP
VDD
Rx
R2
14
16
SCITR
R1
Freescale Semiconductor, Inc...
C
R1 = R2 = Rx(max)
Figure 1 Block diagram
As stated above, the conversion is divided into a calibration phase and a measurement phase, as shown in
Figure 2.
Calibration phase
The calibration phase finds the R1*C time constant. This is done by first discharging the external capacitor
C by pulling ADCTL low. Notice that the resistors Rx + R2 have no effect at all at this time.
Measurement phase
Then ADCTL is pulled high towards Vdd to charge the capacitor C. The time, Tc depending on R1*C, is
measured to reach the threshold voltage, Vref, of ADINP. When the input signal passes the threshold level,
the elapsed time is measured and stored. In other words the calibration time is:
Tc = R1 * C * ln(Vdd/(Vdd - Vref))
After the measurement, ADCTL is pulled low to discharge the capacitor C again.
The second measurement step makes the ADCTL go high impedance. The capacitor C immediately starts
to charge. The time taken is given by the formula:
Tm = (R1 + R2 + Rx) * C * ln(Vdd/(Vdd - Vref))
The time to reach the threshold voltage is measured again.
To make things simple we shall set R1 and R2 each equal to R.
Tm = (R + R + Rx ) * C * ln(Vref/(Vref - Vr)
The final result is calculated to get correct scaling.
Tf = Tm - 2 * Tc
2
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
Substitute with the values calculated before and replace the ln(Vref/(Vref - Vr) with K.
Tf = ((2 * R + Rx) - 2 * R) * K
Tf = Rx * K
Which gives the final result
Rx = Tf/K
Vdd
Freescale Semiconductor, Inc...
Calibration
Settle
Measurement
Settle
Vref
Time
SYNC
Figure 2 Signal waveform
2.2 Assumptions
The conversion method is based on the following assumptions:
– The I/O lines can be changed from input to output under software control.
– The digital inputs are high impedance with low leakage current.
– The digital output will source and sink current very close to the supply voltage and ground.
– The MCU is fast enough to handle calculations in the background.
AN477/D
For More Information On This Product,
Go to: www.freescale.com
3
Freescale Semiconductor, Inc.
3.0 Practical design
The MC68HC705J2 device is available in a 20-pin package. It has a built-in timer system and two 8-bit I/O
ports. The timer system comprises a free-running 8-bit timer with a readable Timer Control Register (TCR).
So if a 4 MHz crystal is used, the TCR runs at 500 kHz. As the counter is 8-bits long, it will overflow about
every 5 mS. By using a Timer Overflow Interrupt (TOI) it is easy to let the program extend the counter to
16-bits. This gives the software timer register an overflow value of 1.28 S.
Two I/O pins, ADCTL and ADINP, are used for the resistance measurement. See Figure 1.
The third pin, SCITR, is used to transmit the measured values on a 9600 baud RS232 line to an external
computer.
Freescale Semiconductor, Inc...
Pin four is an I/O pin that is used to output a SYNC pulse which can be used to examine the accuracy of
the system.
3.1 Component selection
We can now calculate realistic values for the components.
To avoid overflow in the timer register, the external RC-timing network must be limited to the maximum
time. The RC-equation is as follows:
(Rx + R1 + R2) * C * ln(Vdd/(Vdd-Vref)) < Tmax mS
To make things a bit simpler, use the value R for the maximum resistance value. Also use maximum Vref
and Tmax values. In other words:
Rx =< R1 = R2 = R, Vref = 0.7 * Vdd and Tmax = 1.28 S
gives the values with
3 * RC * ln(Vdd /(Vdd-0.7Vdd)) = 3 * RC * ln(3.33) =
3.6 * RC < 1.28 S
RC < 355 mS
Two limits apply for the selection of the resistors R.
The output impedance of the I/O port should be much smaller than the load resistance R. But if R is made
too large then leakage current from the input port will affect the result. From Figure 3 it can be seen that
the MCU will easily source in excess of 1 mA close to the power and ground rails.
R should then be larger than :
Vcc/Icc > 5 V/1 mA = 5 KΩ.
Let’s set R to four times as large, or 20 KΩ.
The maximum leakage current from an I/O pin is specified to be less than 10 µA. With a 20 KΩ resistor, the
induced error is maximum 0.2 V. This means that C should be in the range
C < 355 mS/R = 355 mS/20 KΩ = 17.8 µF
4
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
If the counter uses only the lowest 8-bits to count, we have:
17.8 µF/256 < C < 17.8 µF
0.07 µF < C < 17.8 µF
Note that capacitor C can vary a lot, but if it is small, the time measurement becomes more critical if high
resolution is required. So, for the following experiments, a 0.22 µF capacitor was selected.
Vdd -Voh
mV
Freescale Semiconductor, Inc...
800
85 C
700
600
500
- 40 C
400
300
200
Vdd = 5.0 V
100
Ioh
-1
-2
-3
-4
-5
mA
Figure 3 Typical high driver characteristic
3.2 Software
The software is written to be easy to understand. It is divided into three modules:
– MAC05.ASM
Macro routines
– UTIL05.ASM
General utilities
– RESADC.ASM
Main program
MAC05.ASM contains a set of simple macros for handling 16-bit calculations. The code can easily be
optimised for speed or for code density.
UTIL05.ASM consists of a couple of subroutines. They are used by the debugging part of the program.
RESADC.ASM contains the main loop and the specific routines used.
The flow of the program is shown in Figure 4.
AN477/D
For More Information On This Product,
Go to: www.freescale.com
5
Freescale Semiconductor, Inc.
start:
Initialise
main:
Calibrate
Measure
Freescale Semiconductor, Inc...
Calculate
Wait
Figure 4 Program flow
At power up the MCU starts to execute at the label ‘start’. After a few instructions to set up the peripherals,
the program enters the ‘main’ loop.
First, it calls ‘calib’ to calibrate the system with the known external resistor R1. This is done by pulling
ADCTL high and measuring the time until ADINP goes high. The time is stored in the RAM cell called ‘ref’.
calib:
Settlelo()
Clrtime()
ADCTL = 1
Loop until ADINP = 1
Gettime(ref)
Second, it does a ‘measur’ to get the unknown value Rx. . First ADCTL is pulled into high-impedance state.
After a while ADINP will change. The time until this change is called ‘res’ and represents R1 + R2 + Rx.
measur:
Settlelo()
Clrtime()
Inport(ADCTL)
Loop until ADINP = 1
Gettime(res)
Third, it calculates the result in the routine ‘calc’ and outputs the final value.
So the ‘calc’ routine begins with scaling the result:
calc:
res = res/2 - ref
Then it applies automatic gain control by shifting ref and res until the most significant bit is set in ref.
Repeat
shl16 res
shl16 ref
Until MSB in ref is set
6
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
Divide by 256 and multiply with the fullscale factor. In the program example fullscale is set to 100.
res = res/256 * fullscale
To obtain final result, divide by ref.
final = res/ref
Now let a macro display the result.
msgdec(final, finmsg)
The result is as shown in Figure 5.
Freescale Semiconductor, Inc...
delay(100)
jmp
main
At the end there is a short delay before the program restarts. The complete program is given in listing (1).
REF = 053B RES = 0B50 FINAL = 015
REF = 053B RES = 0B51 FINAL = 015
REF = 053C RES = 0B51 FINAL = 015
Figure 5 Output example
3.3 Performance
Figure 6 shows the typical performance of the system. The conversion is quite linear in the 6- to 7-bit range
and there is an offset error of about 5 %. This offset error is not affected by the values of the external
components. The reason is that the ADCTL pin will not go higher than typically 4.9 V during the calibration
phase which gives this offset value.
Measured value, %
100
R = 20 KΩ
90
Ideal result
80
70
60
50
Actual result
40
30
20
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Resistance, Rx
KΩ
Figure 6 Measurement of variable resistance, Rx
AN477/D
For More Information On This Product,
Go to: www.freescale.com
7
Freescale Semiconductor, Inc.
3.4 Suggested improvements
Below we outline two methods for dealing with the problem of the offset voltage.
3.4.0 Improvement A
Let’s see what happens when a small interior resistor, Rc is included in the output calibration driving
circuitry of the MC68HC705J2.
Tc = (R + Rc) * C * ln(Vdd/(Vdd-Vref))
To eliminate Rc , a resistor Rm is included in the measuring circuitry. See Figure 7.
Freescale Semiconductor, Inc...
Tm = (R + R + Rx + Rm) * C * ln(Vdd/(Vdd-Vref))
MC68HC705J2
New resistor
ADCTL 15
ADINP 14
Rx
Rm
R2
R1
C
R1 = R2 < Rm + Rx(max)
Figure 7 Block diagram with adjusted source impedance
Then put the result in the following equation and replace the timing figure with K.
Tf = Tm - 2 * Tc
Tf = ((2 * R + Rx + Rm) - 2(R + Rc)) * K
Tf = (Rx + Rm - 2 * Rc) * K
To eliminate the effect of Rc then
Rm = 2 * Rc
To find the resistance Rc, program the pin ADCTL high and connect an external resistance to ground. It
turns out that the internal resistance Rc is between 0.2 and 0.35 KΩ. This means that a small 2* Rc , or
0.4 to 0.7 KΩ resistor Rm is inserted in series with Rx. See Figure 8 for the result.
8
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
Measured value, %
100
R = 20 KΩ
Ideal result
90
80
70
60
50
Actual result
40
Freescale Semiconductor, Inc...
30
20
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Resistance, Rx
KΩ
Figure 8 Improvement A – extra external resistor, Rm = 680Ω
3.4.1 Improvement B
Another way to compensate for the drive characteristic of the output pin on the MC68HC705J2, is to use
an extra I/O pin, VDDCTL, instead of Vdd. See Figure 9. VDDCTL is made smart so it is idle during calibration
and active during measurement. Resistor R2 is not needed and is removed.
MC68HC705J2
VDDCTL
17
ADCTL 15
ADINP 14
Rx
R1
C
Figure 9 Block diagram with built-in source impedance
AN477/D
For More Information On This Product,
Go to: www.freescale.com
9
Freescale Semiconductor, Inc.
The timing figures turns out as follows:
Tc = (R + Rc) * C * ln(Vdd/(Vdd-Vref))
To eliminate Rc , a resistor Rm is included in the output normally used to supply Vdd.
Tm = (R + Rx + Rm) * C * ln(Vdd/(Vdd-Vref))
Then put the result in the following equation and replace the timing figure with K.
Tf = Tm - Tc
Tf = ((R + Rx + Rm) - (R + Rc)) * K
Freescale Semiconductor, Inc...
Tf = (Rx + Rm - Rc) * K
To eliminate the effect of Rc then
Rm = Rc
The new routine handles VDDCTL and also takes care of the final result. It is called RESADC1.ASM.
See program listing (2) and Figure 10.
Measured value, %
100
R = 20 KΩ
90
Ideal result
80
70
60
50
Actual result
40
30
20
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Resistance, Rx
KΩ
Figure 10 Improvement B – use of Vddctl
4.0 Conclusion
This application note shows that it is quite simple to add A/D conversion to measure resistance to
MC68HC05 microcomputer applications. Three solutions have been discussed, each of which has its own
advantages. These may provide some new ideas on how to solve the A/D converter problem.
Acknowledgements
The author acknowledges the help and assistance of his colleagues Peter McGinn, Ross Mitchell, Owe
Mellberg and Berndt Lehnert.
10
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
Freescale Semiconductor, Inc...
RESADC.LST
M6805 Portable Cross Assembler 0.05
MS-DOS/PC-DOS Page 1
Sun Mar 15 20:56:45 1992
Command line:
C:PASM05.EXE -d -l RESADC.lst RESADC.asm
Options list:
ON - b - Printing of macro definitions
ON - c - Printing of macro calls
ON - d - Placing of symbolic debugging information in COFF (changed)
OFF - e - Printing of macro expansions
ON - f - Printing of conditional directives
OFF - g - Printing of generated constants list
OFF - q - Expanding and printing of structured syntax
OFF - s - Printing of symbol table
OFF - u - Printing of conditional unassembled source
OFF - x - Printing of cross reference table
OFF - m - Suppress printing of error messages
ON - w - Printing of warning messages
OFF - v - Suppress printing of updated status
OFF - y - Enabling of sgs extensions
ON - o - Create object code
ON - Formatting of source line listing
Create listing file - l - RESADC.lst
Xdefs:
NONE
Xrefs:
NONE
Input file(s): RESADC.asm (250 lines)
mac05.asm (63 lines) util05.asm (257 lines)
Output file: RESADC.o
Listing file: RESADC.lst
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00001
00002
00003
S PC
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
OPT
OPT
LLE=132
MUL
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
11
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00005
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
S PC
P 0000
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
include mac05.asm
* Macro definition file for MC68HC05
0004
MACRO DEF
A DDR
inport
EQU
4
* data direction register offset
MACR
BCLR
\0,\1+DDR
ENDM
MACRO DEF
outport
MACR
BSET
! make \0 an output pin
\0,\1+DDR
ENDM
MACRO DEF
MACRO DEF
MACRO DEF
MACRO DEF
MACRO DEF
MACRO DEF
add16
sub16
cmp16
shl16
shr16
msghex
MACR
LDA
ADD
STA
LDA
ADC
STA
ENDM
\1+1
\2+1
\0+1
\1
\2
\0
MACR
LDA
SUB
STA
LDA
SBC
STA
ENDM
\1+1
\2+1
\0+1
\1
\2
\0
MACR
LDA
SUB
LDA
SBC
ENDM
\0+1
\1+1
\0
\1
S PC
!\0:=\1+\2
! \0:=\1-\2
! \0 > \1 ?
MACR
LSL
ROL
ENDM
\0+1
\0
MACR
LSR
ROR
ENDM
\0
\0+1
MACR
LDX
M6805 Portable Cross Assembler 0.05 mac05.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
Page 3
#\1-msg
Page 4
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
JSR
xmitmsg
LDA
\0
JSR
tohex
LDA \0+1
JSR
tohex
ENDM
MACRO DEF
MACR
LDX
JSR
LDA
JSR
ENDM
msgdec
#\1-msg
xmitmsg
\0
todec
—continued overleaf—
12
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
S PC
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
*===============================================================
* Resistance measurement for HC705J2
*===============================================================
P 0000
0064
A fullscale EQU
A
A
A
A
A
A
A
0000
0000
0001
0001
0001
0001
0001
01
0001
0002
0003
0004
0005
A
A
A
A
A
A
A 0001
A 0002
01
0002
A portb
A key
A
A
A
A
A
A
0008
0008
0009
0009
0009
0009
A 0009
A
A
A
A
A
0090
0090
0091
0093
0095
Page 5
porta
pullup
scitr
adctl
adinp
sync
A
A
A
A
A
01
A tcr
A
A
A
A
* this determines the full scale result
ORG
RMB
EQU
EQU
EQU
EQU
EQU
$0
1
1
2
3
4
5
*
*
*
*
*
RMB
EQU
1
2
* key
* Timer registers
ORG
$8
tcsr
RMB
1
tof
EQU
7
rtif
EQU
6
tofe
EQU
5
rtie
EQU
4
01
0007
0006
0005
0004
01
02
02
01
100
RMB
1
*
*
*
*
*
pa1
pa2
pa3
pa4
pa5
pull up
sci transmitter
potentiometer control
potentiometer input
for oscilloscope sync
Timer Count Status Register
Timer Overflow Flag
Real Time Interrupt Flag
Timer OverFlow Enable
Real Time Interrupt Enable
* Timer Counter Register
*================================================================
* Start of RAM area
*================================================================
ORG
$90
time
RMB
1
* elapsed time in 0.5 mS div
ref
RMB
2
* time for rising signal to pass limit
res
RMB
2
* measured result
final
RMB
1
* 8 bits final result
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
13
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00044
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
S PC
A
A
A
A
A
A
A
A
A
A
Page 7
OPCO OPERANDS S LABEL
0096
0097
0098
0099
009a
009b
009b
009b
009b
009b
MNEMO OPERANDS COMMENT
include util05.asm
* Utility program for MC68HC05
01
01
01
01
01
0005
001e
003c
000d
000a
A
A
A
A
A
* SCI data
bitcount RMB
char
RMB
hex
RMB
decimal RMB
strptr
RMB
A
A
A
A
A
*===============================================================
*
Symbolic absolute values
*===============================================================
rc
EQU
5
* RC time constant in mS
del96
EQU
30
* bitwait for 9600 baud
stopbit EQU
2*del96 * two stop bits
cr
EQU
$0D
lf
EQU
$0A
1
1
1
1
1
*
*
*
*
*
bit counter for
tmp storage for
tmp storage for
tmp storage for
string pointer
transmit
transmit
tohex
todec
*================================================================
*
Start of ROM area
*================================================================
A 0700
A 0700 1f
A 0702 3c
A 0704 80
ORG
08
90
$700
*================================================================
*
Real time interrupt
*================================================================
* Function: increments the variable time at each interrupt
* Input: none
* Uses: time
* Output: none
* Note: runs every 2 mS with a 4 MHz clock
A realt
BCLR tof,tcsr *clear tof flag
A
INC
time
* time:=time+1
RTI
*================================================================
*
Bitwait delay routine
*================================================================
* Function: Delay for asynchronous transmission
* Input: delay in reg A
* Uses: none
* Output: none
* Note:
bitwait formula: bitwait = 32 + 6 * A cycles
*
bit time for 9600 baud is 104 µS or 208 cycles at 4 MHz
*
A = 30 gives a bit time of 106 µS, or an error of < 2%
*
minimum baudrate is about 1300 baud
A 0705 a6
1e
A bitwait
LDA
#del96
2 cycles
—continued overleaf—
14
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 util05.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
S PC
OPCO OPERANDS S LABEL
Page 8
MNEMO OPERANDS COMMENT
bitwait1
A 0707 4a
A 0708 26
A 070a 81
fd
A
A
A
A
070b
070d
070f
0711
b7
a6
b7
15
97
09
96
00
A
A
A
A
A
0713
0715
0717
0719
071b
ad
3a
27
36
25
f0
96
0c
97
04
DECA
BNE
RTS
0707
A
A
A
A
3 cycles
bitwait1 3
6
*=====================================================
*
transmit one character
*=====================================================
* Function: Transmit one character
* Input: character to transmit in reg A
* Uses: char, bitcounter
* Output: none
* Note:
transmit
STA
char
LDA
#9
STA
bitcount
BCLR scitr,porta send start bit
A 071d 15
A 071f 20
00
f2
* transmit one
0705 tra3
BSR
A
DEC
0725
BEQ
A
ROR
0721
BCS
*
*
A
BCLR
0713
BRA
A 0721 14
A 0723 20
00
ee
A tra1
0713
BSET
BRA
scitr,porta or send 1
tra3
A
A
A
A
00
dc
da
A tra2
0705
0705
BSET
BSR
BSR
RTS
scitr,porta send stop bit
bitwait
bitwait
0725
0727
0729
072b
A 072c
A 0733
14
ad
ad
81
20
00
bit
bitwait
bitcount
tra2
char
tra1
6
5
3
5
3
----32 (see bitwait routine)
scitr,porta send 0
tra3
*================================================================
* Transmit ROM message
*================================================================
* Function: Transmit message stored in ROM
* Input: X contains offset in msg area
* Uses: strptr
* Output: none
* Note: the message is terminated with 0
msg
A refmsg
FCC
‘ REF = ‘
A
FCB
0
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
15
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 util05.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
S
A
A
A
A
A
A
PC
OPCO OPERANDS
0734
20
073b
00
073c
20
0744
00
0745
20
074d
00
S
A
A
A
A
A
A
LABEL
resmsg
t2himsg
t2lomsg
Page 9
MNEMO
FCC
FCB
FCC
FCB
FCC
FCB
OPERANDS COMMENT
‘ RES = ‘
0
‘ T2HI = ‘
0
‘ T2LO = ‘
0
A 074e
A 0757
20
00
A finmsg
A
FCC
FCB
‘ FINAL = ‘
0
A 0758
A 0759
A 075a
0d
0a
00
A nlmsg
A
A
FCB
FCB
FCB
cr
lf
0
A 075b bf
9a
A xmitmsg
STX
strptr
A
A
A
A
A
A
A
072c
09
070b
9a
9a
f2
xmitmsg2
075d
0760
0762
0765
0767
0769
076b
d6
27
cd
3c
be
20
81
A 076c ae
A 076e 5c
A 076f a0
A 0771 24
2f
64
fb
A
076b
A
A
A
075d
LDA
BEQ
JSR
INC
LDX
BRA
xmitmsg1 RTS
msg,X
xmitmsg1
transmit
strptr
strptr
xmitmsg2
*
*
*
*
*
get character
done if 0
else send one character
move pointer
get pointer to X
*================================================================
* Convert to decimal
*================================================================
* Function: Transmits byte as a 3 digit decimal value
* Input: A contains byte to convert
* Uses: decimal
* Output: none
A todec
LDX
#’0’-1
* WHILE A > 0 DO
todec1
INCX
A
SUB
#100
076e
BCC
todec1
A
A
A
A
0773
0775
0777
0778
ab
b7
9f
cd
64
99
A
A
070b
A
A
A
A
A
A
A
A
077b
077d
077f
0780
0782
0784
0786
b6
ae
5c
a0
24
ab
b7
99
2f
A
A
0a
fb
0a
99
A
077f
A
A
todec2
ADD
STA
TXA
JSR
#100
decimal
LDA
LDX
INCX
SUB
BCC
ADD
STA
decimal
#’0’-1
* adjust A
* save what is left
transmit * transmit 100:s
#10
todec2
#10
decimal
—continued overleaf—
16
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 util05.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
S PC
OPCO OPERANDS S LABEL
A 0788 9f
A 0789 cd
A
A
A
A
A
A
A
078c
078e
0790
0791
0793
0795
0796
b6
ae
5c
a0
24
9f
cd
A 0799 a6
A 079b cd
A 079e 81
A 079f
070b
A
99
2f
A
A
01
fb
A
0790
MNEMO OPERANDS COMMENT
TXA
JSR
todec3
Page 10
transmit * transmit 10:s
LDA
LDX
INCX
SUB
BCC
TXA
JSR
decimal
#’0’-1
LDA
JSR
RTS
#’ ‘
transmit * transmit ‘ ‘
#1
todec3
070b
A
20
070b
A
A
30
*================================================================
* Convert to hexadecimal
*================================================================
* Function: Transmits byte as a 2 digit hexadecimal value
* Input: A contains byte to convert
* Uses: hex
* Output: none
A hexstr
FCC
‘0123456789ABCDEF’
A
A
A
A
A
A
A
A
07af
07b1
07b2
07b3
07b4
07b5
07b6
07b9
b7
44
44
44
44
97
d6
cd
98
A tohex
079f
070b
A
A
A
A
A
A
A
A
07bc
07be
07c0
07c1
07c4
07c7
b6
a4
97
d6
cd
81
98
0f
A
A
079f
070b
A
A
transmit * transmit 1:s
STA
LSRA
LSRA
LSRA
LSRA
TAX
LDA
JSR
hex
LDA
AND
TAX
LDA
JSR
RTS
hex
#$F
* save hex value
* shift right 4 times to get high nibble
* put result in x
hexstr,x * translate to ASCII
transmit * transmit result
* get hex value again
* mask low nibble
hexstr,x * translate to ASCII
transmit * transmit low nibble
*================================================================
* Delay routine
*================================================================
* Function: Uses the timer overflow interrupt to count time
* Input: A contains desired delay in 0,5 mS increments
* Uses: time
* Output: no registers are destroyed
* Note: because this routine is not synchronised with the realtime
*
interrupt there can be 0,5 mS jitter.
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
17
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 util05.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
S
A
A
A
A
A
A
PC
07c8
07ca
07cb
07cd
07cf
07d0
OPCO
3f
9a
b1
26
9b
81
OPERANDS S LABEL
90
A delay
90
fc
A delay1
07cb
MNEMO
CLR
CLI
CMPA
BNE
SEI
RTS
Page 11
OPERANDS COMMENT
time
enable interrupts
time
loop until A = time
delay1
turn off interrupts
*================================================================
* Get time
*================================================================
* Function: Delay for voltage on input capacitor to settle
* Input: X points at 16 bit result
* Uses: time
* Output: result in [X]
* Note: because the timer counter is clocked with 500 Hz
*
special adjustments to the result is needed
*
interrupts are disabled when leaving
*
The sync signal is for debugging only
A
A
A
A
A
A
07d1
07d3
07d4
07d6
07d9
07db
1b
9b
b6
0f
3c
4f
00
A
A
A
A
07dc
07de
07e0
07e1
e701
b6
90
f7
81
09
0803
90
A gettime
A
07dc
A
BCLR
SEI
LDA
BRCLR
INC
CLRA
sync,porta * pull sync signal low
* stop interrupts
tcr
* read timer counter register
tof,tcsr,gettime1 * if the tof is set
time
* then adjust time
* and clear A
STA
LDA
STA
RTS
1,X
time
,X
gettime1
A
A
A
A
A
A
A
07e2
07e4
07e6
07e9
07eb
07ed
07ee
3f
1f
0f
1f
1a
9a
81
90
08
08fd
08
00
A
A
A
07e6
A
A
* store low result
* get high byte
* and store it as well
*================================================================
* Synchronise with time
*================================================================
* Function: Returns when the timer counter overflows
* Input: none
* Uses: time
* Output: none
* Note: interrupts are enabled when leaving
clrtime
CLR
time
* time:= 0
BCLR tof,tcsr *clear tof
BRCLR tof,tcsr,* *loop until tof is set
BCLR tof,tcsr *clear tof
BSET sync,porta * pull sync high
CLI
* enable interrupts
RTS
* and return
—continued overleaf—
18
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
Page 12
S PC
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
*================================================================
* Settle measurement voltages
*================================================================
* Function: Delay for voltage on input capacitor to settle
* Input: none
* Uses: adctl, delay
* Output: none
* Note: three entry labels depending on desired function
*
interrupts are disabled when leaving
*
modify the rc EQU to get sufficient delay
settlehi
A 07ef 16
00
A
BSET adctl,porta * pull adctl low
A 07f1 20
02
07f5
BRA
settle0
settlelo
A 07f3 17
00
A
BCLR
adctl,porta * pull adctl low
settle0
MACRO INV
A 07f7 a6
A 07f9 ad
A 07fb 81
64
cd
A
A
A
A
A
07fc
07fe
0800
0801
0803
e601
b0
94
f6
b2
93
25
07
A
A
A
A
0805
0806
0808
080a
f6
b7
93
e601
b7
94
outport adctl,porta * make adctl an outport
A settle
07c8
LDA
BSR
RTS
#rc*2*10 *wait 10 * RC
delay
*================================================================
* Check limits
*================================================================
* Function: IF res > [x] THEN res := [x]
* Input: X points at 16 bit value to check against res
* Uses: res
* Output: none
limit
LDA
1,x
A
SUB
res+1
LDA
,x
A
SBC
res
080c
BCS
limit1
LDA
STA
LDA
STA
A
A
,x
res
1,x
res+1
limit1
A 080c 81
RTS
*================================================================
* Calibrate
*================================================================
calib
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
19
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
Page 13
S PC
OPCO OPERANDS S LABEL
A 080d cd
07f3
A
MNEMO OPERANDS COMMENT
JSR
settlelo * wait for input to stabilise lo
A 0810 cd
A 0813 16
A 0815 ae
JSR
BSET
LDX
07e2
00
91
A
A
A
A 0817 09
00fd
A 081a cd
07d1
A 081d 17
00
MACRO INV
A 082e 81
0817
A
A
A 082f cd
07f3
clrtime * synchronise with clock
adctl,porta * pull adctl hi
#ref
* prepare to get reference value
BRCLR adinp,porta,* * loop until adinp goes high
JSR
gettime
BCLR adctl,porta * pull adctl lo, not needed !!!!!!!
msghex ref,refmsg
RTS
*================================================================
* Measure
*================================================================
measure
A
JSR
settlelo * wait for input to stabilise lo
A 0832 cd
07e2
MACRO INV
A 0837 ae
93
A
A 0839 09
00fd
A 083c cd
07d1
A 083f 17
00
MACRO INV
MACRO INV
A 0852 81
0839
A
A
A
JSR
clrtime * synchronise with clock
inport adctl,porta * release adctl
LDX
#res
* prepare to get result
BRCLR adinp,porta,* * loop until adinp goes high
JSR
gettime * get result
BCLR adctl,porta * not needed !!!!!!!!!!
outport adctl,porta * make adctl an outport again, ???
msghex res,resmsg * transmit result
RTS
*================================================================
* Calculate final result
*================================================================
* measurement is ended, now adjust results
calc
MACRO INV
A 0857 ae
91
A 0859 cd
07fc
*res:=res - 2 * ref
shr16 res
A
LDX
#ref
A
JSR
limit
MACRO INV
A 0868 24
A 086a 3f
A 086c 3f
04
93
94
MACRO INV
* if res < ref then res := ref
sub16 res,res,ref
086e
A
A
* if res < 0 then res := 0
BCC
calc3
CLR
res
CLR
res+1
* shift ref and res until msb set in ref
calc3
shl16 res
—continued overleaf—
20
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
S PC
OPCO OPERANDS S LABEL
MACRO INV
A 0876 2a
f6
086e
Page 14
MNEMO OPERANDS COMMENT
shl16 ref
shift until msb set
BPL
calc3
b6
ae
42
b7
bf
93
64
94
93
* res:= res/256 * fullscale
LDA
res
LDX
#fullscale
MUL
A
STA
res+1
A
STX
res
A 0881 a6
A 0883 b7
ff
95
A
A
A
A
A
A
91
A
A
A
A
A
A
0878
087a
087c
087d
087f
0885
0887
0888
088a
b6
44
b7
3f
92
91
A
A
* final := -1
LDA
STA
#-1
final
* ref:= ref/256
LDA
ref
lsra
A
STA
ref+1
A
CLR
ref
A 088c 3c
95
MACRO INV
A 089a 24
f0
* final := res/ref
calc5
A
INC
final
sub16 res,res,ref ref:=ref-result
088c
BCC
calc5
MACRO INV
A 08a6 81
msgdec final,finmsg
RTS
******************************************************
*
Main program loop
******************************************************
start
MACRO INV
MACRO INV
MACRO INV
MACRO INV
MACRO INV
A 08b1 1a
08
inport adinp,porta *set up all ports
inport key,portb
outport adctl,porta
outport scitr,porta
outport sync,porta
BSET tofe,tcsr *enable timer interrupt
A
main
A 08b3 cd
080d
A
JSR
calib
* calibrate
A 08b6 cd
082f
A
JSR
measure
* measure
A 08b9 cd
0853
A
JSR
calc
A 08bc ae
2c
A
LDX
#nlmsg-msg * new line
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
21
Freescale Semiconductor, Inc.
(RESADC.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 RESADC.asm
Sun Mar 15 20:56:45 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
Page 15
S PC
OPCO OPERANDS S LABEL
A 08be cd
075b
A
MNEMO OPERANDS COMMENT
JSR
xmitmsg
A 08c1 a6
A 08c3 cd
A 08c6 20
LDA
JSR
BRA
64
07c8
eb
A
A
08b3
#100
delay
main
**************************************************************
A 0f00
A 0f00
A
A
A
A
0ff8
0ff8
0ffe
0ffe
00
A mor
0700
A
08a7
A
ORG
FCB
$F00
$0
ORG
FDB
ORG
FDB
$FF8
realt
$FFE
start
*705J2 mode, no COP
END
Total number of errors: 0
Total number of warnings: 0
Total number of lines: 538
Number of bytes in section ASCT: 476
Number of bytes in program: 476
22
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
RESADC1.LST
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 resadc1.asm
Sun Mar 15 21:42:34 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00020
00021
00022
00023
S PC
OPCO OPERANDS S LABEL
Page 5
MNEMO OPERANDS COMMENT
*===============================================================
* Resistance measurement for HC705J2
* Optional version
*===============================================================
P 0000
0064
A fullscale EQU
A
A
A
A
A
A
A
0000
0000
0001
0001
0001
0001
0001
01
0001
0002
0003
0004
0005
A
A
A
A
A
A
A 0001
A 0002
01
0002
A portb
A key
A
A
A
A
A
A
0008
0008
0009
0009
0009
0009
A 0009
A
A
A
A
A
0090
0090
0091
0093
0095
porta
pullup
scitr
adctl
adinp
sync
A
A
A
A
A
01
A tcr
A
A
A
A
* this determines the full scale result
ORG
RMB
EQU
EQU
EQU
EQU
EQU
$0
1
1
2
3
4
5
*
*
*
*
*
RMB
EQU
1
2
* key
* Timer registers
ORG
$8
tcsr
RMB
1
tof
EQU
7
rtif
EQU
6
tofe
EQU
5
rtie
EQU
4
01
0007
0006
0005
0004
01
02
02
01
100
RMB
1
*
*
*
*
*
pa1
pa2
pa3
pa4
pa5
pull up
sci transmitter
potentiometer control
potentiometer input
for oscilloscop sync
Timer Count Status Register
Timer Overflow Flag
Real Time Interrupt Flag
Timer OverFlow Enable
Real Time Interrupt Enable
* Timer Counter Register
*================================================================
* Start of RAM area
*================================================================
ORG
$90
time
RMB
1
* elapsed time in 0.5 mS div
ref
RMB
2
* time for rising signal to pass limit
res
RMB
2
* measured result
final
RMB
1
* 8 bits final result
*================================================================
*
Start of ROM area
*================================================================
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
23
Freescale Semiconductor, Inc.
(RESADC1.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 resadc1.asm
Sun Mar 15 21:42:34 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
Page 11
S PC
OPCO OPERANDS S LABEL
MNEMO OPERANDS COMMENT
*================================================================
* Settle measurment voltages
*================================================================
* Function: Delay for voltage on input capacitor to settle
* Input: none
* Uses: adctl, delay
* Output: none
* Note: three entry lables depending on desired function
*
interrupts are disabled when leaving
*
modify the rc EQU to get sufficient delay
settlehi
A 07ef 16
00
A
BSET adctl,porta * pull adctl low
A 07f1 20
02
07f5
BRA
settle0
settlelo
A 07f3 17
00
A
BCLR
adctl,porta * pull adctl low
settle0
MACRO INV
A 07f7 a6
A 07f9 ad
A 07fb 81
64
cd
A
A
A
A
A
07fc
07fe
0800
0801
0803
e601
b0
94
f6
b2
93
25
07
A
A
A
A
0805
0806
0808
080a
f6
b7
93
e601
b7
94
outport adctl,porta * make adctl an outport
A settle
07c8
LDA
#rc*2*10 *wait 10 * RC
BSR
delay
RTS
*================================================================
* Check limits
*================================================================
* Function: IF res > [x] THEN res := [x]
* Input: X points at 16 bit value to check against res
* Uses: res
* Output: none
limit
LDA
1,x
A
SUB
res+1
LDA
,x
A
SBC
res
080c
BCS
limit1
LDA
STA
LDA
STA
A
A
,x
res
1,x
res+1
limit1
A 080c 81
RTS
*================================================================
* Calibrate
*================================================================
calib
—continued overleaf—
24
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC1.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 resadc1.asm
Sun Mar 15 21:42:34 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
S PC
Page 12
OPCO OPERANDS S LABEL
MACRO INV
A 080f cd
07f3
A
MNEMO OPERANDS COMMENT
inport pullup,porta *<- let pullup float
JSR
settlelo * wait for input to stabilise lo
A 0812 cd
A 0815 16
A 0817 ae
JSR
BSET
LDX
07e2
00
91
A
A
A
A 0819 09
00fd
A 081c cd
07d1
A 081f 17
00
MACRO INV
A 0830 81
0819
A
A
A 0831 cd
07f3
clrtime * syncronize with clock
adctl,porta * pull adctl hi
#ref
* prepare to get reference value
BRCLR adinp,porta,* * loop until adinp goes high
JSR
gettime
BCLR adctl,porta * pull adctl lo, not needed !!!!!!!
msghex ref,refmsg
RTS
*================================================================
* Measure
*================================================================
measure
A
JSR
settlelo * wait for input to stabilise lo
A 0834 cd
07e2
MACRO INV
MACRO INV
A 083b 12
00
A 083d ae
93
A
A 083f 09
00fd
A 0842 cd
07d1
MACRO INV
MACRO INV
MACRO INV
A 0858 81
083f
A
A
A
JSR
clrtime * syncronize with clock
inport adctl,porta * release adctl
outport pullup,porta *<- change
BSET pullup,porta *<- set direction
LDX
#res
* prepare to get result
BRCLR adinp,porta,* * loop until adinp goes high
JSR
gettime * get result
inport pullup,porta *<- change
outport adctl,porta * make adctl an outport again, ???
msghex res,resmsg * transmit result
RTS
*================================================================
* Calculate final result
*================================================================
A 0859 ae
A 085b cd
91
07fc
* measurement is ended, now adjust results
calc
*
shr16 res
A
LDX
#ref
A
JSR
limit
* if res < ref then res:= ref
*res:=res - ref
MACRO INV
MACRO INV
A 086e 0f
A 0871 3f
9304
93
<- change
sub16 res,res,ref
shr16 res
0875
A
* if res < 0 then res := 0
BRCLR 7,res,calc3
CLR
res
—continued overleaf—
AN477/D
For More Information On This Product,
Go to: www.freescale.com
25
Freescale Semiconductor, Inc.
(RESADC1.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 resadc1.asm
Sun Mar 15 21:42:34 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
S PC
OPCO OPERANDS S LABEL
A 0873 3f
94
A
MACRO INV
MACRO INV
A 087d 2a
f6
Page 13
MNEMO OPERANDS COMMENT
CLR
res+1
* shift ref and res until msb set in ref
calc3
shl16 res
shl16 ref
shift until msb set
0875
BPL
calc3
b6
ae
42
b7
bf
93
64
94
93
* res:= res/256 * fullscale
LDA
res
LDX
#fullscale
MUL
A
STA
res+1
A
STX
res
A 0888 a6
A 088a b7
ff
95
A
A
A
A
A
A
91
A
A
A
A
A
A
087f
0881
0883
0884
0886
088c
088e
088f
0891
b6
44
b7
3f
92
91
A
A
* final := -1
LDA
STA
#-1
final
* ref:= ref/256
LDA
ref
lsra
A
STA
ref+1
A
CLR
ref
A 0893 3c
95
MACRO INV
A 08a1 24
f0
* final := res/ref
calc5
A
INC
final
sub16 res,res,ref ref:=ref-result
0893
BCC
calc5
MACRO INV
A 08ad 81
msgdec final,finmsg
RTS
******************************************************
*
Main program loop
******************************************************
start
MACRO INV
MACRO INV
MACRO INV
MACRO INV
MACRO INV
MACRO INV
A 08ba 12
00
A 08bc 1a
08
inport adinp,porta *set up all ports
inport key,portb
outport adctl,porta
outport scitr,porta
outport sync,porta
inport pullup,porta *!option
BSET pullup,porta *!option
BSET tofe,tcsr *enable timer interrupt
A
A
main
—continued overleaf—
26
For More Information On This Product,
Go to: www.freescale.com
AN477/D
Freescale Semiconductor, Inc.
(RESADC1.LST continued)
Freescale Semiconductor, Inc...
M6805 Portable Cross Assembler 0.05 resadc1.asm
Sun Mar 15 21:42:34 1992
Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
LINE
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
Page 14
S PC
OPCO OPERANDS S LABEL
A 08be cd
080d
A
MNEMO OPERANDS COMMENT
JSR
calib
* calibrate
A 08c1 cd
0831
A
JSR
measure
A 08c4 cd
0859
A
JSR
calc
A 08c7 ae
A 08c9 cd
2c
075b
A
A
LDX
JSR
#nlmsg-msg * new line
xmitmsg
A 08cc a6
A 08ce cd
A 08d1 20
64
07c8
eb
A
A
08be
LDA
JSR
BRA
#100
delay
main
* measure
**************************************************************
A 0f00
A 0f00
A
A
A
A
0ff8
0ff8
0ffe
0ffe
00
A mor
0700
A
08ae
A
ORG
FCB
$F00
$0
ORG
FDB
ORG
FDB
$FF8
realt
$FFE
start
*705J2 mode, no COP
END
Total number of errors: 0
Total number of warnings: 0
Total number of lines: 548
Number of bytes in section ASCT: 487
Number of bytes in program: 487
AN477/D
For More Information On This Product,
Go to: www.freescale.com
27
Freescale Semiconductor, Inc.
How to Reach Us:
Home Page:
www.freescale.com
Freescale Semiconductor, Inc...
E-mail:
[email protected]
USA/Europe or Locations Not Listed:
Freescale Semiconductor
Technical Information Center, CH370
1300 N. Alma School Road
Chandler, Arizona 85224
+1-800-521-6274 or +1-480-768-2130
[email protected]
Europe, Middle East, and Africa:
Freescale Halbleiter Deutschland GmbH
Technical Information Center
Schatzbogen 7
81829 Muenchen, Germany
+44 1296 380 456 (English)
+46 8 52200080 (English)
+49 89 92103 559 (German)
+33 1 69 35 48 48 (French)
[email protected]
Japan:
Freescale Semiconductor Japan Ltd.
Headquarters
ARCO Tower 15F
1-8-1, Shimo-Meguro, Meguro-ku,
Tokyo 153-0064
Japan
0120 191014 or +81 3 5437 9125
[email protected]
Asia/Pacific:
Freescale Semiconductor Hong Kong Ltd.
Technical Information Center
2 Dai King Street
Tai Po Industrial Estate
Tai Po, N.T., Hong Kong
+800 2666 8080
[email protected]
For Literature Requests Only:
Freescale Semiconductor Literature Distribution Center
P.O. Box 5405
Denver, Colorado 80217
1-800-441-2447 or 303-675-2140
Fax: 303-675-2150
[email protected]
Information in this document is provided solely to enable system and software
implementers to use Freescale Semiconductor products. There are no express or
implied copyright licenses granted hereunder to design or fabricate any integrated
circuits or integrated circuits based on the information in this document.
Freescale Semiconductor reserves the right to make changes without further notice to
any products herein. Freescale Semiconductor makes no warranty, representation or
guarantee regarding the suitability of its products for any particular purpose, nor does
Freescale Semiconductor assume any liability arising out of the application or use of
any product or circuit, and specifically disclaims any and all liability, including without
limitation consequential or incidental damages. “Typical” parameters which may be
provided in Freescale Semiconductor data sheets and/or specifications can and do
vary in different applications and actual performance may vary over time. All operating
parameters, including “Typicals” must be validated for each customer application by
customer’s technical experts. Freescale Semiconductor does not convey any license
under its patent rights nor the rights of others. Freescale Semiconductor products are
not designed, intended, or authorized for use as components in systems intended for
surgical implant into the body, or other applications intended to support or sustain life,
or for any other application in which the failure of the Freescale Semiconductor product
could create a situation where personal injury or death may occur. Should Buyer
purchase or use Freescale Semiconductor products for any such unintended or
unauthorized application, Buyer shall indemnify and hold Freescale Semiconductor
and its officers, employees, subsidiaries, affiliates, and distributors harmless against all
claims, costs, damages, and expenses, and reasonable attorney fees arising out of,
directly or indirectly, any claim of personal injury or death associated with such
unintended or unauthorized use, even if such claim alleges that Freescale
Semiconductor was negligent regarding the design or manufacture of the part.
For More Information On This Product,
Go to: www.freescale.com
AN477/D