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.

SMS gateway problem with SIM 900

Status
Not open for further replies.

hasmibaih

Junior Member level 2
Joined
Dec 7, 2013
Messages
23
Helped
1
Reputation
2
Reaction score
0
Trophy points
8
Activity points
286
HI,


i try to sending sms with SIM900 through Mikrokontroller.
but it can't send sms

this is my code :
Code:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 1/10/2014
Author  : hasmi baih
Company : zzz
Comments: 


Chip type               : ATmega162
Program type            : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega162.h>
#include <delay.h>

// Alphanumeric LCD functions
#include <alcd.h>

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0 <= 256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{

char status,data;
status=UCSR0A;
data=UDR0;

[COLOR="#B22222"]lcd_putsf("1");[/COLOR]                                               //interupt

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0++]=data;
#if RX_BUFFER_SIZE0 == 256
   // special case for receiver buffer size=256
   if (++rx_counter0 == 0) rx_buffer_overflow0=1;
#else
   if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      }
#endif
   }
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
char rx_buffer1[RX_BUFFER_SIZE1];

#if RX_BUFFER_SIZE1 <= 256
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
#else
unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;
#endif

// This flag is set on USART1 Receiver buffer overflow
bit rx_buffer_overflow1;

// USART1 Receiver interrupt service routine
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1[rx_wr_index1++]=data;
#if RX_BUFFER_SIZE1 == 256
   // special case for receiver buffer size=256
   if (++rx_counter1 == 0) rx_buffer_overflow1=1;
#else
   if (rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
   if (++rx_counter1 == RX_BUFFER_SIZE1)
      {
      rx_counter1=0;
      rx_buffer_overflow1=1;
      }
#endif
   }
}

// Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1++];
#if RX_BUFFER_SIZE1 != 256
if (rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#endif
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func2=In Func1=In Func0=In 
// State2=T State1=T State0=T 
PORTE=0x00;
DDRE=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Discon.
// OC3B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-15: Off
MCUCR=0x00;
EMCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

ETIMSK=0x00;

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 115200
UCSR0A=0x00;
UCSR0B=0x98;
UCSR0C=0x86;
UBRR0H=0x00;
UBRR0L=0x05;

// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud Rate: 115200
UCSR1A=0x00;
UCSR1B=0x98;
UCSR1C=0x86;
UBRR1H=0x00;
UBRR1L=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// SPI initialization
// SPI disabled
SPCR=0x00;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8

lcd_init(16);

// Global enable interrupts
#asm("sei")

lcd_clear();
putchar(13);
delay_ms(300);
putchar(13);
delay_ms(300);
putchar(13);
delay_ms(300);
lcd_putsf("SMS Gateway");
printf("AT");  
putchar(13);
delay_ms(300);  
printf("AT+CMGF=1"); 
putchar(13);
delay_ms(300);
printf("AT+CMGS=\"085730700750\""); 
putchar(13);
delay_ms(300);
printf("yes bisa");
delay_ms(300);
putchar(26);
putchar(13);
lcd_gotoxy(0,1);  
lcd_putsf("done");                                                
delay_ms(300);

while (1)
      {
      // Place your code here

      }
}

i had try to using interupt for checking reply from SIM 900, but SIM 900 didn't replay anything
so i checking SIM900 with HyperTerminal, but i can sending sms, SIM900 is ok
so where is my problem ? code or anything else ?
help me please
thanks
 

I think there is a problem in putchar sequence..

Try the below method it will work..

1. Send AT+CMGS="phone number"<ENTER> //phone number should be withing quotes followed by <ENTER>...hex equivalent 0x0D...
2. Wait till the SIM900 module responds with ">" //hex equivalent 0x3E...
3. Send the actual message(SMS CONTENT) to the SIM900 module
4. Send CTRL-Z or the hex equivalent 0x1A from your Microcontroller unit..
5. Wait for the response "OK" from the SIM900...Then come out...the response received will be without quotes....

Your sms will be sent without any problem..
 

i had done change putchar(13) become putchar(0x0D) and putchar(26) become putchar(0X1A) sir, but still can't send sms, my intterupt cann't work too
i had done try to sending sms through HyperTerminal, it's clear sir
where is my wrong sir?
 

First connect your micro to PC and see if data communication is ok. If not baudrate might not be matching. Send some text to UART and receive it at PC first. If it is ok then connect micro to modem and use the below code.

Code C - [expand]
1
2
3
4
5
6
7
8
9
printf("AT\r\n");  
delay_ms(500);  
printf("AT+CMGF=1\r\n"); 
delay_ms(500);
printf("AT+CMGS=\"085730700750\"\r\n"); 
delay_ms(2000);
printf("yes bisa");
delay_ms(2000);
putchar(26);

 

i had done using your cide sir
Code:
printf("AT\r\n");  
delay_ms(500);  
printf("AT+CMGF=1\r\n"); 
delay_ms(500);
printf("AT+CMGS=\"083849852341\"\r\n"); 
delay_ms(2000);
printf("yes bisa");
delay_ms(2000);
putchar(26);

but still cann't sending sms
i had done connect my micro to PC, the data communication is ok.
you can see in my attach file

sdasd.PNG

baudrate between micro and sim900 is same, 115200
or i did not initialized GSM module properly?
help me please
 

My SIM900 works at 9600 bps baud. You changed the baudrate of modem?


Try this code.


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
printf("AT\r\n");  
delay_ms(500);  
printf("AT+CMGF=1\r\n"); 
delay_ms(500);
printf("AT+CMGS=\"083849852341\"\r\n"); 
delay_ms(2000);
printf("yes bisa");
delay_ms(2000);
putchar(0x0D);
putchar(26);
putchar(0x0D);

 

may be you can teach me, how to scan character using array with getchar() sir, or anything else?
i will using it to know a reply from sim900 ?
thanks

- - - Updated - - -

my default baudrate from my sim900 is 115200 sir, i had done try with 9600 baudrate through HyperTerminal, but it can't work
 

can you give me a code to using ISR?
and does SIM900 need a initialized before when it connect to mikrokontroller?
 

I don't use codevision AVR so, I can't help you with the code. Below is the code you have to use in the ISR. In while(1) loop display buffer. BUFFERSIZE can be set to 10.


Code C - [expand]
1
2
3
if(i > BUFFERSIZE)i = 0;
buffer[i++] = UDR;
buffer[i] = '\0';

 

Ok fine..

First connect your modem to the hyperterminal @115200 BR ...

Once you turn on your SIM900 module, in the UART hyperterminal you have to wait till you receive "CALL READY"...

Until this you should not send anything....

And moreover, by default the SIM900 comes with ATE0 where the echo mode is OFF...so type in the hyperterminal ATE1<ENTER> to make the echo ON and get the response OK...

Now follow the steps that i had told you earlier and see what is happening...

Implement the same in coding..

Pls send the hyperterminal screenshot, for the steps that i had told you..
 

hi sir,
before i setting hyperterminal with ATE1, sim900 can reply "something"
but in "Microcontroller", "Sim900 cann't reply anything", i using a interupt (ISR) on it, but my Microcontroller cann't detect reply from SIM900
i try using interupt (ISR) in hyperterminal, when i connect my microcontroller to hyperterminal and typed a character in hyperterminal, it works, and lcd show characther 'I' with my code above, but it doesn't work in sim900 when connect to microcontroller sir
i hope you understand what i mean, my english is so bad :-D
 

Have you interchanged Rx and Tx lines which are connecting to the SIM 900 module?

Try doing so..Then you connect the microcontroller and sim900 and power on..

You will surely received "CALL READY"...
 

i had received "call ready" sir but when i try sending sms through hyperterminal
but, when i am sending sms through Microcontroller, how i know i get a "call ready" ?
every AT command i send, it didn't reply sir
 

Did you sense the "CALL READY" in your microcontroller UART?

Or you sensed this by connecting the modem only in the hyperterminal??
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top