7.9 Method to Design a Microcontroller-Based System 
331
' Display current position and error on the LCD
Lcdout $FE, 1, "pos:", DEC motor_pos, " error:", DEC error
Lcdout $FE, $C0, "exit: stop button"
Wend
Goto position 
' continue the polling loop
Return 
' end of subroutine, not reached (see the #-key If above)
' Subroutine to get the encoder position (enc_pos) from the counter
get_encoder:
' Command the PIC16F84 to transmit the low byte
High enc_start
' Receive the high byte
SERIN enc_serial, enc_mode, enc_pos.HighBYTE
' Command the PIC16F84 to transmit the high byte
Low enc_start
' Receive the low byte
SERIN enc_serial, enc_mode, enc_pos.LowBYTE
Return
'
'   motor speed (motor_speed)
pwm_periods:
' Be careful to avoid integer arithmetic and
 WORD overflow [max=65535] problems
If (pwm_period >= 655) Then
on_time = pwm_period/100 * motor_speed
off_time = pwm_period/100 * (100-motor_speed)
Else
on_time = pwm_period*motor_speed / 100
off_time = pwm_period*(100-motor_speed) / 100
Endif
Return 
pwm_pulse:
' Send the ON pulse
High motor_pwm
Pauseus on_time
' Send the OFF pulse
Low motor_pwm
Pauseus off_time
Return
(continued )
Error processing SSI file
332 
CHAPTER 7 
Microcontroller Programming and Interfacing
' Subroutine for speed control of the motor
speed:
' Display the speed control menu on the LCD
Gosub speed_menu
' Wait for a keypad button to be pressed
Serin key_serial, key_mode, key_value
' Take the appropriate action based on the key pressed
If (key_value == key_1) Then
' Slow the speed by 10%
If (motor_speed > 0) Then 
' don't let speed go negative
motor_speed = motor_speed - 10
Endif
Else
If (key_value == key_2) Then
' Reverse the motor direction
motion_dir = ~motion_dir
Else
If (key_value == key_3) Then
' Increase the speed by 10%
If (motor_speed < 100) Then ' don't let speed exceed 100
motor_speed = motor_speed + 10
EndIf
Else
If (key_value == key_pound) Then
Gosub main_menu
Return
Else
If (key_value == key_0) Then
' Run the motor until the stop button is pressed
Gosub run_motor
Else
' Wrong key pressed
Goto speed
Endif : Endif : Endif : Endif : Endif
Goto speed 
' continue the polling loop
Return 
' end of subroutine, not reached (see the #-key If above)
' Subroutine to display the speed control menu on the LCD
speed_menu:
Lcdout $FE, 1, "speed:", DEC motor_speed, " dir:", DEC motion_dir
Lcdout $FE, $C0, "1:- 2:dir 3:+ 0:start #:<"
Return
(continued )
Error processing SSI file
7.9 Method to Design a Microcontroller-Based System 
333
'
stop button is pressed. The duty cycle of the PWM signal is the
motor_speed percentage
run_motor:
' Display the current speed and direction
Lcdout $FE, 1, "speed:", DEC motor_speed, " dir:", DEC motion_dir
Lcdout $FE, $C0, "exit: stop button"
' Set the motor direction
motor_dir = motion_dir
' Output the PWM signal
Gosub pwm_periods 
' calculate the on and off pulse widths
While (stop_button == 0) 
' until the stop button is pressed
Gosub pwm_pulse 
' send out a full PWM pulse
Wend
' Return to the speed menu
Gosub speed_menu
Return
' Subroutine to wait for the stop button to be pressed and released
' (used during program debugging)
button_press:
While (stop_button == 0) : Wend ' wait for button press
Pause 50 
' wait for switch bounce to settle
While (stop_button == 1) : Wend  wait for button release
Pause 50 
' wait for switch bounce to settle
Return
' Subroutine to allow the user to adjust the proportional and derivative
 gains used in position control mode
adjust_gains:
' Display the gain values and menu on the LCD
Gosub gains_menu
' Wait for a keypad button to be pressed
Serin key_serial, key_mode, key_value
' Take the appropriate action based on the key pressed
If (key_value == key_1) Then
' Increase the proportional gain by 10%
If (kp < 100) Then
kp = kp + 10
Endif
Else
(continued )
Error processing SSI file
334 
CHAPTER 7 
Microcontroller Programming and Interfacing
If (key_value == key_4) Then
' Decrease the proportional gain by 10%
If (kp > 0) Then    ' don't allow negative gain
kp = kp - 10
Endif
Else
If (key_value == key_3) Then
' Increase the number of PWM cycles sent each position control loop
pwm_cycles = pwm_cycles + 5
Else
If (key_value == key_6) Then
' Decrease the number of PWM cycles sent each position control loop
If (kp > 5) Then    ' maintain positive number of pulses
pwm_cycles = pwm_cycles - 5
Endif
Else
If (key_value == key_pound) Then
Gosub main_menu
Return
Else
Goto adjust_gains
Endif : Endif : Endif : Endif : Endif
Goto adjust_gains 
' continue the polling loop
Return 
' end of subroutine, not reached (see the #-key If above)
' Subroutine to display the position control gain, the number of PWM
'   cycles/loop, and the adjustment menu on the LCD
gains_menu:
Lcdout $FE, 1, "kp:", DEC kp, " PWM:", DEC pwm_cycles
Lcdout $FE, $C0, "1:+P 4:-P 3:+C 6:-C #:<"
Return
slave PIC code:
' dc_enc (PIC16F84 microcontroller)
' Design Example
' Position and Speed Control of a dc Servo Motor.
' Slave program to send encoder data, upon request, to the a PIC16F88
' microcontroller running dc_motor.bas
' Define I/O pin names and constants
enc_start Var PORTA.0 
' signal line used to start encoder data transmission
enc_serial Var PORTA.1 
' serial line used to get encoder data from the 16F84
enc_sel Var PORTA.2 
' encoder data byte select (0:high 1:low)
enc_oe Var PORTA.3 
' encoder output enable latch signal (active low)
led Var PORTA.4  
' diagnostic LED (open drain output: 1:OC, 0:ground)
enc_mode Con 2 
' 9600 baud mode for serial connection to encoder IC
blink_pause Con 200 
' 1/5 second (200 ms) pause between LED blinks
(continued )
Error processing SSI file
7.10 Practical Considerations  
335
' Turn off the diagnostic LED
High led
' Wait to ensure the PIC16F88 is initialized
PAUSE 500
' Initialize I/O signals
High enc_oe 
' disable encoder output
Low enc_sel 
' select the encoder counter high byte initially
' (to prevent transparent latch on low byte)
' Blink the LED to indicate proper operation
Gosub blink : Gosub blink : Gosub blink
' Send dummy byte (66) to ensure proper communication
SEROUT enc_serial, enc_mode, [66]
' Main loop
start:
' Wait for the start signal from the PIC16F88 to go high
While (enc_start == 0) : Wend
' Enable the encoder output (latch the counter values)
Low enc_oe
' Send out the high byte of the counter
SEROUT enc_serial, enc_mode, [PORTB]
' Wait for the start signal from the PIC16F88 to go low
While (enc_start == 1) : Wend
' Send out the low byte of the counter
High enc_sel
SEROUT enc_serial, enc_mode, [PORTB]
' Disable the encoder output
High enc_oe
Low enc_sel
goto start ' wait for next request
End 
' end of main program (not reached)
' Subroutine to blink the diagnostic LED on and back off again
blink:
Low led
Pause blink_pause
High led
Pause blink_pause
Return
L
a
b
E
x
e
r
c
i
s
e
Lab 9Program-
ming a PIC 
microcontroller—
Part I
Lab 10Program-
ming a PIC 
microcontroller—
Part II
Lab 11Pulse-
width-modulation 
motor speed 
control with a PIC
■ CLASS DISCUSSION ITEM 7.10 
Negative logic LED 
Why does the  blink  subroutine in the slave PIC code in Threaded Design Example 
C.3 use negative logic (i.e.,  Low  turns the LED on, and  High  turns it off)? 
Error processing SSI file
336 
CHAPTER 7 
Microcontroller Programming and Interfacing
  
7.10 PRACTICAL CONSIDERATIONS 
Throughout this chapter we’ve seen how to design and program microcontroller-
based systems. As with most things in the “real world,” when you actually construct 
circuits and implement software, things don’t always work perfectly. Lab Exercises 
9 through 11 provide experiences that will help you develop some of the skills 
necessary to be successful. The best advice anyone could give concerning design-
ing a complicated microcontroller-based system is to follow a methodical design 
procedure as documented and demonstrated in  Section 7.9 . It also helps to have 
and follow a detailed procedure for the specific development system you are using. 
Internet Link 7.11 provides the detailed procedure necessary for working with 
Microchip PIC microcontrollers programmed in PicBasic Pro, using the  PicStart 
Plus programming hardware.  
7.10.1 PIC Project Debugging Procedure 
The following check list and items of advice can be helpful when  debugging  soft-
ware and trying to get a PIC circuit to function properly:
1. Before writing and testing the entire code for your project, always start with 
a very simple program (e.g., the  flash.bas  program in  Section 7.5.1 ) on your 
PIC(s) to first make sure all necessary components and wiring are in place to 
allow the PIC(s) to run.  
2. Once the PIC is known to be running properly, incrementally add and test por-
tions of your code, one functional component at a time. In other words, modu-
larize your software and independently develop and test each module (i.e., 
don’t write the entire program at once, expecting it to work).  
3. 
ning and to indicate input and output states.  
4. Be aware of the different characteristics of the I/O pins on the PIC. Refer to 
Section 7.8  to see how to properly interface to the different pins for different 
purposes.  
5. Be aware that PicBasic Pro commands totally occupy the processor while they 
until the SOUND command has completely finished its action).  
6. 
e sure 
you hav
for the PIC16F88 available in Internet Link 7.17).  
7. Make sure you carefully select all of the configuration bit settings when down-
loading code to a PIC, so the oscillator, timers, and selected pin functions are 
defined properly. This can be done manually each time a PIC is reprogrammed 
(as documented in Internet Link 7.11), or you can define all of the settings in 
your code as described in Internet Link 7.18.  
I
n
t
e
r
n
e
t
L
i
n
k
7.11How to 
program a PIC
I
n
t
e
r
n
e
t
L
i
n
k
7.17PIC16F88 
code template
7.18Setting 
configuration bits 
in code
Error processing SSI file
Figure 7.21 Low-cost power supply options. 
wall transformer
potted
power supply
4 AA batteries
in series
9V battery
voltage regulator
7.10 Practical Considerations  
337
8. Follo 
9. Always follow the PIC programming procedure in Internet Link 7.11 to ensure 
that you don’t miss any important steps or details.    
Much more advice for developing and debugging PIC-based systems can be 
found at Internet Link 7.19, which provides a summary of “lessons learned” by 
many past students in our mechatronics course at Colorado State University.
7.10.2 Power Supply Options for PIC Projects 
There are a number of ways to provide the DC power required by a PIC and any 
ancillary digital integrated circuits. Actuators may also be powered by the same DC 
supply if their drive voltages match that of the digital circuitry, and if the current 
demands don't exceed the supply's capacity. We begin by assuming that TTL digi-
tal ICs are being used, which require a regulated 5 V DC source. If CMOS is used 
exclusively, there are fewer restrictions on the regulation of the DC voltage. 
Figure 7.21  shows several low-cost options for powering systems requiring a 
5 V supply. These and other options include: 
1. A 6 V, 9 V, or 12 V wall transformer with a 5 V regulator  
2. A potted power supply with AC input and 5 V regulated output  
3. Four AA batteries (6 V) in series with a 5 V regulator  
4. A 9 V battery with a 5 V regulator  
5. A rechargeable battery (or batteries in series) with a 5 V regulator  
6. A full-featured instrumentation power supply   
I
n
t
e
r
n
e
t
L
i
n
k
7.19Lessons 
learned by past 
students
Error processing SSI file
338 
CHAPTER 7 
Microcontroller Programming and Interfacing
Other alternatives for powering projects include a computer power supply, or 
large batteries (e.g., car or motorcycle lead-acid batteries), especially if you have 
high current demands. 
A wall transformer (6 V, 9 V, or 12 V) will provide current up to its rating and 
must be used with a 5 V regulator to control the level of the output voltage. Be 
sure that the current rating of the wall transformer exceeds (with a healthy mar-
gin) the maximum current your circuit and actuators will draw. A potted power 
supply also has AC inputs and may provide one or more regulated DC outputs at 
its rated current. No voltage regulator is required if a 5 V output is provided. Four 
AA batteries can be connected in series with the 6 V output regulated down to 
5 V with a voltage regulator. A 9 V battery must also be connected to a 5 V regulator. 
The battery options provide portability for your design but may not be able to supply 
enough current.  Section 7.10.3  presents more information on different types of bat-
teries and their characteristics. Generally, actuators such as motors and solenoids, as 
well as high-current LEDs, can draw substantial current. You should test your batter-
ies to ensure that they will provide sufficient supply (do not simply assume that they 
will). Digital circuitry, on the other hand, usually draws very little current. 
Figure 7.22  shows an example of a full-featured instrumentation power supply. 
This particular model (HP 6235A) is a triple-output power supply, with three adjust-
able voltage outputs, each independently current rated. A full-featured instrumenta-
tion power supply provides the easiest solution, but these are expensive, heavy, and 
generally not portable. 
Except for the 5 V potted supply and the adjustable instrumentation power 
supply, voltage regulators are required to convert the output voltage down to the 
5 V level. If your system is entirely CMOS, the regulation of the DC voltage is not 
required.  Figure 7.23  illustrates a standard 7805 5 V voltage regulator and shows 
how it is properly connected to your unregulated power-supply output and your sys-
tem. There must be a common ground from the power supply to your system. The 
mounting hole on the heat sink allows you to easily connect to the common ground. 
Figure 7.22 Example of a full-featured instrumentation power supply. 
Error processing SSI file
Figure 7.23 7805 voltage regulator connections. 
heat sink
(COMMON)
INPUT
OUTPUT
COMMON
mounting
hole
input
(7V - 35V)
output
(5V regulated)
g
r
o
u
n
d
7.10 Practical Considerations  
339
Table 7.7  provides a summary of how the various power supply options compare 
in terms of current ratings, size, and cost.  Figure 7.24  shows an example specifica-
tion sheet for an enclosed power supply. Before selecting or purchasing a supply for 
your design, it is important to first review the specifications, especially the current 
rating (2.5 A in this case).  
7.10.3 Battery Characteristics 
ica-
tions in the proper selection of a battery as a power source. The most important 
specification for a battery (besides its rated voltage) is the  amp-hour capacity.  This 
is defined as the current a battery can provide for one hour before it reaches its end-
of-life point. The current that a battery can deliver is limited by its  equivalent series 
resistance, 
“ideal voltage source.” The load current times the internal resistance results in a 
voltage drop reducing the effective voltage of the battery. Furthermore, there will 
Table 7.7 5 V power supply options summary 
Device
Typical current
Relative size
Relative cost
instrumentation power 
supply
1 A – 5 A
large
very expensive
(∼ $1,000) but many 
features
small potted, open frame, 
or enclosed power supply
1 A – 10 A
medium
moderately expensive
(∼ $20–$100)
wall transformer
1 A
small
cheap
9 V battery
100 mA
small
cheap
4 AA batteries
100 mA
small
cheap
rechargeable battery
See Section 7.10.3
small
moderate
Error processing SSI file
Figure 7.24 Specifications for an example 
closed-frame power supply. 
340 
CHAPTER 7 
Microcontroller Programming and Interfacing
be po
considerable heat production. 
Batteries are composed of  cells the electrochemical construct that supplies 
v
for larger current and voltage capacities. The voltage of a cell will differ among 
the types of batteries, due to their chemistry.  Primary cell batteries  are not 
rechargeable and are meant for one-time use. Devices that are used infrequently 
or that require very low drain currents are good candidates for primary cells.  
Secondary cell batteries  are rechargeable, and their effectiveness may be replen-
ished many times. Devices that require daily use with higher drain currents are good 
candidates for secondary cells. 
The plot of a  battery discharge curve  is important in determining the stability 
of the voltage output.  Figure 7.25  shows a typical shape for a discharge curve. One 
desires a broad plateau representing a long effective life. 
The salient factors a designer must consider in the selection of a power source 
for a mechatronic design are:
■ 
Voltage required by the load  
■ 
Current required by the load  
■ 
Duty cycle of the system  
■ 
Cost  
■ 
Size and weight (specific energy)  
■ 
Need for rechargeability    
Error processing SSI file
Error processing SSI file