Hi... I am doing my final year project on Line Detection using PIC16F877 and I am writing my codes in C. Can anyone check my coding?
Thank You.
//LiDTrans PIC Programming
#include <pic.h>
//Hardware: //Using PIC16F877 //Clock = 4Mhz
//Configuration Fuses #if defined(_16F877) #warning PIC16F877 selected __CONFIG(0x3FFD); //PIC16F877 Configuration Fuses // - XT crystal oscillator
#else #error Unsupported PICmicro MCU selected #endif
//Global Variables volatile unsigned TRISPC @ (unsigned) &TRISC; //declaration of TRISC as TRISPC volatile unsigned PC @ (unsigned) &PORTC; //declaration of PC as PORTC - RF input signal volatile unsigned TRISLNSR @ (unsigned) &TRISD; //declaration of TRISLNSR as TRISD volatile unsigned LNSR @ (unsigned) &PORTD; //declaration of LNSR as PORTD - Line Sensor
static bit TRISMRF @ (unsigned) &TRISB*8+0; //TRISB0 static bit TRISMLF @ (unsigned) &TRISB*8+1; //TRISB1 static bit TRISMRFH @ (unsigned) &TRISB*8+2; //TRISB2 static bit TRISMLFH @ (unsigned) &TRISB*8+3; //TRISB3 static bit TRISMRR @ (unsigned) &TRISB*8+4; //TRISB4 static bit TRISMLR @ (unsigned) &TRISB*8+5; //TRISB5 static bit TRISMRX @ (unsigned) &TRISB*8+6; //TRISB6 static bit TRISMLX @ (unsigned) &TRISB*8+7; //TRISB7 static bit MRF @ (unsigned) &PORTB*8+0; //RB0 - Motor Right Forward static bit MLF @ (unsigned) &PORTB*8+1; //RB1 - Motor Left Forward static bit MRFH @ (unsigned) &PORTB*8+2; //RB2 - Motor Right Forward High static bit MLFH @ (unsigned) &PORTB*8+3; //RB3 - Motor Left Forward High static bit MRR @ (unsigned) &PORTB*8+4; //RB4 - Motor Right Reverse static bit MLR @ (unsigned) &PORTB*8+5; //RB5 - Motor Left Reverse static bit MRX @ (unsigned) &PORTB*8+6; //RB6 - Motor Right Stop static bit MLX @ (unsigned) &PORTB*8+7; //RB7 - Motor Left Stop
static bit TRISJSR @ (unsigned) &TRISA*8+0; //TRISA0 static bit TRISJSL @ (unsigned) &TRISA*8+1; //TRISA1
static bit JSR @ (unsigned) &PORTA*8+0; //RA0 - Junction Sensor Right static bit JSL @ (unsigned) &PORTA*8+1; //RA1 - Junction Sensor Left
static bit TRISUSW @ (unsigned) &TRISA*8+2; //TRISA2 static bit TRISOBS @ (unsigned) &TRISA*8+3; //TRISA3
static bit USW @ (unsigned) &PORTA*8+2; //RA2 - User Switch @Station static bit OBS @ (unsigned) &PORTA*8+3; //RA3 - Obstacles Limit Switch
//initializing port function void InitPort() { TRISPC = 0b00000111; //Determines RC0,RC1,RC2 as input TRISLNSR = 0b00000111; //Determines RD0,RD1,RD2 as input
TRISMRF = 0; //Declare RB0 as output TRISMLF = 0; //Declare RB1 as output TRISMRFH = 0; //Declare RB2 as output TRISMLFH = 0; //Declare RB3 as output TRISMRR = 0; //Declare RB4 as output TRISMLR = 0; //Declare RB5 as output TRISMRX = 0; //Declare RB6 as output TRISMLX = 0; //Declare RB7 as output
TRISJSR = 1; //Declare RA0 as input TRISJSL = 1; //Declare RA1 as input
TRISUSW = 1; //Declare RA2 as input TRISOBS = 1; //Declare RA3 as input
PC = 0b00000000; //initialize PORTC to all 0 LNSR = 0b00000000; //initialize PORTD to all 0
MRF = 0; //initialize RB0=0 MLF = 0; //initialize RB1=0 MRFH = 0; //initialize RB2=0 MLFH = 0; //initialize RB3=0 MRR = 0; //initialize RB4=0 MLR = 0; //initialize RB5=0 MRX = 0; //initialize RB6=0 MLX = 0; //initialize RB7=0
JSR = 0; //initialize RA0=0 JSL = 0; //initialize RA1=0
USW = 0; //initialize RA2=0 OBS = 0; //initialize RA3=0 }
//500 Usec Delay function void Delay500Us() { unsigned char cnt500Us = 165; // Delay Cycle to achieve 500Us delay while(--cnt500Us != 0) // Delay Timing is approximately 3 usec per loop continue; // Note this routine is for 4MHz crystal frequency }
//100 msec Delay function void Delay100ms() { unsigned char cnt100ms = 200; // 200 * 500 Usec = 100 msec
do { Delay500Us(); }while(--cnt100ms != 0); }
//1 sec Delay function void Delay1s() { unsigned char cnt1ms = 10; //10 * 100 msec = 1 sec
do { Delay100ms(); }while(--cnt1ms != 0); }
//wait for user input function void WaitUserInput() { while (PC == 0b00000000) // Loop and wait for LiDTrans received signal from RF transmitter continue; }
//wait for user press resume button void UserSwitch() { while (USW == 0) continue; }
//Input from Line Detection Sensor void LineSensor() { while (LNSR!=0b00000111) { switch(LNSR) { case 0b00000010: MRF = 1; MLF = 1; break; case 0b00000011: MRF = 1; MLFH = 1; break; case 0b00000001: MRX = 1; MLF = 1; break; case 0b00000110: MRFH = 1; MLF = 1; break; case 0b00000100: MRF = 1; MLX = 1; break; } } }
//From Station A to Station B function void A_to_B() { LineSensor();
while (JSR != 1 && JSL != 0) //detects junction sensor (01 = Station A) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station A
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch(); //wait for user give command to indicates loading job is done
MRX = 0; MLX = 0;
LineSensor(); MRF = 1; MLR = 1; //from Station A, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 1) //detects junction sensor (10 = Station  LineSensor();
MRR = 1; MLF = 1; //from front, turn right
Delay1s();
MRR = 0; MLF = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station B
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch(); //wait for user give command to indicates unloading job is done
MRX = 0; MLX = 0;
LineSensor(); MRF = 1; MLR = 1; //from Station B. turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//From Station A to Station C function void A_to_C() { LineSensor();
while (JSR != 1 && JSL != 0) //detects junction sensor (01 = Station A) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station A
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans Stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRF = 1; MLR = 1; //from Station A, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 1 && JSL != 1) //detects junction sensor (01 = Station C) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station C
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station C, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//From Station B to Station A function void B_to_A() { LineSensor();
while (JSR != 0 && JSL != 1) //detects junction sensor (10 = Station LineSensor();
MRR = 1; MLF = 1; //from front, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station B
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRF = 1; MLR = 1; //from Station B, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 1 && JSL != 0) //detects junction sensor (01 = Station A) LineSensor();
MRR = 1; MLF = 1; //from back, turn right
Delay1s();
MRR = 0; MLF = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station A
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station A, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//From Station B to Station C function void B_to_C() { LineSensor();
while (JSR != 0 && JSL != 1) //detects junction sensor (10 = Station  LineSensor();
MRR = 1; MLF = 1; //from front, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station B
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station B, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 1 && JSL != 1) //detects junction sensor (11 = Station C) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRR = 0; MLF = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station C
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station C, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//From Station C to Station A function void C_to_A() { LineSensor();
while (JSR != 1 && JSL != 1) //detects junction sensor (11 = Station C) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station C
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station C, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 1 && JSL != 0) //detects junction sensor (01 = Station A) LineSensor();
MRR = 1; MLF = 1; //from back, turn right
Delay1s();
MRR = 0; MLF = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn a station A
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station A, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//From Station C to Station B function void C_to_B() { LineSensor();
while (JSR != 1 && JSL != 1) //detects junction sensor (11 = Station C) LineSensor();
MRF = 1; MLR = 1; //from front, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station C
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRR = 1; MLF = 1; //from Station C, turn right
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 1) //detects junction sensor (10 = Station  LineSensor();
MRF = 1; MLR = 1; //from back, turn left
Delay1s();
MRR = 0; MLF = 0;
LineSensor();
MRF = 1; MLR = 1; //U-turn at Station B
Delay1s(); Delay1s();
MRF = 0; MLR = 0; MRX = 1; MLX = 1; //LiDTrans stop
UserSwitch();
MRX = 0; MLX = 0;
LineSensor(); MRF = 1; MLR = 1; //from Station B, turn left
Delay1s();
MRF = 0; MLR = 0;
LineSensor();
while (JSR != 0 && JSL != 0) //detects junction sensor (00 = Base) LineSensor();
MRF = 1; MLR = 1; //U-turn at Base
Delay1s(); Delay1s();
MRF = 0; MLR = 0;
//back to main() }
//main function void main() { while (1 == 1) { InitPort(); //call initializing port function WaitUserInput(); //call waiting for user input function if (PC == 0b00000001) A_to_B(); //call function station A to station B else if (PC == 0b00000010) A_to_C(); //call function station A to C else if (PC == 0b00000011) B_to_A(); //call function station B to A else if (PC == 0b00000100) B_to_C(); //call function station B to C else if (PC == 0b00000101) C_to_A(); //call function station C to A else if (PC == 0b00000110) C_to_B(); //call function station C to B } }
|