ARM Lab Manual
ARM Lab Manual
ARM Lab Manual
Chikkamagaluru-577102
LAB MANUAL
(2018-19)
LABORATORY
(18CSL48)
IV Semester
VISVESVARAYA TECHNOLOGICAL UNIVERSITY
Jnana Sangama, Belagavi, Karnataka –590018
IV SEMESTER
LABORATORY
(18CSL48)
____________ __________
Mrs. Deepashri K.S B.E.,M.Tech., Dr. Sampath S M.Tech., PhD
Asst. Professor Professor & Head
Dept. of IS&E Dept. of IS&E
A.I.T Chikkamagaluru A.I.T Chikkamagaluru
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY (18CSL48)
SEMESTER – IV
Course Code 18CSL48 CIE Marks 40
Number of Contact Hours/Week 0:2:2 SEE Marks 60
Total Number of Lab Contact Hours 36 Exam Hours 03
Credits – 2
Course Learning Objectives: This course (18CSL48) will enable students to:
Program List
PART A Conduct the following experiments by writing program using ARM7TDMI/LPC2148 using an
evaluation board/simulator and the required software tool.
1 Write a program to multiply two 16 bit binary numbers 1
2 Write a program to find the sum of first 10 integer numbers. 2
3 Write a program to find factorial of a number 3
4 Write a program to add an array of 16 bit numbers and store the 32 bit result in internal RAM 4
5 Write a program to find the square of a number (1 to 10) using look-up table. 6
6 Write a program to find the largest/smallest number in an array of 32 numbers . 8
7 Write a program to arrange a series of 32 bit numbers in ascending/descending order 10
8 Write a program to count the number of ones and zeros in two consecutive memory 13
locations.
PART –B Conduct the following experiments on an ARM7TDMI/LPC2148 evaluation board using evaluation
version of Embedded 'C' & Keil Uvision-4 tool/compiler.
9 Display “Hello World” message using Internal UART. 20
AREA MULTIPLY,CODE,READONLY
ENTRY
START
NOP
NOP
NOP
END
Output
Register Value
Input R1 0X0020
Input R2 0X0220
Output R3 0X4400
ENTRY
LOOP
END
Output
Register Value
Input R1 10
Output R2 0X00000037
START
Output
Register Value
Input R0 7
4) Write a program to add an array of 16 bit numbers and store the 32 bit result in internal
RAM.
START
MOV R5,#6 ; INTIALISE COUNTER TO 6(i.e. N=6)
MOV R0,#0 ; INTIALISE SUM TO ZERO
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LOOP
LDRH R3,[R1],#02 ; READ 16 BIT DATA
ADD R0,R0,R3 ; ADD R2=R2+R3
SUBS R5,R5,#1 ; DECREMENT COUNTER
CMP R5,#0
BNE LOOP ; LOOK BACK TILL ARRAY ENDS
LDR R4,=RESULT ; LOADS THE ADDRESS OF RESULT
STR R0,[R4] ; STORES THE RESULT IN R1
JMP B JMP
OUTPUT
5) Write a program to find the square of a number (1 to 10) using look-up table.
START
LDR R0, = TABLE1 ; LOAD START ADDRESS OF LOOKUP TABLE
LDR R1,=8 ; LOAD NO WHOSE SQUARE IS TO BE FIND
MOV R1, R1, LSL#0X2 ; GENERATE ADDRESS CORRESPONDING TO
SQUARE OF GIVEN NO
ADD R0, R0, R1 ; LOAD ADDRESS OF ELEMENT IN LOOKUP TABLE
LDR R3, [R0] ; GET SQUARE OF GIVEN NO IN R3
NOP
NOP
NOP
OUTPUT
Variable Address Value
TABLE1 0X00000020(R0) 0X00000001
0X00000024 0X00000002
0X00000028 0X00000004
0X0000002C 0X00000009
0X00000030 0X00000010
0X00000034 0X00000019
0X00000038 0X00000024
0X0000003C 0X00000031
0X00000040 0X00000040
0X00000044 0X00000051
0X00000048 0X00000064
R1(INPUT) 8
R3(OUTPUT) 0X00000040
START
MOV R5,#6 ; INTIALISE COUNTER TO 6 (i.e. N=7)
LDR R1,=VALUE1 ; LOADS THE ADDRESS OF FIRST VALUE
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LOOP
LDR R4,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
CMP R2,R4 ; COMPARE NUMBERS
BLS LOOP1 ; IF THE FIRST NUMBER IS < THEN GOTO LOOP1
NOP
NOP
NOP
VALUE1
DCD 0X44444444 ;
DCD 0X22222222 ;
DCD 0X11111111 ;
DCD 0X33333333 ;
DCD 0XAAAAAAAA ;
DCD 0X88888888 ;
DCD 0X99999999 ;
OUTPUT
Variable Address Value
VALUE1 0X00000020(R0) 0X44444444
0X00000024 0X22222222
0X00000028 0X11111111
0X0000002C 0X33333333
0X00000030 0XAAAAAAAA
0X00000034 0X88888888
0X00000038 0X99999999
RESULT(SMALL) 0X40000000 0X11111111
RESULT(LARGE) 0X40000000 0XAAAAAAA
START
MOV R8,#4 ; INTIALISE COUNTER TO 4(i.e. N=4)
LDR R2,=CVALUE ; ADDRESS OF CODE REGION
LDR R3,=DVALUE ; ADDRESS OF DATA REGION
LOOP0
LDR R1,[R2],#4 ; LOADING VALUES FROM CODE REGION
STR R1,[R3],#4 ; STORING VALUES TO DATA REGION
START1
MOV R5,#3 ; INTIALISE COUNTER TO 3(i.e. N=4)
MOV R7,#0 ; FLAG TO DENOTE EXCHANGE HAS OCCURED
LDR R1,=DVALUE ; LOADS THE ADDRESS OF FIRST VALUE
LOOP
LDR R2,[R1],#4 ; WORD ALIGN T0 ARRAY ELEMENT
LDR R3,[R1] ; LOAD SECOND NUMBER
CMP R2,R3 ; COMPARE NUMBERS
BLT LOOP2 ; IF THE FIRST NUMBER IS < THEN GOTO LOOP2
STR R2,[R1],#-4 ; INTERCHANGE NUMBER R2 & R3
STR R3,[R1] ; INTERCHANGE NUMBER R2 & R3
MOV R7,#1 ; FLAG DENOTING EXCHANGE HAS TAKEN PLACE
LOOP2
NOP
NOP
NOP
OUTPUT
Before Sorting
After Sorting
NOTE: for Descending order change instruction BLT to BGT (Branch if Greater than)
8.Write a program to count the number of ones and zeros in two consecutive memory
locations
AREA ONEZERO , CODE, READONLY
START
ZEROS ADD R3,R3,#1 ; IF CARRY BIT IS 0 THEN INCREMENT THE COUNTER BY 1(R3)
ONES ADD R2,R2,#1 ; IF CARRY BIT IS 1 THEN INCREMENT THE COUNTER BY 1(R2)
STR R2,[R4],#4
STR R3,[R4],#4
JMP b JMP
OUTPUT
ADDRESS REGISTERS VALUE
INPUT 0X40000000 0X00000011
0X40000004 0X00000010
PART –B
Figure 1:LPC2148
IO0CLR = (1<<4);
Steps
12. FLASH MAGIC software can be used to download the HEX files to the Flash
memory of controller.
How to Download?
Connect the serial cross cable from 9-pin DSUB Female connector (DB2) to the PC
COM port. Push both SW11/1, 2 to ON position, JP7 should be shorted while using
ISP programming. Connect DC +5V Power, through the 9-pin DSUB Male connector
(DB1) applied from an external source. Switch ON the power. Open JP13 while
downloading the software.
#include
<LPC213X.H>
#include <stdint.h>
void UART0_init(void)
{
PINSEL0 = PINSEL0 | 0x00000005;
/* Enable UART0 Rx0 and Tx0 pins of UART0 */
U0LCR = 0x83; /* DLAB = 1, 1 stop bit, 8-bit character
length */U0DLM = 0x00; /* For baud rate of 9600 with Pclk =
15MHz */
U0DLL = 0x61; /* We get these values of U0DLL and U0DLM from
formula */U0LCR = 0x03; /* DLAB = 0 */
}
unsigned char UART0_RxChar(void) /*A function to receive a byte on UART0 */
{
while( (U0LSR & 0x01) == 0);
/*Wait till RDR bit becomes 1 which tells that receiver
contains valid data */return U0RBR;
}
void UART0_TxChar(char ch) /*A function to send a byte on UART0 */
{
U0THR = ch;
while( (U0LSR & 0x60) == 0 );
/* Wait till THRE bit becomes 1 which tells that transmission is completed */
}
void UART0_SendString( char *p)
{ char c;
while(*p!='\0')
{
c=*p;
p++;
UART0_TxChar(c);
}
}
int main(void)
{
char
receive;
UART0_in
it();
while(1)
{
receive = UART0_RxChar();
UART0_SendString("Received
:");UART0_TxChar(receive);
UART0_SendString("\r\n");
}
}
int main()
{
IO0DIR= 0X00000900;
IO0SET= 0X00000100; //P0.8 should always high.
while(1)
{
clock_wise();
for(j=0;j<400000;j++); //delay
anti_clock_wise();
for(j=0;j<400000;j++); //delay
} //End of while(1)
} //End of Main
void clock_wise(void)
{
IO0CLR = 0x00000900; //stop motor and also turn off relay
for(j=0;j<10000;j++); //small delay to allow motor to turn off
IO0SET = 0X00000900; //Selecting the P0.11 line for clockwise and turn on motor
}
void anti_clock_wise(void)
{
IO0CLR = 0X00000900; //stop motor and also turn off relay
for(j=0;j<10000;j++); //small delay to allow motor to turn off
IO0SET = 0X00000100; //not selecting the P0.11 line for Anti clockwise
}
#include <LPC21xx.H>
void clock_wise(void);
void anti_clock_wise(void);
int main(void)
{
PINSEL0 = 0x00FFFFFF; //P0.12 to P0.15 GPIo
IO0DIR |= 0x0000F000; //P0.12 to P0.15 output
while(1)
{
for(j=0;j<50;j++) // 20 times in Clock wise Rotation
clock_wise();
{
var1 = 0x00000800; //For Clockwise
for(i=0;i<=3;i++) // for A B C D Stepping
{
var1 = var1<<1; //For Clockwise
var2 = ~var1;
var2 = var2 & 0x0000F000;
IO0PIN = ~var2;
for(k=0;k<3000;k++); //for step speed variation
}
}
void anti_clock_wise(void)
{
var1 = 0x00010000; //For Anticlockwise
for(i=0;i<=3;i++) // for A B C D Stepping
{
var1 = var1>>1; //For Anticlockwise
var2 = ~var1;
var2 = var2 & 0x0000F000;
IO0PIN = ~var2;
for(k=0;k<3000;k++); //for step speed variation
}
}
12.Determine Digital output for a given Analog input using Internal ADC of ARM controller.
//10-bit internal ADC //AIN0 pin is selected //you can change the channel by changing
PINSEL1 and ADCR value //
#include <lpc214x.h>
#include <Stdio.h>
void lcd_init(void);
void wr_cn(void);
void clr_disp(void);
void delay(unsigned int);
void lcd_com(void);
void wr_dn(void);
void lcd_data(void);
int main()
{
PINSEL1 = 0X00040000; //AD0.4 pin is selected(P0.25)
IO0DIR = 0x000000FC; //configure o/p lines for lcd
delay(3200);
lcd_init(); //LCD initialization
delay(3200);
clr_disp(); //clear display
delay(3200); //delay
ptr = dis;
temp1 = 0x80; //Display starting address of first line 1 th pos
lcd_com();
delay(800);
while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}
ptr1 = arr;
temp1 = 0xC0; //Display starting address of second line 4 th pos
lcd_com();
delay(800);
while(*ptr1!='\0')
{
temp1 = *ptr1;
lcd_data();
ptr1 ++;
}
//infinite loop
while(1)
{
//CONTROL register for ADC
AD0CR = 0x01200010; //command register for ADC-AD0.4
IS & E Dept, AIT, Chikkmaglur Page 26
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
temp1 = 0x89;
lcd_com();
delay(1200);
ptr = var1;
while(*ptr!='\0')
{
temp1=*ptr;
lcd_data();
ptr++;
}
temp1 = 0xc9;
lcd_com();
delay(1200);
ptr1 = var;
while(*ptr1!='\0')
{
temp1=*ptr1;
lcd_data();
ptr1++;
}
} // end of while(1)
} //end of main()
//lcd initialization
void lcd_init()
{
temp2=0x30;
wr_cn();
delay(800);
temp2=0x30;
wr_cn();
delay(800);
temp2=0x30;
wr_cn();
delay(800);
temp2=0x20;
wr_cn();
delay(800);
temp1 = 0x28;
lcd_com();
delay(800);
temp1 = 0x0c;
lcd_com();
delay(800);
temp1 = 0x06;
lcd_com();
IS & E Dept, AIT, Chikkmaglur Page 28
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
delay(800);
temp1 = 0x80;
lcd_com();
delay(800);
}
void lcd_com(void)
{
temp2= temp1 & 0xf0;
wr_cn();
temp2 = temp1 & 0x0f;
temp2 = temp2 << 4;
wr_cn();
delay(500);
}
int main ()
{
unsigned long int temp=0x00000000;
unsigned int i=0;
IO0DIR=0x00FF0000;
while(1)
{
// output 0 to FE
for(i=0;i!=0xFF;i++)
{
temp=i;
temp = temp << 16;
IO0PIN=temp;
}
// output FF to 1
for(i=0xFF; i!=0;i--)
{
temp=i;
temp = temp << 16;
IO0PIN=temp;
}
}//End of while(1)
}//End of main()
#include <lpc21xx.h>
void delay(void);
int main ()
{
PINSEL0 = 0x00000000 ; // Configure
P0.0 to P0.15 as GPIO
PINSEL1 = 0x00000000 ; // Configure
P0.16 to P0.31 as GPIO
IO0DIR = 0x00FF0000 ;
while(1)
{
IO0PIN = 0x00000000;
delay();
IO0PIN = 0x00FF0000;
delay();
}
}
void delay(void)
{
unsigned int i=0;
for(i=0;i<=95000;i++);
}
14. Interface a 4x4 keyboard and display the key code on an LCD.
/*Program to demonstrate keyboard operation Takes a key from key board and displays it
on LCD screen*/
#include<lpc21xx.h>
#include<stdio.h>
while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}
//........KEYPAD Working.........//
while(1)
{
get_key();
IS & E Dept, AIT, Chikkmaglur Page 34
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
display();
}
} //end of main()
scan();
delay(100); //delay
if(flag == 0xff)
break;
} // end of for
if(flag == 0xff)
break;
} // end of while
for(i=0;i<16;i++)
{
if(scan_code[i] == res1) //equate the scan_code with res1
{
result = ASCII_CODE[i]; //same position value of ascii code
break; //is assigned to result
}
}
}// end of get_key();
void scan(void)
{
unsigned long int t;
temp2 = IO1PIN; // status of port1
temp2 = temp2 & 0x000F0000; // Verifying column key
if(temp2 != 0x000F0000) // Check for Key Press or Not
{
delay(1000); //delay(100)//give debounce delay check again
temp2 = IO1PIN;
temp2 = temp2 & 0x000F0000; //changed condition is same
res1 = temp2;
t = (temp3 & 0x00F00000); //Verfying Row Write
res1 = res1 | t; //final scan value is stored in res1
}
else
{
flag = 0x00;
}
}
} // end of scan()
void display(void)
{
ptr = disp0;
temp1 = 0x80; // Display starting address of first line
lcd_com();
while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
}
ptr = disp1;
temp1 = 0xC0; // Display starting address of second line
lcd_com();
while(*ptr!='\0')
{
temp1 = *ptr;
lcd_data();
ptr ++;
IS & E Dept, AIT, Chikkmaglur Page 37
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
}
temp1 = 0xC6; //display address for key value
lcd_com();
temp1 = result;
lcd_data();
}
temp = 0x30;
wr_cn();
delay(3200);
temp = 0x30;
wr_cn();
delay(3200);
temp = 0x20;
wr_cn();
delay(3200);
// load command for lcd function setting with lcd in 4 bit mode,
// 2 line and 5x7 matrix display
temp = 0x28;
lcd_com();
delay(3200);
temp1 = 0x0C;
lcd_com();
delay(800);
temp1 = 0x80;
lcd_com();
delay(800);
}
void lcd_data(void)
{
temp = temp1 & 0xf0;
wr_dn();
temp= temp1 & 0x0f;
temp= temp << 4;
wr_dn();
delay(100);
}
void wr_dn(void) ////write data reg
{
IO0CLR = 0x000000FC; // clear the port lines.
IO0SET = temp; // Assign the value to the PORT lines
IO0SET = 0x00000004; // set bit RS = 1
IO0SET = 0x00000008; // E=1
delay(10);
IO0CLR = 0x00000008;
}
void lcd_com(void)
IS & E Dept, AIT, Chikkmaglur Page 39
MICROCONTROLLER AND EMBEDDED SYSTEMS LABORATORY
{
temp = temp1 & 0xf0;
wr_cn();
temp = temp1 & 0x0f;
temp = temp << 4;
wr_cn();
delay(500);
}
void wr_cn(void) //write command reg
{
IO0CLR = 0x000000FC; // clear the port lines.
IO0SET = temp; // Assign the value to the PORT lines
IO0CLR = 0x00000004; // clear bit RS = 0
IO0SET = 0x00000008; // E=1
delay(10);
IO0CLR = 0x00000008;
}
void clr_disp(void)
{
temp1 = 0x01; // command to clear lcd display
lcd_com();
delay(500);
}
#include <LPC21xx.h>
unsigned int delay;
int main ()
{
PINSEL1 = 0x00000000 ; // Configure P0.16 to P0.31 as GPIO
IO0DIR = 0x00FF0000 ; // Configure P0.16 to P0.23 as Output
while(1)
{
IO0CLR = 0x00FF0000; // CLEAR (0) P0.10 to P0.13 and P0.18 to P0.21,
LEDs ON
for(delay=0; delay<500000; delay++); // delay
IO0SET = 0x00FF0000; // SET (1) P0.10 to P0.13 and P0.18 to P0.21, LEDs
OFF
for(delay=0; delay<500000; delay++); // delay
}
16. Display the Hex digits 0 to F on a 7-segment LED interface, with an appropriate delay
in between
#include <LPC21XX.h>
while(1)
{
IO0SET |= ALLDISP; // select all digits
IO0CLR = 0x00FF0000; // clear the data lines to 7-segment displays
IO0SET = Disp[Switchcount]; // get the 7-segment display value from the array
Switchcount++;
if(Switchcount == 0x10) // 0 to F has been displayed ? go back to 0
{
Switchcount = 0;
IO0CLR =0xF0FF0000;
}
}
}
}
}