H!!!,
I'm using MSP430F2471 & SIM900A, the below code not working.... friends any one can tell me how can I achieve...
#include <msp430f2471.h>
#include "uart_gsm.h" // ATTACH THE UART FILE WITH THE MAIN CODE
//........................................................................
#define LED_56 (BIT6|BIT7) //BIT6 & BIT7
#define LED_34 (BIT4|BIT5) //BIT4 & BIT5
#define sw1 BIT2
//long i=0;
//..........................................................................
#define RI BIT0
#define PKEY BIT1
#define RST BIT2
//.........................................................................
void gsm();//FUNCTION PROTOTYPE
unsigned int i=0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;// STOP WATCHDOG TIMER
//....................................................................................
BCSCTL1 = CALBC1_8MHZ; // MAKE THE FREQUNCY AS PER THE LAUNCHPAD 8MHZ
DCOCTL = CALDCO_8MHZ;
P1DIR |=PKEY | RI |RST;
P1OUT |=PKEY ;
//..........................................................................................
P2DIR |= LED_56; // to output direction
P2DIR |= LED_34;
P2OUT &= ~ LED_56; // Set LED_56 ON
P2OUT &= LED_34; // Set LED_34 OFF
//............................................................................................
P2SEL &= ~sw1; // Select Port 2 P2.2 (push button)
P2DIR &= ~sw1; // Port 2 P2.2 (push button) as input, 0 is input
P2REN |= sw1; // Enable Port P2.2 (push button) pull-up resistor
P2IE |= sw1; // Port 2 Interrupt Enable P2.2 (push button)
P2IFG &= ~sw1; // Clear interrupt flag
//.............................................................................................
_BIS_SR(GIE); // Enable interrupts
//................................................................................................
uart_init(); // CALL THE UART INIT FUNCTION WHICH IS AVAILAIBLE IN THE FILE
//.........................................................................................
// __enable_interrupt();// ENABLE INTERRUPT
// __delay_cycles(1000000);
for(i=0;i>=60000;i++);for(i=0;i>=60000;i++);
//....................................................................................
// gsm();// CALL THE GSM FUNCTION
}
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void) {
P2IFG &= ~sw1; // P2.2 Interrupt Flag cleared
P2OUT ^= LED_56; // Toggle LED_56 state
P2OUT ^= LED_34; // Toggle LED_56 state
gsm();// CALL THE GSM FUNCTION
}
void gsm()
{
uart_puts((char *)"AT"); // COMMAND FOR INITIALIZING GSM
uart_putc(0x0A);//ENTER
uart_putc(0x0D);//CARRIAGE RETURN
// __delay_cycles(10000000);//DELAY...WAIT FOR OK FROM GSM
for(i=0;i>=60000;i++);for(i=0;i>=60000;i++);
uart_puts((char *)"AT+CMGF=1");//COMMUNICATION
uart_putc(0x0A);
uart_putc(0x0D);
// __delay_cycles(10000000);//WAIT FOR OK
for(i=0;i>=60000;i++);for(i=0;i>=60000;i++);
uart_puts( (char *)"AT+CMGS=\"+919555643784\""); //SEND A MESSAGE TO PARTICULAR NUMBER
uart_putc(0x0A);
uart_putc(0x0D);
for(i=0;i>=60000;i++);for(i=0;i>=60000;i++);
uart_puts((char *)"hello");//SEND HELLO
uart_putc(0x1A);//CTRL Z
for(i=0;i>=60000;i++);for(i=0;i>=60000;i++);
//AFTER HARDWARE CONFIGURATION THE MESSAGE WILL GET SEND
//ATTACH THE UART FILES OR WRITE THE CODE FOR INIT AND SENDING MESSAGE IN THE SAME FILE...
}
//.......................................................................................
UART_gsm.c
//.........................
#include <msp430f2471.h>
#include "uart_gsm.h"
#define LED BIT7 //p2.7
#define TXD BIT4
#define RXD BIT5
volatile unsigned int tx_flag; //Mailbox Flag for the tx_char.
volatile unsigned char tx_char; //This char is the most current char to go into the UART
volatile unsigned int rx_flag; //Mailbox Flag for the rx_char.
volatile unsigned char rx_char; //This char is the most current char to come out of the UART
/*uart_init
* Sets up the UART interface via USCI
* INPUT: None
* RETURN: None
*/
void uart_init(void)
{
// P1SEL = RXD + TXD; //Setup the I/O
P3SEL = RXD + TXD; //P3.4 & P3.5
P2DIR |= LED; //P2.7 red LED. Toggle when char received.
P2OUT |= LED; //LED OFF
UCA0CTL1 |= UCSSEL_2; //SMCLK
//8,000,000Hz, 9600Baud, UCBRx=52, UCBRSx=0, UCBRFx=1
UCA0BR0 = 52; //8MHz, OSC16, 9600
UCA0BR1 = 0; //((8MHz/9600)/16) = 52.08333
UCA0MCTL = 0x10|UCOS16; //UCBRFx=1,UCBRSx=0, UCOS16=1
UCA0CTL1 &= ~UCSWRST; //USCI state machine
IE2 |= UCA0RXIE; //Enable USCI_A0 RX interrupt
rx_flag = 0; //Set rx_flag to 0
tx_flag = 0; //Set tx_flag to 0
return;
}
/*uart_getc
* Get a char from the UART. Waits till it gets one
* INPUT: None
* RETURN: Char from UART
*/
unsigned char uart_getc() //Waits for a valid char from the UART
{
while (rx_flag == 0); //Wait for rx_flag to be set
rx_flag = 0; //ACK rx_flag
return rx_char;
}
/*uart_gets
* Get a string of known length from the UART. Strings terminate when enter is pressed or string buffer fills
* Will return when all the chars are received or a carriage return (\r) is received. Waits for the data.
* INPUT: Array pointer and length
* RETURN: None
*/
void uart_gets(char* Array, int length)
{
unsigned int i = 0;
while((i < length)) //Grab data till the array fills
{
Array[i] = uart_getc();
if(Array[i] == '\r') //If we receive a \r the master wants to end
{
for( ; i < length ; i++) //fill the rest of the string with \0 nul. Overwrites the \r with \0
{
Array[i] = '\0';
}
break;
}
i++;
}
return;
}
/*uart_putc
* Sends a char to the UART. Will wait if the UART is busy
* INPUT: Char to send
* RETURN: None
*/
void uart_putc(unsigned char c)
{
tx_char = c; //Put the char into the tx_char
IE2 |= UCA0TXIE; //Enable USCI_A0 TX interrupt
while(tx_flag == 1); //Have to wait for the TX buffer
tx_flag = 1; //Reset the tx_flag
return;
}
/*uart_puts
* Sends a string to the UART. Will wait if the UART is busy
* INPUT: Pointer to String to send
* RETURN: None
*/
void uart_puts(char *str) //Sends a String to the UART.
{
while(*str) uart_putc(*str++); //Advance though string till end
return;
}
#pragma vector = USCIAB0TX_VECTOR //UART TX USCI Interrupt
__interrupt void USCI0TX_ISR(void)
{
UCA0TXBUF = tx_char; //Copy char to the TX Buffer
tx_flag = 0; //ACK the tx_flag
IE2 &= ~UCA0TXIE; //Turn off the interrupt to save CPU
}
#pragma vector = USCIAB0RX_VECTOR //UART RX USCI Interrupt. This triggers when the USCI receives a char.
__interrupt void USCI0RX_ISR(void)
{
rx_char = UCA0RXBUF; //Copy from RX buffer, in doing so we ACK the interrupt as well
rx_flag = 1; //Set the rx_flag to 1
P2OUT ^= LED; //Notify that we received a char by toggling LED
}
// end of urat.c file
//.....................................
//header file...................
extern volatile unsigned int rx_flag;
/*uart_init
* Sets up the UART interface via USCI
* INPUT: None
* RETURN: None
*/
void uart_init(void);
/*uart_getc
* Get a char from the UART. Waits till it gets one
* INPUT: None
* RETURN: Char from UART
*/
unsigned char uart_getc();
/*uart_gets
* Get a string of known length from the UART. Strings terminate when enter is pressed or string buffer fills
* Will return when all the chars are received or a carriage return (\r) is received. Waits for the data.
* INPUT: Array pointer and length
* RETURN: None
*/
void uart_gets();
/*uart_putc
* Sends a char to the UART. Will wait if the UART is busy
* INPUT: Char to send
* RETURN: None
*/
void uart_putc(unsigned char c);
/*uart_puts
* Sends a string to the UART. Will wait if the UART is busy
* INPUT: Pointer to String to send
* RETURN: None
*/
void uart_puts(char *str);
// end of urat.h file
//………………………………………………………………………………………………………………………………………………………