Programming in C
Download
Report
Transcript Programming in C
Engineering 1040: Mechanisms & Electric Circuits
Fall 2011
Introduction to C Programming
Basic Rules When Programming
in C Language
•
•
•
At the end of each line with instructions a semi-colon (;) has to be placed.
Eg: a=a+3;
There are two methods of indicating comments.
1. For single lines: //comment.
2. For multiple lines:
/* This is comment 1;
This is comment 2; */.
Functions, statements, etc., should be between { }.
Eg:
void main(void)
//Function
{
//Add code
}
The Structure of a C Program
• Header files.
• Declaration of global
variables.
• Declaration of Function
Prototypes.
• Function Declaration.
• Main function.
Main function is the most
important part of the C program.
Most of the time we make
modifications in main function
//Header files
#include <18f4550.h>
//Declaring variables
int a, b, c, par1, d;
char zz, s3, temp;
//Making prototypes
int calc (int p);
//Function
int calc (int p)
{
p=p+1;
//Add code
return p;
}
//Main function
void main(void)
{
//Add code
a=calc(3);
}
Header files
• Header files include the standard functions that will used elsewhere
in the program.
• Text from the specified file is used at this point of the compilation.
• These will call the library functions.
#include < 18f4550.h > - Functions specific to the PIC
#include < adc.h > - A/D converter functions.
#include < xlcd.h > - Functions used for display by a LCD screen.
#include < delays.h > - Delay functions in the program.
#include < stdio.h > - Standard input and output functions.
• All header files used in standard C programming is valid in
microcontroller programming .
Variable types (1)
Variable types (2)
• Possible ways to give variable a the decimal value 15:
a = 15; //Decimal
a = 0b0000 1111; //Binairy
a = 0x0F; //Hexadecimal
Operators (1)
• Relational operators
• Bit operators
Operators (2)
•
Mathematical operators
•
Increasing and decreasing:
x--;
//This is the same as x = x – 1;
x++;
//This is the same as x = x + 1;
Example:
int a, b, c;
a = 19;
//a 00010011
b = 6;
//b 00001110
c = a & b; //c 00000010 -> 2
•
Statements (1)
• IF...ELSE
if (a==0) //If a is similar to 0...
{
b++; //...than increase b by 1
}
else //otherwise
{
b--; //decrease b by 1
}
• WHILE
while (a>3) //As long as a is higher than 3
{
b = b + 3; //Add 3 to b
a--; //Decrease a by 1
}
Statements (2)
• FOR
for (i = 0 ; i < 100 ; i++) //From i=0 to i=100 with step size 1
{
b++; //Increase b by 1
a--; //Decrease a by 1
}
Bootloader
• When a bootloader is used, a special part of code has to be included in the
program, after the #include statements.
//Always use this code when using with a boot oader
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
void _high_ISR (void)
{
;
}
#pragma code
#pragma code _LOW_INTERRUPT_VECTOR = 0x000818
void _low_ISR (void)
{
;
}
#pragma code
//End bootloader code
Programming Pins & Ports (1)
• If PORTB is used for writing to and reading from pins on port B.
• Writing a,
– ‘1’ to one of the bits of PORTB results in a high voltage on the
output pin.
– ‘ 0’ will result in a low voltage.
• The MSB (most significant bit, the most left one) is used for pin B7,
the LSB for pin B0.
Programming Pins & Ports (2)
• Declaring all the pins of a port:
• Declaring a specific pin of a port to high or low:
Programming Pins & Ports (3)
• Instead of using PORT the command LAT could also
be used in declaring pins.
Example:
• LATD = 0x00;
// Set all port D to low
• LATCbits.LATC0 = 0; //Set pin C0 to low
• LATCbits.LATC1 = 1; //Set pin C1 to high
Programming Pins & Ports (4)
• Declaring a port as an output port:
– Use ‘1’ for Input
– Use ‘0’ for Output
Example:
• TRISD = 0b11111111;
//Set all pins in port D as inputs
• TRISD = 0b00000000;
//Set all pins in port D as outputs
• TRISD = 0b10101010;
//Set pins 0,2,4,6 of port D as outputs
//Set pins 1,3,5,7 of port D as inputs
Coding the Wall-Following Mobile Robot Platform
• goForward(void) –go forward by 1 step.
• turnRight(int stepNum) – turn to the right side by the angle specified by
the integer stepNum
• readFrontSensor(void) – read the value of the front sensor
Homework:
• Using the above given functions write a code in C language,
• Write a function for the robot to turn left (call this function turnLeft(int
stepNum) )
• Write a function for reading the left sensor (call this function
readLeftSensor (int stepNum) )
• Write a function for the robot to move forward a number of steps given
by x (call this function goForwardx( (int x) )
void turnRight(int stepNum)
{
int i = 0;
while(I < stepNum)
{
rotateCW(2);
// Rotate motor two by one step
rotateCW(1);
// Rotate motor by one step
Delay1KTCYx(50); // Changing the argument in the delay function will change the speed at which
// the motor rotates. Delay equals 1000 x 50 x 1/12 = 4.167 ms
i++;
LATD = 0x00;
// Set all port D to 0
}
return;
}
void goForward(void){
rotateCCW(2);
rotateCW(1);
Delay1KTCYx(50);
LATD = 0x00;
}
// Rotate motor two step
// Rotate motor one step
// Changing the argument in the delay function will change the
// speed at which the motor rotates. Delay equals 1000 x 50 x
// 1/12 = 4.167 ms
// Set all port D to 0
Wall Follow Algorithm (1)
Write a pseudo code for the “wallee” robot to follow a wall on the left hand side using the
left sensor.
If (leftsensor > sensorreading_close)
{
rightturn(10);
goforwardx(5);
}
Left
Sensor
If (leftsensor < sensorreading_far)
{
leftturn(10);
goforwardx(5);
}
else (leftsensor <= sensorreading_close) && (l sensorreading_far > =200)
{
goforwardx(10);
}
Wall
Sensorreading_close
Sensorreading_far
Wall Follow Algorithm (2)
•
Write a pseudo code for the “wallee” robot to follow a wall on the left hand side using the
left sensor.
If (leftsensor > 400)
{
rightturn(10);
goforwardx(5);
}
If (leftsensor < 200)
{
leftturn(10);
goforwardx(5);
}
else (leftsensor <= 400) && (leftsensor > =200)
{
goforwardx(10);
}
Left
Sensor
Wall