FREESCALE AN1775

Freescale Semiconductor
Order this document
by AN1775/D Rev. 1
Freescale Semiconductor, Inc...
AN1775
Expanding Digital Input with an A/D Converter
By Brad Bierschenk
Freescale Applications Engineering
Austin, Texas
Introduction
This application note documents a method of extending digital input
using the analog-to-digital converter (ADC) of a microcontroller unit
(MCU).
Many MCU applications require digital input and arbitration. For
example, determining which key of a keypad was pressed. This is
commonly done by arranging switches in a matrix configuration,
connecting to a series of digital input pins, and reading a digital input
data register to determine which key was pressed. While this method is
easily implemented, it does require the use of an MCU’s parallel port
pins.
Some applications require all available bidirectional or input-only pins for
other purposes. In such a case, an alternate method of arbitrating
keypresses is desired. By using the ADC of an MCU connected to a
resistor ladder, user input can be more efficiently processed.
© Freescale Semiconductor, Inc., 2004. All rights reserved.
© Motorola, Inc., 1998
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
Freescale Semiconductor, Inc...
Background
Dedicated Input
A microcontroller typically receives user input through digital input pins.
The simplest implementation is a single switch directly connected to a
digital input pin. This is easy to realize, but is not the most efficient use
of resources, with one pin dedicated to one input. One port data bit
represents the state of one switch.
Matrix Input
Another method uses a keypad, a common element in embedded
systems. These are ordinarily arranged in a matrix, as shown in
Figure 1. In this case, the byte value of an entire port data register can
be polled to determine which key was pressed. This is more efficient, as
a 4 x 4 keypad can interface 16 keys with eight input pins.
Px0
Px1
Px2
Px3
Px4
Px5
Px6
Px7
Figure 1. Resistor Matrix Keypad Using Parallel Port Pins
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
Implementation
Freescale Semiconductor, Inc...
ADC Alternative
In many cases, input pins are at a premium. One can't always freely
assign input pins to the function of user input. A more efficient use of
microcontroller resources can be devised. One common feature of many
Freescale MCUs is the analog-to-digital converter, or ADC.
The ADC of a Freesca;e MCU usually features four to eight channels of
analog input, which is compared with a reference voltage and converted
to an 8-bit digital value. When a resistor ladder is connected to an analog
input through switches in each segment, the conversion result can be
used to arbitrate an input. This allows many keys to be interfaced with
one input pin, with only a little more software overhead. Figure 2 shows
such an implementation.
VDD
MCU
ADC
INPUT
PIN
VIn
Figure 2. Resistor Ladder Keys Using an Analog Input Pin
Implementation
ADC Operation
An MCU ADC typically has 8-bit precision. This means there are 28, or
256, distinguishable A/D inputs, including 0. The analog inputs are
converted to a binary number, which represents the magnitude of the
input voltage in relation to a reference voltage.
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
The range of an ADC is the difference between its high and low
reference voltages. This means an analog input between VREFH and
VREFL will convert to an 8-bit number, with VREFL converting to $00 and
VREFH converting to $FF.
Freescale Semiconductor, Inc...
The resolution, defined as the range divided by the precision, defines the
analog step that a change in one least significant bit (LSB) represents.
In the case of a 5-volt, 8-bit ADC, the resolution is 5/255 (volts), or
19.6 mV. This means that a change in one LSB in the ADC data register
reflects a change of about 20 mV at the analog input.
Resistor Ladder
Voltage Divider
Consider a resistor ladder connected to an ADC input, as shown in
Figure 3. Because this arrangement is a voltage divider, each segment
in the ladder can alter the voltage at the input when grounded. If
switches are provided at each segment, one can selectively ground that
segment, altering the composition of the divider, and thus altering the
voltage presented to the ADC pin.
In this way, software can determine which switch in the ladder was
selected by reading the resulting A/D data value. The resistor R0 acts as
a pullup to maintain VDD on the analog input line while no keys are
active. Thus, a conversion value of $FF indicates that no key has been
pressed.
VDD
R0
ADC
INPUT
R2
VIn
K1
R3
K2
R5
R4
K3
K4
R6
K5
R7
K6
R8
K7
K8
Figure 3. Digital Input Alternative
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Freescale Semiconductor, Inc...
Application Note
Implementation
Considerations
Using this method, one can theoretically connect 255 input switches to
one ADC pin. However, there are many potential sources of
inaccuracies, which make it impractical to connect so many key inputs.
One should account for some error padding.
Resistor Precision
One inaccuracy is provided by the resistors themselves. Resistors are
categorized according to their variance from a labeled value. The
application should be tolerant to the precision of the resistors being used
(typically, 1 percent or 5 percent). Also, a calculated resistor value might
not be a commonly available value, so the user should plan for a range
of resistor values.
ADC Accuracy
Typically, an 8-bit ADC is accurate within two least significant bits. This
should be accounted for as well. The best way to allow for these
tolerances is to assign to each key switch a range of resulting A/D data
register values.
If an analog input falls within a particular range, one can determine that
the key was pressed. By adjusting the range of ADC results which
represent a given keypress, the user can change the error margin for the
application.
To ensure the best ADC accuracy, the full range of the converter should
be used. In cases where the high reference is not variable, it is typically
fixed at the operating voltage.
A spreadsheet is a good way to determine resistor values and A/D result
ranges. An example of computing values for Figure 3 are shown in
Table 1.
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
Freescale Semiconductor, Inc...
Table 1. Spreadsheet Calculations
VDD =
5
Converter Resolution =
# Keys =
8
Voltage Steps =
0.625 (VDD/# Keys)
R0 =
0.01961
(Vdd/255)
10000
(Pullup)
(Hex)
(Hex)
Key pressed
VIn
Req
Rn
Vinmin
Vinmax
ADDRmin
ADDRmax
No Key
5
0
10000
4.6875
5
EF
FF
1
0
0
0
0
0.3125
0
F
2
0.625 1429
1429
0.3125
0.9375
F
2F
3
1.25
3333
1904
0.9375
1.5625
2F
4F
4
1.875 6000
2667
1.5625
2.1875
4F
6F
5
2.5
10000
4000
2.1875
2.8125
6F
8F
6
3.125 16667
6667
2.8125
3.4375
8F
AF
7
3.75
30000
13333
3.4375
4.0625
AF
CF
8
4.375 70000
40000
4.0625
4.6875
CF
EF
Some notes on the spreadsheet:
•
VIn is determined by decrementing the high voltage reference by
the voltage step for each segment in the ladder. (See Figure 4.)
•
Rn is the resistor value of the current key segment needed to form
desired equivalent resistance Req.
•
Req represents the equivalent resistance of ladder, including the
current resistor (Rn) and excluding the pullup resistor (R0).
•
Vinmin and Vinmax are the minimum and maximum voltages that
can be arbitrated as a particular key. In this case, VIn +/–Vstep/2
was used.
•
ADDRmin and ADDRmax are the ADC data register value range
used to represent a given keypress. This range can be narrowed
or widened to affect precision. In this case, the ranges were
maximized, so no conversion result is undefined.
•
This particular spreadsheet did not use resistor precision, but this
could be considered to further pad the error.
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
Implementation
VDD
REQ
R0
VIn
REQ(N-1)
RN
Freescale Semiconductor, Inc...
Figure 4. Voltage Divider
Constants
First, VDD (or VREFH, the high reference for the converter) and the
number of keys are determined. The converter resolution is found by
dividing VDD by the converter precision. The number of voltage steps
needed is VDD divided by the number of key switches. An ADC should
always be operated at its full range. The pullup resistor, R0, typically,
should be chosen between 4.7 k (to limit current) to 22 k (to limit time
constant).
Variables
Once these constant values are decided, a spreadsheet can be used to
determine the resistor values needed in each segment of the divider
ladder, according to the desired input voltages.
When using an ADC, always use the entire range of the converter
(VREFH – VREFL). This is the reason for determining the voltage steps
first (VDD – n*step value) and then calculating the necessary resistor
values to achieve these voltages through the divider.
For each segment in the ladder, the nth segment’s necessary resistor
value needs to be calculated (Rn in the spreadsheet). When a key is
pressed, the equivalent resistance of the included segment resistors
forms a voltage divider with the pullup resistor.
Given the voltage desired at the ADC input (VIn), the user can determine
the equivalent resistance needed to achieve that voltage by:
Req(n) = (VIn*R0)/(VREFH – VIn)
The resistor that will form the needed equivalent resistance with the
other resistors in the ladder can be determined, as:
Rn = Req(n) – Req(n – 1)
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
The only exception is key 1, which connects VSS to the ADC input and
needs no resistor.
Freescale Semiconductor, Inc...
By assigning a range of ADC conversion values to each key, the user
can provide a fair amount of error padding. Considerations include
resistor tolerance, ADC accuracy, and parasitic time constants. The
range of conversion values for a particular keypress can be narrowed to
improve the accuracy of the application. Or, for “quick and dirty”
arbitration, keep the range as wide as possible.
Using a Single
Resistor Value
The method presented here used different resistor values to produce
equal voltage intervals. Another method would be to use the same
resistance value for all segments in the divider. The disadvantage of
using the same resistor values is that it greatly diminishes the effective
range of conversions. Also, if resistances are kept equal, the voltage
step between switches approaches the resolution of the ADC.
Therefore, the error margin diminishes as more keys are added.
Programming
Considerations
There are several ways to implement such an application. One thing to
choose is whether to poll the ADC when desired or link a keypress to an
interrupt source.
Some ADCs continuously convert once enabled, allowing a new value
to be available every 32 clock cycles. Others do a single conversion
when a register is written to and don’t do another conversion until the
register is written to again.
A polling scheme can use a periodic timing source as a signal to poll. For
example, the real-time interrupt (RTI) or timer overflow (TOF) interrupt
can be used to scan the ADC input at a given rate.
Not linking a keypress to an interrupt source can cause timing problems
and might miss a keypress. Careful consideration should be given to
timing and voltage error requirements to determine if this method is
appropriate.
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
A Brief Example with the MC68HC705P6A MCU
A Brief Example with the MC68HC705P6A MCU
The small code segment example that follows illustrates the software
implementation of this method of keypress arbitration. The example was
defined around the spreadsheet analysis example shown in Table 1.
Freescale Semiconductor, Inc...
The MC68HC705P6A (P6A) MCU features a 4-channel, 8-bit A/D
converter. The P6A ADC uses continuous conversion, making a new
value available every 32 internal clock cycles after being turned on.
The software example assumes a resistor ladder is connected to AD0
(A/D channel 0, port C, pin 6). The software is not intended to be a
complete application.
This software starts the ADC, selects channel 0 for A/D conversions,
then polls the ADC data register to determine if a key was pressed. The
software uses a lookup table, with predefined maximum and minimum
ADC values which represent a specific segment in the divider being
grounded.
Once the key has been arbitrated, the RAM variable InKey will tell an
application which key was switched most recently.
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Application Note
Freescale Semiconductor, Inc...
Code Listings
*
*
*
*
*
*
*
*
*
*
---------------------------------------------------------------------------------EXPANDIO.ASM
Written for the MC68HC705P6A microcontroller
A code segment example to illustrate the use of the A/D
converter for key input arbitration
This simple example polls the AD0 channel, compares the
conversion result to a lookup table, and determines
which of 8 keys were pressed.
----------------------------------------------------------------------------------
; Memory map equates
RAMSPACE
EQU
ROMSPACE
EQU
$50
$100
; A/D Registers
ADC
EQU
ADSC
EQU
$1D
$1E
;A/D Data register
;A/D Status and control
; ADSC Bits
CC
ADRC
ADON
7
6
5
;Conversion complete flag
;A/D RC oscillator enable
;A/D enable bit
EQU
EQU
EQU
* ---------------------------------------------------------------------------------; RAM Variables
* ---------------------------------------------------------------------------------ORG
RAMSPACE
;Start of user RAM
InKey
RMB
1
;Identifies the last key pressed
ADValue
RMB
1
;Stores the last ADC result
*
;
;
;
*
---------------------------------------------------------------------------------Program code
Simply loops, polling the A/D converter channel AD0
and determining which key was pressed
---------------------------------------------------------------------------------ORG
ROMSPACE
;Start of user ROM
Start:
LDA
#$20
;Turn on A/D, select AD0 channel
STA
ADSC
MainLoop:
BRCLR
LDA
STA
CLR
CLRX
CC,ADSC,*
ADC
ADValue
InKey
;Wait for conversion complete
;Get the result
;Record the result
;Clear the InKey variable
;Clear the offset
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
Freescale Semiconductor, Inc...
Application Note
Code Listings
;Check the entries in the table, to find the ADC value range
;that corresponds to the ADC data register value.
KeyLoop:
LDA
KeyTable+1,X
;Check high range
CMP
ADValue
BLS
Match
;Within range
LDA
KeyTable,X
;Check low range
CMP
ADVAlue
BLS
Match
;Within range
INCX
;Point to next table record
INCX
;Increment the key value, when a match is made,
;the variable will contain the key that was pressed.
INC
InKey
BRA
KeyLoop
; At this point, InKey variable holds keypress information
; One can arbitrate the key press here. For this simple example
; we just repeat the main loop
Match:
BRA
MainLoop
* ---------------------------------------------------------------------------------; Key lookup table. Holds the minimum and maximum ADC values
; which identify a particular key in the resistor ladder
* ---------------------------------------------------------------------------------KeyTable:
NoKey
FCB
$EF,$FF
;No key pressed
Key1
FCB
$00,$0F
Key2
FCB
$0F,$2F
Key3
FCB
$2F,$4F
Key4
FCB
$4F,$6F
Key5
FCB
$6F,$8F
Key6
FCB
$8F,$AF
Key7
FCB
$AF,$CF
Key8
FCB
$CF,$EF
* ---------------------------------------------------------------------------------; Vector definitions
* ---------------------------------------------------------------------------------ORG
$1FFE
;Reset vector
FDB
Start
AN1775 Rev. 1
For More Information On This Product,
Go to: www.freescale.com
Freescale Semiconductor, Inc.
N O N - D I S C L O S U R E
Freescale Semiconductor, Inc...
A G R E E M E N T
R E Q U I R E D
Application Note
How to Reach Us:
Home Page:
www.freescale.com
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