Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

CODE error in smart home based on gsm project

Status
Not open for further replies.

madogas

Junior Member level 3
Junior Member level 3
Joined
Nov 4, 2012
Messages
27
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,283
Activity points
1,503
hi i have a project using gsm modem with pic 16f877a to control of smart home applications i use this code for switch the application on and off by sending sms but i have errors in micro c program
help me to solve this problem
 

Attachments

  • code.txt
    8.8 KB · Views: 121

hi all i steel wait for some answers plz
 
There are lots of lines of code inside the txt, please post the errors you are getting and in which lines.
 

lins
12 , 30,32,33,34,39,67,68,71,72,76,74,75,76,182,199,200,206,207,213,288
 

It would be much more helpful for all of us if you posted your code inside code or suntax tags. You could also highlight the lines with the errors. Maybe you could add some comments above those lines with the error messages. It would then be easier for all to have a look at your code.
 

Code:
/ include
//================================================== ========================
#include <pic.h>                                                  
#include <string.h>

// configuration
//================================================== ========================
__CONFIG ( 0x3F32 ); //configuration for the microcontroller

// define
//================================================== ========================
#define rs RB4 //RS pin of the LCD display
#define e RB5 //E pin of the LCD display

#define lcd_data PORTD //LCD 8-bit data PORT

#define SW1 RB0 
#define SW2 RB1 

#define LED1 RB6 
#define LED2 RB7 

// function prototype (every function must have a function prototype)
//================================================== ========================

void delay(unsigned long data); 

void send_config(unsigned char data);
void send_char(unsigned char data);
void lcd_goto(unsigned char data);
void lcd_clr(void);
void send_string(const char *s);

unsigned char uart_rec(void); //receive uart value
void uart_send(unsigned char data);
void uart_str(const char *s);

void gsm_send_command(const char *command);
void gsm_read_line(char *buffer);


// global variable
//================================================== ========================

char gsm_response[20];
char command[10];


// main function (main fucntion of the program)
//================================================== ========================
void main()
{
char read_sms_command[] = "AT+CMGR=1";
char delete_sms_command[] = "AT+CMGD=1";


//set I/O input output
TRISB = 0b00000011; //configure PORTB I/O direction
TRISD = 0b00000000; //configure PORTD I/O direction
TRISA = 0b00000111; //configure PORTA I/O direction

LED1=0; // OFF LED1
LED2=0; // OFF LED2

//Configure UART
SPBRG=9600; //set baud rate as 9600 baud
BRGH=1; //baud rate high speed option
TXEN=1; //enable transmission
TX9 =0; //8-bit transmission
RX9 =0; //8-bit reception
CREN=1; //enable reception
SPEN=1; //enable serial port

//setup ADC
ADCON1 = 0b00000110; //set ADx pin digital I/O

//configure lcd
send_config(0b00000001); //clear display at lcd
send_config(0b00000010); //lcd return to home
send_config(0b00000110); //entry mode-cursor increase 1
send_config(0b00001100); //display on, cursor off and cursor blink off
send_config(0b00111000); //function set

//display startup message
lcd_clr(); //clear lcd
send_string("Cytron Tech."); //display "Cytron Tech."
lcd_goto(20); //set the lcd cursor to location 20
send_string("Smart Home"); //display "Smart Home"

// Delay for a while.
delay(100000);



// Clear the LCD and display the new message.
lcd_clr();
send_string("Testing Com...");

// Make sure we can communicate with the GSM modem.
gsm_send_command("AT");

// Read the response.
gsm_read_line(&gsm_response);

// We should receive "OK" from the GSM modem.
// If we don't, display "Error".
if (memcmp("OK", &gsm_response, 2) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
}



// Clear the LCD and display the new message.
lcd_clr();
send_string("Waiting for");
lcd_goto(20);
send_string("Call Ready");

// Waiting for the GSM modem to search for the network.
// We will receive a blank line before receiving "Call Ready".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);

// We should receive "Call Ready" from the GSM modem.
// If we don't, display "Error".
if (memcmp("Call Ready", &gsm_response, 10) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
} 



// Clear the LCD and display the new message.
lcd_clr();
send_string("Setting Text");
lcd_goto(20);
send_string("Mode...");

// Set text mode for SMS.
gsm_send_command("AT+CMGF=1");

// Read the "OK".
gsm_read_line(&gsm_response);



// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready");



while(1)
{
// Check whether there is new data from the GSM modem.
if (RCIF == 1) 
{
// Check is there a new SMS?
gsm_read_line(&gsm_response);
if (memcmp("+CMTI: \"SM\",", &gsm_response, 12) == 0)
{
// Get the SMS index.
// The command array is already initialized as "AT+CMGR=1" and "AT+CMGD=1",
// we need to changed the index to the actual one.
read_sms_command[8] = gsm_response[12];
delete_sms_command[8] = gsm_response[12];

// Clear the LCD and display the new message.
lcd_clr();
send_string("Reading SMS...");

// Send command to read the SMS.
gsm_send_command(&read_sms_command);

// Read the response.
// The first line is the SMS info which we don't need.
// We only need the second line which is the message content.
gsm_read_line(&gsm_response);
gsm_read_line(&command);

// Read the newline and "OK".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);



// Switch on the light if we received "on".
if (memcmp("on", &command, 2) == 0)
{
LED1 = 1;
LED2 = 1;
}

// Switch off the light if we received "off".
else if (memcmp("off", &command, 3) == 0)
{
LED1 = 0;
LED2 = 0;
}



// Send command to delete the SMS.
gsm_send_command(&delete_sms_command);

// Read the "OK".
gsm_read_line(&gsm_response);



// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready...");
}
}



// Check whether SW1 is pressed.
if (SW1 == 0)
{
// Clear the LCD and display the new message.
lcd_clr();
send_string("Sending SMS...");

// Send the SMS to notify the owner.
// Please change this to your own number.
gsm_send_command("AT+CMGS=\"01228983833\"");

// We should receive '>' from the modem.
// If we don't, display "Error".
if (uart_rec() != '>')
{
lcd_clr();
send_string("Error...");
while(1);
}

// Send the message.
uart_str("Warning: Switch 1 has been triggered !");

// Send <CTRL+Z>.
uart_send(0x1a);



// Read the newline and response.
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);

// We should receive "+CMGS: <Message ID>" from the GSM modem.
// If we don't, display "Error".
if (memcmp("+CMGS:", &gsm_response, 6) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
}



// Read the newline and "OK".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);



// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready...");



// Wait until SW1 is released so that we don't send duplicated message.
while (SW1 == 0);

}
}
}

// functions
//================================================== ========================
void delay(unsigned long data) //delay function, the delay time
{ //depend on the given value
for( ;data>0;data--);
}

void send_config(unsigned char data) //send lcd configuration 
{
rs=0; //set lcd to configuration mode
lcd_data=data; //lcd data port = data
e=1; //pulse e to confirm the data
delay(50);
e=0;
delay(50);
}

void send_char(unsigned char data) //send lcd character
{
rs=1; //set lcd to display mode
lcd_data=data; //lcd data port = data
e=1; //pulse e to confirm the data
delay(10);
e=0;
delay(10);
}

void lcd_goto(unsigned char data) //set the location of the lcd cursor
{ //if the given value is (0-15) the 
if(data<16) //cursor will be at the upper line
{ //if the given value is (20-35) the
send_config(0x80+data); //cursor will be at the lower line
} //location of the lcd cursor(2X16):
else // -----------------------------------------------------
{ // | |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15| |
data=data-20; // | |20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35| |
send_config(0xc0+data); // -----------------------------------------------------
}
}

void lcd_clr(void) //clear the lcd
{
send_config(0x01);
delay(600);
}

void send_string(const char *s) //send a string to display in the lcd
{ 
while (s && *s)send_char (*s++);
}

unsigned char uart_rec(void) //receive uart value
{
unsigned char rec_data;
while(RCIF==0); //wait for data
rec_data = RCREG;
return rec_data; //return the data received
}

void uart_send(unsigned char data)
{ 
while(TXIF==0); //only send the new data after
TXREG=data; //the previous data finish sent
}


void uart_str(const char *s)
{
while(*s)uart_send(*s++);
}


void gsm_send_command(const char *command)
{
unsigned char rec_data;

while (*command != 0)
{
uart_send(*command++); // Send the AT command.
rec_data = uart_rec(); // Read the echo.
}

// Send <ENTER>.
uart_str("\r\n");

// Read the echo until Line Feed character is received.
do {
rec_data = uart_rec();
} while (rec_data != '\n');
} 



void gsm_read_line(char *buffer)
{
unsigned char rec_data;

// Read the data until Line Feed character is received.
do {
rec_data = uart_rec();
*buffer++ = rec_data;
} while (rec_data != '\n');
}
 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top