Introduction To The Texas Instruments Ez430: Naren Anand
Introduction To The Texas Instruments Ez430: Naren Anand
Introduction To The Texas Instruments Ez430: Naren Anand
ez430
By:
Naren Anand
Introduction to the Texas Instruments
ez430
By:
Naren Anand
Online:
< http://cnx.org/content/col10354/1.6/ >
CONNEXIONS
A program is a set of instructions that are grouped together to accomplish a task or tasks. The instructions,
called machine code or assembly code consist of things like reading and writing to memory, arithmetic
operations, and comparisons. While these instructions sound simple, it is actually possible to solve a huge
group problems with them. The diculty in doing so is that you must specify in exact detail precisely how.
Good programming is both an art and a science, and what you will learn today is a beginning of the craft.
As mentioned above, the individual instructions that the machine actually quite simple or low-level in
computer parlance. Writing complex programs in assembly code took such a long time that eventually better
programming languages were invented. A programming language, like C, is a formal set of grammar and
syntax like assembly code; but the instructions in high-level languages encompass hundreds of assembly
instructions. Programs called compilers translate a program written in a higher level language into assembly
so that the computer can actually execute the instructions. Compilers let the programmer write programs
so that humans can read them relatively easily while the computer can still execute the instructions.
Generally programming code is organized into text les with suxes that indicate the programming
language. In the case of C these les are appended with ".c", and a C program is made up of at least one
of these les. Many C programs also use header les that contain frequently used segments of code so that
it does not need to be written multiple times. A ".h" is appended to the end of these les.
2
1.2 1.2 - Introduction to the IAR Workbench IDE
1.2.1 Goals
To develop applications to run on the ez430 chip, we use the IAR Embedded Workbench IDE (integrated
development environment). Not only does this application provide a powerful code editor, but it also
allows a simple one-click deployment of the source code onto the MSP chip using USB as well as hardware
debugging capabilities that allow you to trace through actual stack calls. This module is intended to give
you an introduction to the IAR Workbench application so that you may create and develop your own ez430
applications.
1 This content is available online at <http://cnx.org/content/m13620/1.2/>.
2 This content is available online at <http://cnx.org/content/m13622/1.3/>.
1
2 CHAPTER 1. LAB 1: INTRODUCTION TO EMBEDDED C PROGRAMMING
Startup Screen
Figure 1.2: Here we select the language in which we shall write our code. Select the 'C' le and then
the 'main' option. In one lab, we will program in assembly; for that lab, select the "asm" option.
Now a Windows Save dialog should appear. Give your project a name and save it in its own seperate
folder. A project is not only a C le that contains your code but also several other les (a project le with
the ".eww" extention, a project settings folder, a debug folder which contains compiled code outputted by
Workbench etc). Keeping the les for your current project in their own folder will help you stay organized.
If you save and close your project, opening it again is as simple as opening this folder, and doubleclicking
on the Workbench project le, which has a ".eww" extention.
Figure 1.3: Make sure you choose the right processor for your application! Here, I've selected the
MSP4302013 (a member of the ez430 series) since that is the chip I plan to use.
Now select the "Debugger" option and make the following selections:
5
Figure 1.4: Here we must select to use the FET (Flash Emulation Tool) Debugger to run our code.
Finally select the "FET Debugger" option and make the following selections:
6 CHAPTER 1. LAB 1: INTRODUCTION TO EMBEDDED C PROGRAMMING
Figure 1.5: Now we select the "Verify Download" check box and the "TI USB FET" radio button
(while leaving other options as they are) so that our program is properly transferred to the chip.
Your project is created, saved, and now you may write your code. Only one project may be open at a
time.
(in order to view the "path" of program execution or the values of specic variables or registers at a certain
point during the program execution) click to the left of a line of code such that a red 'X' appears.
You can pause the debugger when the target is running if you would like to look at the value of certain
variables. Select Debug->Break and open a watch window to examine the value of certain variables. It
is suggested that you copy the variables you are interested in to temporary global variables. Because local
variables go out of scope, it is uncertain if their correct value is maintained when the debugger is paused.
Debugging can be stopped using Debug->Stop. At this point, the watch window will not display your
variable values. At this point, you may make any modications to your program as necessary and restart
the debugger from the beginning.
All of the necessary commands have shortcut icons as the following diagram shows:
Legend:
1. Make/Debug- This button will compile, load, and run the code onto the chip. This process happens
rather rapidly so if the execution of this seems to hang, then something is wrong. Usually disconnecting
the tool and/or restarting Workbench solves this problem. Don't forget to save rst!
2. Go- This button is for the Go command in the debug menu; it tells the program to continue execution
until the next breakpoint. The buttons to its left are other ways of traversing through breakpoints
that you may experiment with.
3. Stop Debug- Selecting this will end the debugging process. If you want to modify your code then
you must stop debugging rst.
4. Dissassembly- This is a map of the memory space of the ez430 and where your code has been placed
(in its compiled form).
5. Current Location- The Green Arrow/Green Highlighting indicates the current instruction being
executed.
8 CHAPTER 1. LAB 1: INTRODUCTION TO EMBEDDED C PROGRAMMING
3
1.3 1.3 - Introduction to Programming the ez430
∼A
A | B
A & B
A ^ B
A |= B
A &= ∼B
A ^=B
In C, the NOT: ∼, OR: |, AND: & and XOR: ^ operators are all bitwise. This means that the operations
are done bit by bit to the binary values of the two operands.
note: The prex "0b" to a number means that that number is binary. Similarly an "0x" prex
means that the number is hexadecimal.
int A = 0b1101;
int B = 0b0101;
int C;
/*
The results of these operations are very straightforward. If we are dealing with the "|"
3 This content is available online at <http://cnx.org/content/m13623/1.2/>.
9
operator then we OR together each bit to make the result. This means 0b1101 | 0b0101 is
computed as [1 OR 0, 1 OR 1, 0 OR 0, 1 OR 1] which is [1,1,1,1] thus the result is 0b1101;
*/
#include "msp430x20x3.h";
4. Consider dening macros for commonly used register values. For example, if we add #define
led_on ∼0x01 to the top of the le (after the #include) we may call led_on every time
we wanted the value ∼0x01. Similarly we may add #define led_off 0x01 to use when we
wanted 0x01.
5. Complete the program. It is as simple as it seems; no more than two lines of code in the main
function are necessary
10 CHAPTER 1. LAB 1: INTRODUCTION TO EMBEDDED C PROGRAMMING
4
1.4 1.4 - Setting Breakpoints in Workbench
C with an embedded controller does not have as many input-output (IO) features as a regular computer.
To help you debug, it will sometimes be necessary to stop the processor while it is running and examine the
state of the system. To accomplish this we will use breakpoints. A breakpoint is a specic command to
the development environment to stop execution of the processor when a certain condition happens. These
conditions range from when a certain instruction is reached to when certain data is written or read. The
advanced options are broad.
To set a basic breakpoint, one which will stop execution when a certain line is reached, just click on
the left margin of the C le on the line you want to trigger. A red 'X' should appear to indicate you have
set a break point. Click once more to make it go away. Workbench keeps track of all of the breakpoints
for you. To see this information go to Window->Breakpoints. This will pop up a list of all of the
breakpoints you currently have enabled. Right clicking in the window will allow us to create, delete, and
modify breakpoints. We will use the same terminology for breakpoints as the IAR environment does, but
the usage is not standardized.
The most useful and important breakpoint is the the code breakpoint. It triggers on arrival at a certain
instruction in the source code. This kind of breakpoint can be created simply by left clicking on the left
margin of the line in question. The breakpoint should then appear in the breakpoint window. Right clicking
on the entry for a breakpoint allows you to edit it. For all breakpoints, you may select that they only trigger
on a certain iteration by editing the skip count eld. If left as 0, the breakpoint will trigger each time it
occurs. Entering a number into the skip count eld will trigger the breakpoint on that numbered time the
event occurs.
In tandem with breakpoints, we can use the Locals and Watch windows. To access either of these
windows select View->Locals or View->Watch. Whenever the program pauses at a breakpoint, these
windows will be updated with the proper current values. The locals window displays the values for all local
variables, variables within the function being processed, that are currently being used. The watch window
displays values for variables that you add to it. Right click any variable or macro directly in your code and
select "Add to Watch." Now, whenever your code pauses at a breakpoint, you can see the current value of
that variable.
Alternate explanations of breakpoints can be found in the help contents of the Workbench IDE.
5
1.5 1.5 - Lab 1: C and Macros with Texas Instruments' ez430
The primary dierence between "normal" and embedded C programming is that you will need to write
directly to registers to control the operation of the processor. Fortunately, the groundwork has already been
laid for you to make this easier. All of the registers in the ez430 have been mapped to macros by Texas
Instruments. Additionally, the important bit combinations for each of these registers have macros that use
the same naming convention as the user's guide. Other dierences from the C used on most platforms
include:
• Most registers in the ez430 are 16 bits long, so an int value is 2 bytes (16 bits) long.
• Writing to registers is not always like writing to a variable because the register may change without
your specic orders. It is always important to read the register description to see what the register
does.
• The watchdog timer will automatically reset the ez430 unless you set the register not to.
• There is only a limited "standard out" system. Standard out will typically print results to your
computer screen.
• Floating-point operations cannot be eciently performed. In general, you should avoid oating point
decimal calculations on the ez430 because it does not have special hardware to support the complicated
algorithms used.
4 This content is available online at <http://cnx.org/content/m13624/1.1/>.
5 This content is available online at <http://cnx.org/content/m13625/1.5/>.
11
Exercise 1.5
Code Review
In this exercise, you may want to use some of the debugging tools (Breakpoints, Watch Window,
Locals Window) to help you understand what the code is doing. Start a new project. Cut and
paste the following code into main.c:
#include "msp430x20x3.h"
void main(void){
int i,j,tmp;
int a[20]={0x000C,0x0C62,0x0180,0x0D4A,0x00F0,0x0CCF,0x0C35,0x096E,0x02E4,
0x0BDB,0x0788,0x0AD7,0x0AC9,0x0D06,0x00EB,0x05CC,0x0AE3,0x05B7,0x001D,0x0000};
while(1);
}
1. Explain what this program is doing. Why is the while(1) statement at the end of the code
necessary for all programs we write at this point?
2. Use any of the methods listed above to show the updated array. What is the nal result?
3. Modify the code so that it prints the nal version of the array to standard out (you will
have to use a loop of your choice to cycle through each element of the array). What are the
drawbacks and benets of using printf over setting a breakpoint?
note: To use the standard out, add the following line to the top of your code:
#include "stdio.h";
Then, select Project->Options, the Library Options tab in General Options, and nally
select Tiny in the Printf formatter drop down menu. The printf() function will print to stan-
dard out (when the debugger is running, select View->Terminal I/O). For example, printf("x
equals %d\n", x); will print out the value of x to the window. The %d means that x is a number,
and \n will produce a line break.
Exercise 1.6
Functions
Multiplications and division are very complex operations to do on any microprocessor. The op-
erations should be avoided if possible or should be replaced with simpler, equivalent operations.
3. Write the function multiply(int x, int y) that takes parameter x and multiplies it by y
by using a bit shift. It must return an int. For symplicity, it is OK to assume that y is a
power of 2.
4. Next, write the function divide(int x, int y) that takes parameter x and divides it by y
by using a bit shift. It must also return an int.
Exercise 1.7
Digital I/O Registers
Open the header le msp430x20x3.h by right clicking the name in your code and selecting
Open "msp430x20x3.h" This le contains the macros and register denitions for the ez430 we
are using. Using the ez430 schematic, this header le, and ez430's User Guide please answer the
following questions.
1. The Watchdog Timer will automatically reset the hardware if it isn't periodically reset or
disabled entirely. Usually, we will simply disable it. It can be disabled by writing to the
WDTPW (watchdog timer password) and WDTHOLD (watchdog timer hold) section of the Watch-
dog Timer Control Register (WDTCTL). Refer to Section 7.3 of the User's Guide for more
information. Find the macros for this register in the header le. How are they dierent from
their description in the User's Guide? Finally, write the C code required to disable it.
2. What are the dierences among P1DIR, P1SEL, P1OUT, P1IN?
3. Some port pins have multiple functions to output and it is up to the user to select the
appropriate signal. Write some code that would select the alternate function of P2.2 (pin 2
of port 2). What will the result be on our hardware?
Exercise 1.8
Programming Digital I/O
Write a program to blink SOS in Morse code repeatedly. In Morse code SOS is S:"..." O:""
S:"..." where each '.' is a shorter blink and a '-' is a longer blink. According to The International
Morse Code Standard (on Wikipedia)6 the relative lengths of times between dots and dashes are
as follows:
Make the delays (time length of a dot) by using a for-loop that counts to a large enough value.
note: Make sure you disable the watchdog timer at the very beginning of the program.
6 http://en.wikipedia.org/wiki/Morse_code
13
P1DIR |= 0x01;
0x01 in hex is equivalent to 0b00000001 in binary. You may refer to the module about Binary and Hex-
adecimal Notation7 to learn how to do this conversion or you could use the Windows Calculator (Start-
>Run...->'Calc') to do it quickly. We can now easily see that P1.0 is set to 1 which makes it an output.
note: Remember to use |= instead of just = because it won't overwrite bits that are not set to 1
in the mask.
P1OUT ^= 0x01;
The XOR operation will invert the bit in question so that we may toggle it regardless of its current state. If
this doesn't make sense, do the computation by hand to see how that single bit is ipped.
Solution to Exercise 1.4 (p. 9)
#include "msp430x20x3.h"
void main(void)
{
P1DIR |= 0x01; // Set P1.0 as output
P1OUT |= 0x01; // Set P1.0's output value as high (turns the LED on)
}
0001110010000110
For practical reasons, a programmer would rather use the equivalent assembly representation for the previous
operation.
This is a typical line of assembly. The op code ADD instructs the processor to add the operands R2 and R6,
which are the contents of register R2 to register R6, and store the results in register R6. The ";" indicates
that everything after that point is a comment, and is not used by the system.
Assembly has a one-to-one mapping to machine language. Therefore, each line of assembly corresponds
to an operation that can be completed by the processor. This is not the case with high-level languages. The
assembler is responsible for the translation from assembly to machine language. The reverse operation is
completed by the dissasembler.
Assembly instructions are very simple, unlike high-level languages. Often they only accomplish a single
operation. Functions that are more complex must be built up out of smaller ones.
The following are common types of instructions:
• Moves:
1 This content is available online at <http://cnx.org/content/m13626/1.1/>.
15
CHAPTER 2. LAB 2: INTRODUCTION TO EMBEDDED ASSEMBLY
16
PROGRAMMING
• Computation:
· Add, subtract, multiply, or divide. Typically, the values of two registers are used as parameters
and results are placed in a register
· Perform bitwise operations, taking the conjunction/disjunction (and/or) of corresponding bits in
a pair of registers, or the negation (not) of each bit in a register
· Compare two values in registers (>, < , >=, or <=)
• Control Flow:
· Jump to another location in the program and execute instructions there
· Jump (branch) to another location if a certain condition holds
· Jump to another location, but save the location of the next instruction as a point to return to (a
call)
2
2.2 2.2 - Structure of an Assembly Program
The assembly program begins execution at the reset interrupt. The reset interrupt is the rst thing that
occurs when power is given to the processor. By default in the Workbench les, the reset interrupt is loaded
to send the execution of the program to the start of the written code. Until a branch is reached, the processor
will execute each instruction in turn. If the program does not loop back to an earlier point to keep going,
eventually the execution will reach the end of the valid instructions in memory and attempt to execute the
"instructions" in the following memory addresses (which are invalid and possibly gibberish). You should
never let this happen.
The control of a programs execution is called control ow, and it is accomplished through branching,
jumping, function calls, and interrupts. Interrupts are the subject of future labs. Branching and jumping
refer to changing the next instruction from the next one sequentially to an instruction elsewhere in the
2 This content is available online at <http://cnx.org/content/m13627/1.2/>.
17
program. By branching to an instruction above the branch itself you can cause the program to repeat itself.
This is a basic loop in assembly. Branches can also be conditional. In the MSP architecture conditional
branches are generally dependent on the status register (SR) bits to decide whether to execute the next
instruction after the branch or the instruction the branch species. Many arithmetic and logical operations
can set the relevant bits in the status register; check the ez430's User's Guide for which ones you will need.
A full description of each of the Assembly instructions for the ez430 can be found in Section 3.4.
To store values to perform operations, you must use the ez430's registers to store values. The ez430 has
16 CPU registers. Of these 16, the upper 12 are general purpose 16 bit registers (R4-R15). The lower four
are:
• R0 Program Counter(PC) This register controls the next instruction to be executed by the MSP core.
In general, this register is incremented automatically during execution. It can be used as a source in
operations normally.
• R1 Stack pointer (SP) The stack pointer is used to keep track of previous execution modes and to
return from interrupts. Can be read as a normal register.
• R2 Status Register (SR) The status register can be written to change the operating mode of the
MSP as specied in the User's Guide. When read it can act as a constant generator. Depending on
the instruction code options this register will be read as: a normal register, 0x0000, 0x0004, or 0x0008
depending on the As bits.
• R3 Constant Generator II This register cannot be written to, and when read produces: 0x0000,
0x0001, 0x0002, or 0x depending on the As bits.
The rest of the registers on the ez430 behave as if they were memory. In most cases, these special purpose
registers can be read and written to normally but they aect the behavior of their respective systems.
Once you understand the basics of assembly you should be able to write some simple routines. Once you
create a new Assembly project in Workbench, replace the default code with the following. You'll see that the
Watchdog timer has already been deactivated. Put your assembly code in the place indicated. Also, notice
the dierence in location of instructions and labels. Labels, which mark the begining of certain blocks of
code, are left aligned such as the "RESET" seen below. Instructions, however, are tabbed over. Remember
to follow this convention because the compiler will assume anything left aligned is a label.
#include "msp430x20x1.h"
;-------------------------------------------------------------------------------
ORG 0xF800 ; Begining PsuedoOP
;-------------------------------------------------------------------------------
RESET mov.w #0x280,SP ; Set stackpointer
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
ORG 0xFFFE ; MSP430 RESET Vector
DW RESET ;
END
CHAPTER 2. LAB 2: INTRODUCTION TO EMBEDDED ASSEMBLY
18
PROGRAMMING
3
2.3 2.3 - Lab 2: Introduction to Assembly Language
In this lab you will be asked to write simple assembly statements, follow already written assembly statements,
and nally to reproduce the SOS light blinking program from Lab 1 in assembly.
Exercise 2.1
Formulate instructions to do the following things:
1. Set bit 3 to 1 at the memory address 0xd640 while leave bits 0-2 and 4-16 unaected.
2. Jump to the instruction labeled POINT if the carry bit is set.
3. Shift register R6 right one place while preserving the sign.
Exercise 2.2
Examine this loop:
Start_loop:
Dec.w #0x0001, R4
JZ After_loop
BR #Start_loop
After_loop:
...more instructions...
Exercise 2.3
Re-write the blinking light program from Lab 1 using assembly code instead. As you may recall,
the program must blink "SOS" (which is "... ...") and conform to the following Morse Code
standards:
Lab 3: Clocking
1
3.1 3.1 - What is a digital clock?
The clock of a digital system is a periodic signal, usually a square wave, used to trigger memory latches
simultaneously throughout the system. While no part of this denition is strictly true, it does convey the
basic idea (think ipping a light switch on and o at a certain speed). Square waves are used because the
quick transitions between high and low voltages minimize the time spent at uncertain digital levels. The
clock ideally reaches all parts of the system at the same time in order to prevent sections from getting out
of sync. Clock signals are generally periodic because the user wants to run the system as fast as possible,
but this is often not a necessary attribute.
Figure 3.1
Clock signals are used to synchronize digital transmitters and receivers during data transfer. For example,
a transmitter can use each rising edge of the clock signal of Figure 1 to send a chunk of data.
A faster clock rate all means that you can process more instructions in a given amount of time at the
cost of an increased power consumption.
2
3.2 3.2 - Clock System on the ez430
The clock system on the ez430 is designed to be exible and low powered. The implementation of these goals
is largely based on the ability to select dierent clock speeds for dierent parts of the chip. By choosing
1 This content is available online at <http://cnx.org/content/m13658/1.1/>.
2 This content is available online at <http://cnx.org/content/m13659/1.1/>.
19
20 CHAPTER 3. LAB 3: CLOCKING
the minimum clock speed necessary for a given module, power consumption is reduced and the particular
synchronization needs of the module can be met.
Our ez430 technically has two main clock sources for the clocking system, and three clock lines that chip
systems can choose between. The clock sources are used as the basis for the clock lines, and this allows for
a mix of slow and fast clocks to be used around the system. Currently, without modication, our tool only
supports one.
Clock Sources
1. Low Frequency Crystal Clock (LFXTCLK) This clock is sourced from an external crystal (with
an intended oscillation of ∼32kHz) that does not exist by default on the ez430. Theoretically, we could
attach the crystal to the XIN/XOUT pins and be able to use this as a clock source although such a
procedure is not necessary for this course. This crystal would be the source of the Auxiliary Clock
(ACLK), one of the three clock lines discussed below
2. Digitally Controlled Oscillator Clock (DCOCLK) this is the only internally generated clock
input, and it is the default clock source for the master clock upon reset. By default this clock runs at
about 1MHz, but the RSELx, MODx, and DCOx bits allow this to be divided down or even blended
to achieve a lower clock frequency on average. Chapter 4 of the User's Guide outlines specic ways
to congure the DCOCLK to operate at the desired frequency.
Clock Lines
1. Master Clock (MCLK) This clock is the source for the MSP CPU core; this clock must be working
properly for the processor to execute instructions. This clock has the most selection for its source. The
source is selected with the SELMx bits of the Basic Clock System Control Register 2 (BCSCTL2). The
divider is controlled with the DIVMx of the BCSCTL2. Finally, the CPU can be turned o with the
CPUOFF bit of the Status Register (SR), but to recover from this state an interrupt must occur.
2. Submaster Clock (SMCLK) - This clock is the source for most peripherals, and its source can
either be the DCO or Crystal 2. The source clock is controlled with the SELS and SCG bits of the
BCSCTL2 and SR. The divider is controlled by the DIVSx bits of the BCSCTL2.
3. Auxiliary Clock (ACLK) - this clock line's source is always LFXTCLK. It is an option for slower
subsystems to use in order to conserve power. This clock can be divided as controlled by the DIVAx
bits of the Basic Clock System Control Register 1 (BCSCTL1).
The MSP clock system has dividers at the beginning of its clocks, and at most peripheral destinations.
This allows for each module to keep a separate timing scheme from other modules by dividing the input
frequency and then outputting it. The simplest dividers are multiples of two, thus the output might be a
square wave of one half, quarter, or eighth the input square wave's frequency. This is often necessary for
o chip buses because these systems have to meet a variety of speed requirements from the outside. For
educational purposes the fastest clocks are usually the most useful, but remember that power consumption
is the primary cost of high speed clocks.
3
3.3 3.3 - Lab 3: Clocking on MSP430
The following exercise will show you how to manipulate the clocking system on the ez430. You will need to
refer to the ez430's Schematic and User's Guide to correctly congure the clock as specied.
Exercise 3.1
Clock Setup
In order to easily check the state of the clock, output MCLK/SMCLK (they are both defaulted
to the same source) from a pin header (HINT: Output the SMCLK from P1.4 on pin 6). Use the
oscilloscope to observe the frequency of the clock, and to see the impact of the changes you will
make.
3 This content is available online at <http://cnx.org/content/m13661/1.1/>.
21
1. Without modifying the clock registers any further, at what clock rate is the processor running
at? How is the clock currently congured in order to produce this built-in clock signal? In
other words, what is the clock's source and how is the source congured?
2. Write code that sets the DCOCLK to operate at 8MHz. You should be able to do it in just
two lines of code. We will use this clock setup for all future programs unless otherwise noted.
3. Using your new (8MHz) timer settings and your SOS light system from Lab 1, modify the
code so that each "dot" and "dash" delay is for approximately the same ammount of time.
Basically, generate the same behavior as the original version but using the new clock settings.
What were the original (much slower) settings for the clock? What was changed in order to
keep the original blink rate?
Exercise 3.2
VLO Clock Setup
The following is code to set the MSP430 to operate o of the VLO clock. The only problem is
that it doesn't work. Macro denitions and logic operations are incorrectly used (although the
comments are correct). Without adding or removing any lines of code, properly source the MSP430
o the VLO clock.
An interrupt is an event in hardware that triggers the processor to jump from its current program counter
to a specic point in the code. Interrupts are designed to be special events whose occurrence cannot be
predicted precisely (or at all). The MSP has many dierent kinds of events that can trigger interrupts, and
for each one the processor will send the execution to a unique, specic point in memory. Each interrupt
is assigned a word long segment at the upper end of memory. This is enough memory for a jump to the
location in memory where the interrupt will actually be handled. Interrupts in general can be divided into
two kinds- maskable and non-maskable. A maskable interrupt is an interrupt whose trigger event is not
always important, so the programmer can decide that the event should not cause the program to jump.
A non-maskable interrupt (like the reset button) is so important that it should never be ignored. The
processor will always jump to this interrupt when it happens. Often, maskable interrupts are turned o
by default to simplify the default behavior of the device. Special control registers allow non-maskable and
specic non-maskable interrupts to be turned on. Interrupts generally have a "priority;" when two interrupts
happen at the same time, the higher priority interrupt will take precedence over the lower priority one. Thus
if a peripheral timer goes o at the same time as the reset button is pushed, the processor will ignore the
peripheral timer because the reset is more important (higher priority).
The function that is called or the particular assembly code that is executed when the interrupt happens
is called the Interrupt Service Routine (ISR). Other terms of note are: An interrupt ag (IFG) this is the
bit that is set that triggers the interrupt, leaving the interrupt resets this ag to the normal state. An
interrupt enable (IE) is the control bit that tells the processor that a particular maskable interrupt should
or should not be ignored. There is usually one such bit per interrupt, and they are often found together in
a register with other interrupt enable bits. The most important interrupt on MSP430 is the reset interrupt.
When the processor detects a reset or powers up for the rst time, it jumps to the beginning of memory and
executes the instructions there. The highest priority interrupt vector begins at the address 0xFFFE. The
lowest priority interrupt begins at 0xFFE0. The complete set of interrupts is ranked by priority:
• 8 - non-maskable : External Reset, Power-up, Watchdog Timer Reset, Flash Key Violation, NMI
• 7 - non-maskable : Oscillator Fault, Flash Memory Access Violation
• 6 - maskable : Watchdog Timer
• 5 - maskable : Timer A Capture Compare Register 0 (CCR0) Interrupt
• 4 - maskable : Timer A Capture Compare Register 1 (CCR1) Interrupt
• 3 - maskable : Sigma/Delta 16 bit (SD16) Converter Interrupt
• 2 - maskable : Universal Serial Interface (USI) Interrupts
• 1 - maskable : Port 2 I/O Interrupts
1 This content is available online at <http://cnx.org/content/m13650/1.1/>.
23
24 CHAPTER 4. LAB 4: INTERRUPTS AND TIMERS
1. The program counter as it is after the above instruction is pushed onto the stack. The stack is memory
whose contents are kept in last in rst out order. The stack pointer is always updated to point to
the most recent element added to the stack. This allows the processor to call functions and track
interrupts. When something is pushed onto the stack, the stack pointer is incremented and the pushed
data is written to that location. When you copy out of the stack and decrement the stack pointer, this
is called popping something o the stack.
2. The status register is pushed onto the stack.
3. The highest priority interrupt waiting to occur is selected.
4. Single source interrupts have their interrupt request ags reset automatically. Multiple source interrupt
ags do not do this so that the interrupt service routine can determine what the precise cause was.
5. The status register with the exception of the SCG0 bit is cleared. This will bring the processor out of
any low-power modes. This also disables interrupts (the GIE bit) during the interrupt.
6. The content of the interrupt vector is loaded into the program counter. Specically the processor
executes the instruction at the particular memory location (the interrupt vector) for that interrupt.
This should always be a jump to the interrupt service routine.
The interrupt service routine is the code that the programmer writes to take care of the work that needs
to be done when a particular interrupt happens. This can be anything you need it to be. Because entering
the interrupt turned o the GIE bit, you will not receive any interrupts that happen while you are still in the
interrupt service routine. You can turn the interrupts back on if you need to receive interrupts during your
interrupt, but usually it is a better idea to make interrupt service routines shorter instead. In C interrupts
are simply functions with special declarations. You never call these functions; the compiler simply sets up
the interrupt vector table to call your function when the particular interrupt occurs.
This example interrupt is pulled from the msp430x20x3_wdt_01.c example le by Mark Buccini. The
complete le can be found on the Ti-ez430 homepage.
Interrupt functions should always be void and accept no arguments. This particular interrupt service
routine (ISR) is called watchdog_timer, but the name does not matter. The way the compiler knows that
this function should handle the watchdog timer interrupt is what follows the function name. the #pragma
vector = indicates that this is an interrupt and WDT_VECTOR is a macro from the MSP header le that
indicates the interrupt vector being used. Every interrupt vector in the processor has a macro dened for it
(which can be found in the header le). To attach this interrupt service routine to a dierent interrupt, all
you need to do is change the WDT_VECTOR to one of the other macros dened in the ez430 header le.
When the end of the ISR is reached the MSP executes a precise set of steps to pick up the execution of
the program where it left o before the interrupt occurred. This process takes 5 cycles.
1. The status register and all previous settings pops from the stack. Any alterations to the status register
made during the interrupt are wiped away.
2. The program counter pops from the stack and execution continues from where it left o.
25
2
4.2 4.2 - Timers
The Timer systems on the ez430 are a versatile means to measure time intervals. The timer (called Timer
A) can measure the timing on incoming signals or control the timing on outgoing signals. This function
is necessary to meet arbitrary timing requirements from outside components, and the ability is useful in
phase locking scenarios etc. The Timer system is one system (and the most common system) to make use of
interrupts Interrupts and Timers are bing introduced in tandem to illustrate this operation although they
are seperate entities.
The most basic operation of the timer systems is that the counter in the module increments for each clock
cycle. The timer clocks can be sourced from any of the clock lines discussed in Lab 3. The incoming source
can be divided down by multiples of two before entering the counter. The user's guide for the MSP has good
diagrams on the architecture of the system in the respective sections for the timer. Below the features and
uses of Timer A are outlined.
2 This content is available online at <http://cnx.org/content/m13651/1.1/>.
26 CHAPTER 4. LAB 4: INTERRUPTS AND TIMERS
Please note that the word count is used above- if the timer is set to a certain number it will not trigger
anything. The timer must count from the number below to the target number to trigger eects.
as explained above. Here this simply means the interrupt handles the second module. However, in other
devices that have more capture/control registers, this interrupt would handle this entire set of modules.
Each module can be individually masked or enabled, and a special register stores which module caused the
interrupt. As with all maskable interrupts, setting the general interrupt enable is necessary to receive them.
The interrupts are important in being able to perform complex operations as new data arrives.
3
4.3 4.3 - Watchdog Timer
4
4.4 4.4 - Lab 4: Timers and Interrupts
In this lab, we will cover the timing options for the ez430. The rst part explains the clocking system of the
processor and the options it allows while the second part covers the timers and timer interrupts available
on the ez430. Each of these sections is strongly related to real time programming, but that topic will be
dealt with separately in another lab. In general, a real-time application is one which responds to its inputs
as fast as they happen. The microprocessor is generally expected to take less time to handle an interrupt
or stimulus than the time before the next event will happen. The timer system is broken into two primary
parts on the ez430 Timer A and the Watchdog timer.
Exercise 4.1
Timer A
Refer to Chapter 8: Timer_A User's Guide to get a detailed description of all the options in
Timer A. Basically, setting up the timers requires that you dene a source for the timer and to
specify a direction for the count. It may also be helpful to clear the timer register before you begin
to guarantee and accurate count from the rst instance. Set up Timer A in Continuous Mode and
sourced from SMCLK. Set TACCR0 and TACCR1 to have two dierent values. Output TA0 and
TA1 from Pins 3 and 4 (o of P1.1 and P1.2) of the board so that you may directly observe the
output of Timer A.
3 This content is available online at <http://cnx.org/content/m13652/1.2/>.
4 This content is available online at <http://cnx.org/content/m13653/1.2/>.
28 CHAPTER 4. LAB 4: INTERRUPTS AND TIMERS
Using two dierent channels of the Oscilloscope try to recreate parts of Figure 8-13. Output
Example- Timer in Continuous Mode. On Channel 1 show Output Mode 4: Toggle and
on Channel 2 show Output Mode 6: Toggle/Set. Vary the TACCTLx in order to get as close
to the orginal gure as possible. Take a screenshot of the scope and include it in your lab report.
Exercise 4.2
Timer
Set up the timers to re interrupts to calculate time intervals and redo the SOS problem from
Lab 1 (Section 1.5) using the timer to simulate the "dot" and "dash" time intervals. There should
be NO COUNTING LOOPS in your program, and your program should be entirely interrupt
driven. It is possible to have each Capture Control Register to re an interrupt once it reaches its
max value. Explain how you setup Timer A to simulate each time interval.
Exercise 4.3
Duty Cycle
We have discussed earlier that the Duty Cycle is related to the width of a pulse. If we trigger an
LED with a relatively high frequency square wave, it will appear to be lit constantly even though
it is actually switching on and o quickly. As we vary the duty cycle of our trigger signal, the LED
may appear to get dimmer or brighter depending on which way we vary it.
Set up the timer to toggle the LED. Without changing the frequency of your timing pulse,
change the duty cycle so that the LED appears to fade in and out. The time it takes to go from
completely o to max brightness shouldn't take more than a second, then it should repeat. Once
again, there should be no counting loops in your program, and you can use Timer A in any way
you wish.
Once you get a single light to fade in and out, create another program with a function to set
the LED at a certian brightness level when given atleast a 12 bit integer. For example, if I were
to call LED_level(0x111), the LED should appear very dim; if I were to call LED_level(0xFA0),
the LED should appear very bright. It may be helpful to have an extra function that initializes the
Timer settings so that the use of this application is self contained. In the future, we will use this
function to provide visual feedback when using other components.
Chapter 5
In the early days of computers, the instruction memories of main frames were incredibly small by today's
standards, only in the hundreds or thousands of bytes. This small capacity emphasized making each instruc-
tion count and each value saved necessary. Fortunately, just as processors have exponentially increased in
speed, program memory has similarly increased in capacity. Even though it seeme like there is an abun-
dance, there are still general practices that must be kept in mind when using program memory. Also, smaller
platforms, like microcontrollers, are still limited to memory capacities in the kilobytes. This module explains
the kinds of memory, common memory organizations, and the basics of conserving memory.
29
30 CHAPTER 5. LAB 5: OPTIMIZATION AND LOW POWER MODES
great threat to the overall supply of memory compared to other memory leaks. Embedded systems, however,
must avoid deep layers of function calling or risk exhausting the overall supply of memory.
There is a programming technique called recursion, which uses deep layers of function calling, where a
function calls itself repeatedly on progressively smaller or simpler versions of the data until the answer is
trivial (a base case). While this technique leads to some very clever solutions to some complex problems, it
is uses large amounts of memory to achieve this end. Therefore, recursion is generally a poor choice when
dealing with microcontrollers.
Another way to waste memory is to create too many global variables. Specically, variables whose scope
could be local to a function or that could be allocated dynamically waste memory because they take up
space even when not in use.
2
5.2 5.2 - Improving Speed and Performance
So far in this course, programming assignments have focused on functionality. In most applications of
embedded programming, speed and power performance are equally important. Long battery life is won
through judicious hardware and software design. Skillful programming will allow the same job to be done
with cheaper parts to improve the bottom line. This lab will introduce the basic concepts behind power and
speed performance improvement.
There are many approaches to improving speed performance. Incredible amounts of research go into new
algorithms for common problems to improve the way that problem is solved. However, simply eliminating
unnecessary instructions is a good start to improving performance. Test code left in a nal version, any
unnecessary instructions in a loop, and can all signicantly increase the time in a section of code.
• In C, unnecessary code takes the form of too many method calls inside of a loop (because each method
call adds a layer to the heap). While this is only a slight eciency loss for code that is only executed
once per sample, the loss can be very damaging if multiplied by a large loop. When trying to reduce
execution time, it is best to start with the regions of the code where the processor spends the most time.
Parts of the program that are only executed rarely have only a small eect on the speed compared to
a loop that might run 100 times per sample. For example, if something can be done once, outside of
the loop, do not do it many times inside of the loop.
• Remember to make judicious use of timers and other instruction saving interrupts. The timer interrupts
allow the processor to periodically check on the status of the program without the use of slow while(1)
or for(;;) loops (polling). However, for correct program behavior, it is important to do the minimum
possible work in an interrupt. This is most important with interrupts that happen frequently because
the control ow of the program can be thrown o when interrupts happen faster than the system
can handle. If the same interrupt occurs a second time before the rst occurrence of the interrupt
has completed, program behavior is much more dicult to control (essentially we have a recursive
interrupt call). It is much easier to simply ensure that the interrupt is short enough to avoid the
danger all together.
• Also, avoid recalculating values. If a piece of information is reusable, save it rather than recalculating
it to save time. Sometimes memory is so scarce that this may not be possible.
• Don't output to the console while debugging unless you absolutely must. Program ow is hampered
immensley and program behavior might not reect the behavior without the debug statement. Use
breakpoints instead because the execution of the program is paused and the processor does not have
to use any extra resources.
• Don't leave legacy code from previous revisions. If you believe you may no longer need a part of
the program, comment it out and note what you did in the comments. Even seemingly innocuous
statements here and there in your code can slow overall performance.
4
5.3 5.3 - Reducing Power Consumption
One of the most important quality standards for battery powered devices is battery life. Handheld medical
tools, electricity meters, personal digital assistants, and a goal of the designer and programmer is to lower
the power use of the embedded system to negligible levels. This portion of the lab will give an overview of
how power can be conserved using hardware and software. In designing battery powered devices, savings can
be gained from the choice of electronic components, the arrangement of components, and the software on
the design. The exercises will integrate the low power modes of the MSP into existing labs, so that examples
of software power savings can be shown.
Connection Diagram
Figure 5.1: Connecting the Ammeter in serial as shown will allow for you to measure current con-
sumption.
The following is what it would look like if we actually connected everything together. (Notice that I have
added sockets (DigiKey Product ID: **********) to the "fully accessible" pins to make them more fully
accessible.
34 CHAPTER 5. LAB 5: OPTIMIZATION AND LOW POWER MODES
Connection Picture
Figure 5.2: Here, I have created the setup using parts from around the lab.
vary the degree to which the processor is aware of its surroundings and the clocks that the processor keeps
running. The processor lowers power consumption partly by shutting o external and internal oscillators.
There are four low power modes in addition to regular operating mode on the MSP430:
• Active Mode is the fully powered mode when the processor executes code and all clocks and peripherals
are active. The chip consumes about 340 µA with 1 MHz clock at 3.3V in this mode.
• Low Power Mode 1 (LPM1) disables the CPU and MCLK while leaving the ACLK and SMCLK
enabled. This allows timers, peripherals, and analog systems to continue operation while dropping
current consumption to about 70 µA with 1MHz clock at 3.3V. Because the timers and other internal
interrupt systems still operate, the processor will be able to wake itself.
• Low Power Mode 2 (LPM2) disables the CPU, MCLK, and the DCO are disabled but the SMCLK and
ACLK are active. The DC is disabled if the DCO is not used for MCLK or SMCLK in active mode.
Internal interrupts can still operate. Current consumption drops to about 17 µA.
• Low Power Mode 3 (LPM3) disables the CPU, MCLK, SMCLK, and DCO. The DC and ACLK remain
active. This allows some peripherals and internal interrupts to continue. Current consumption drops
to about 2 µA.
• Low Power Mode 4 (LPM4) Current consumption drops to about .1 µA, but all clocks and the CPU
are disabled. This prevents any of the on-chip modules from operating, and only o-chip interrupts
can wake the device.
To enter a low power mode the status register in the CPU must be set to indicate the desired mode.
Specically the bits SCG1, SCG0, OSCOFF, and CPUOFF. The User's Guide details the specic bits
needed. Also provided in the chapter is some example code on changing power modes. To exit low power
mode, an interrupt is needed. In the interrupt, the previous status register state can be altered so that
exiting the interrupt will leave the processor awake. The User's Guide explains in detail the specics of
entering and leaving low power mode. Example code with the compiler also demonstrates the low power
modes.
5
5.4 5.4 - Lab 5: Optimization and Low Power Modes
long fibo(int n)
{
if (n < 2)
return n;
else
return fibo(n-1) + fibo(n-2);
}
It recursively calculate the nth number in a Fibonacci sequence recursively. Recursion makes this
piece of code easier to read, however, it is very inecient and consumes far more memory than it
has to. If you try to compute a large number, say fibo(50), then it will take much longer and will
consume more power than it should.
The original program is very inecient and wastes memory in several of the ways described
in the inecient Memory Conservation6 module. Modify the code to eliminate the memory waste
and improve the speed of the program. Note that there is a tradeo between speed and memory
(though at rst the program is simply gratuitously wasteful). What is the nature of the tradeo?
Assuming the one addition takes one cycle to complete, how long would it take the original code
to complete fibo(50)? How long would it take your new, improved version? Assume that you are
only considering the addition operations.
Exercise 5.2
Low Power Modes
Modify your project so that the processor remains in one of the low power modes whenever it is
not doing any calculations. Wake up from the low power mode using a timer interrupt (change the
timer settings so that there is a substantial time period between interrupts) and have your program
compute fibo(50). You may want to make the program compute bo(50) more than once so that
the MSP is in the ISR performing an intensive task for longer and thus make it easier to read the
current consumption value. Output the result to the standard out display. What is the result?
(Hint: 12,586,269,025) Make sure the result is correct number. As soon as the calculation is done,
return to low power mode. Perform the same process to calculate the current consumption during
the use of your Fibonacci function. You should have measured three current consumption values: 1)
in the low power mode, 2) while processing fibo(50), and 3) while processing the 50th Fibonacci
number using your function.
note: A number must be small enough to t in its given type. If it is too large, you may get
unpredictable results. Try using a long long for extra huge numbers. Because of our printf
settings, we cannot output such large data types. You must use bit-wise operations to separate the
number into smaller chunks suitable for printing.
From now on, instead of while(1) at the end of programs, simply place the tool into a low power
mode. This will allow future applications to more closely resemble and operate as real-world
embedded programming.
37
38 CHAPTER 6. LAB 6: PROGRAMMING THE FLASH
Chapter 7
Sampling refers to the process of converting a continuous, analog signal to discrete digital numbers. Typ-
ically, an Analog to Digital Converter (ADC) would be used to convert voltages to a digital number
corresponding to a certain voltage level.
Figure 7.1: This shows the way that a given analog signal might be sampled. The frequency at which
the signal is sampled is known as the sampling rate.
7.1.1 Resolution
The number of bits used to represent a sampled, analog signal is known as the resolution of the converter.
This number is also related to the total number of unique digital values that can be used to represent a
signal.
For example, if a given ADC has a resolution of 12 bits, then it can represent 4,096 discrete values, since
2^12 = 4,096; if the resolution is 16 bits, it can represent 65,536 discrete values.
1 This content is available online at <http://cnx.org/content/m13671/1.1/>.
39
40 CHAPTER 7. LAB 7: ANALOG TO DIGITAL CONVERSION
We may also think about resolution from an electrical standpoint, which is expressed in volts. In that
case, the resolution the ADC is equal to the entire range of possible voltage measurements divided by the
number of quantization levels. Voltage levels that fall outside the ADC's possible measurement range will
saturate the ADC. They will be sampled at the highest or lowest possible level the ADC can represent.
For example, ADC specications could be as follows:
2
7.2 7.2 - Analog-to-Digital Converter on the MSP430
The analog to digital converter (ADC) on the ez430 is a type called a Sigma-Delta (SD) Converter. The
way it operates is slightly dierent from what was described in the previous section (although the end result
is the same) but those specics are out of the scope of this course. The SD converter on the ez430 has 8
channels and a 16 bit resolution. The module is highly congurable and can run largely free of program
involvement. In this portion of the lab, we will broadly explain the features of the module, but the particular
eects of each register are listed, as usual, in Chapter 12 of the User's Guide.
Here is a pin diagram corresponding to the 14 accessible pins showing which pins correspond to which input
channels. Notice that each channel has a "+" and a "-" input. Although with other ADC's, we would
simply have one input pin and connect the other to the ground, the SD converter requires us to connect the
positive and negative inputs to the corresponding input channels. Note that the numbers from 1-14 on the
chip correspond to pins 1-14 on the target board.
Pin Map
Figure 7.2: Shows which pins correspond to specic SD converter inputs. Also shows which pins
correspond to specic ports (i.e pin 4 is connected to P1.2).
• Be sure to enable SD16 interrupts (on SD16CCTL0) and to select the specic channel which you are
using (on SD16INCTL)
• After conguring the ADC, you must enable the SD16SC bit to start conversion.
• All ADC values will be stored in the SD16MEMx variable where "x" is the number of the channel
The User's Guide will be very useful for this lab because of the complexity of this part of the MSP430.
Be sure to go over the chapter atleast briey before jumping into programming.
42 CHAPTER 7. LAB 7: ANALOG TO DIGITAL CONVERSION
3
7.3 7.3 - Lab 7: The ADC
7.3.1
Exercise 7.1 Background Questions
1. The ez430 has a 16 bit SD Converter. The number of bits used by the ADC is known as
its resolution. What are the number of possible values that the 16 bit SD Converter can
represent?
2. Extreme voltages, either too high or too low, cannot be measured correctly. What is the
range of analog voltages that can be accurately represented on the ez430? You may want to
check the User's Guide or experiment with the hardware.
3. In the real world, signals are polluted by "noise" that alters the quality of the original signal.
Signal to Noise Ratio, SNR, is often used as a measure of the quality of a signal. Before a
signal is sampled through the ADC, it is helpful to condition the signal in order to improve
its SNR. What can be done to condition the signal? Where would it be ideal to condition it
and why? (i.e. at the ADC, near the source, at the processor?)
4. The Nyquist Theorem states that a signal must be sampled at least twice as fast as the
highest frequency in order to be decoded without error. The minimum sampling frequency is
therefore known as the Nyquist Sampling Rate. Typical, audio CDs are sampled at a rate of
44.1 kHz, and can be decoded to 65,536 unique voltage levels. What is the highest frequency
that can be represented without error? How many bits per sample are used? What is the
total data rate for a stereo CD?
#include "msp430x20x3.h"
void main(void)
{
while (1) {
}
note: Most modern compilers intended for use with embedded processors, such as the IAR
Workbench, allow the user to check the status of the registers while the program is halted.
This is extremely helpful in debugging code. For example, if the program is halted with a
_NOP() after a sample is taken from the ADC, the user may check the SD16MEMx register (by
setting a breakpoint at the _NOP() command) to see the new value that has been stored. If
a value has changed since the last time the processor was halted, it will turn red in the watch
window.
2. Create a version of the program that is completely interrupt driven. The original program
uses a while-loop to poll for the interrupt ag. What is the sampling rate? Remember to put
the processor into a low power mode and enable interrupts after conguring the SD Converter
as discussed in Lab 5
Exercise 7.3
LED Dimmer
Add the le containing the LED dimmer function you wrote in Lab 4 to a new project in which
you congure the SD Converter. Attach a Photo Diode (DigiKey# ********), a diode that outputs
a voltage depending on the ammount of light that hits it, to any one of the SD16 inputs. Input
the SD16MEMx value into the LED dimmer function in such a way that the LED's brigtness is
indirectly propotional to the ammount of light that hits the Photo Diode. In other words, if we
block the light to the diode, the LED should appear brighter; if we shine light on the diode, the
LED should appear dimmer. If you do not have access to a Photo Diode, simply set the input to
the integrated temperature sensor and perform the same exercise.
Exercise 7.4
Flash Storage
Now, chose any analog source (temperature sensor, Photo Diode, function generator etc.) on any
input channel and store the values in ash using what you learned in Lab 6. After a specic number
(that you select) of samples are stored, have your program output the values using the printf with
the help of a for or while loop. Then take the values and plot them on a graph. You may want
to store every 10th (or 20th or 50th etc.) sample in ash to be able to see the analog signal over a
longer period of time.
44 INDEX
Keywords are listed by the section with that keyword (page numbers are in parentheses). Keywords
do not necessarily appear in the text of the page. They are merely associated with that section. Ex.
apples, 1.1 (1) Terms are referenced by the page they appear on. Ex. apples, 1
A A0, 41 dissasembler, 15
A1, 41 Dissassembly, 7
A2, 41
A3, 41 E ez430, 1.1(1), 1.2(1), 1.3(8), 1.4(10),
A4, 41 1.5(10), 2.1(15), 2.2(16), 2.3(18),
A5, 41 3.1(19), 3.2(19), 3.3(20), 4.1(23),
A6, 41 4.2(25), 4.3(27), 4.4(27), 5.1(29),
A7, 41 5.2(31), 5.3(32), 5.4(35), 7.1(39),
adc, 7.1(39), 7.2(40), 7.3(42) 7.3(42)
Aliasing, 40
Analog to Digital Converter (ADC), 39
F Figure 8-13. Output Example- Timer in
Continuous Mode, 28
analog-to-digital converter, 7.2(40)
asm, 2.1(15) G garbage collector, 30
assembler, 15 Go, 7
assembly, 2.2(16), 2.3(18)
assembly code, 1 H header, 1
assembly language, 2.1(15), 15 Heap Memory, 29
Auxiliary Clock (ACLK), 20, 20 high-level, 1
Attributions
About Connexions
Since 1999, Connexions has been pioneering a global system where anyone can create course materials and
make them fully accessible and easily reusable free of charge. We are a Web-based authoring, teaching and
learning environment open to anyone interested in education, including students, teachers, professors and
lifelong learners. We connect ideas and facilitate educational communities.
Connexions's modular, interactive courses are in use worldwide by universities, community colleges, K-12
schools, distance learners, and lifelong learners. Connexions materials are in many languages, including
English, Spanish, Chinese, Japanese, Italian, Vietnamese, French, Portuguese, and Thai. Connexions is part
of an exciting new information distribution system that allows for Print on Demand Books. Connexions
has partnered with innovative on-demand publisher QOOP to accelerate the delivery of printed course
materials and textbooks into classrooms worldwide at lower prices than traditional academic publishers.