The primary difference 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 differences 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 specific 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 efficiently performed. In general, you should avoid floating point decimal calculations on the ez430 because it does not have special hardware to support the complicated algorithms used.
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};
for (i=0; i<19; i++){
for (j=0; j<9-i; j++){
if (a[j+1] < a[j]) {
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
while(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? - Use any of the methods listed above to show the updated array. What is the final result?
- Modify the code so that it prints the final 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 benefits of using
printf
over setting a breakpoint?
#include "stdio.h";
Then, select
Project->Options , the
Library Options tab in
General Options , and finally select
Tiny in the
Printf formatter drop down menu.
The
printf()
function will print to standard 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.Functions
Multiplications and division are very complex operations to do on any microprocessor. The operations should be avoided if possible or should be replaced with simpler, equivalent operations.
- What do the operators<<and>>do?
- How could you use these operators to perform multiplication and division?
- Write the function
multiply(int x, int y)
that takes parameterx
and multiplies it byy
by using a bit shift. It must return anint
. For symplicity, it is OK to assume thaty
is a power of 2. - Next, write the function
divide(int x, int y)
that takes parameterx
and divides it byy
by using a bit shift. It must also return anint
.
Digital i/o registers
Open the header file msp430x20x3.h by right clicking the name in your code and selecting Open "msp430x20x3.h" This file contains the macros and register definitions for the ez430 we are using. Using the ez430 schematic, this header file, and ez430's User Guide please answer the following questions.
- 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) andWDTHOLD
(watchdog timer hold) section of the Watchdog 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 file. How are they different from their description in the User's Guide? Finally, write the C code required to disable it. - What are the differences among P1DIR, P1SEL, P1OUT, P1IN?
- 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?
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) the relative lengths of times between dots and dashes are as follows:
- The amount of time of a dash is equivalent in length to 3 dots.
- The amount of time between parts of a letter is equivalent in length to one dot.
- The amount of time between letters is equivalent in length to 3 dots.
- The amount of time between words (assume each SOS is a word) is equivalent to 5 dots.