|
|
View previous topic :: View next topic |
Author |
Message |
gokayk
Joined: 25 Mar 2012 Posts: 8
|
AT Command Problem Between Mobile & PIC |
Posted: Sun Mar 25, 2012 10:45 am |
|
|
Hi eveyone,
I've a problem about sending AT commands to PIC,
For exp. I've already tried and got the OK response from mobile by using hyper terminal. Also i've tested my circuit (PIC) with hyper terminal by using max 232.
Here my codes;
Code: | #use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, STREAM = PC)
#use rs232 (baud=9600, xmit=pin_C4, rcv=pin_C5, STREAM = PHONE)
char mobile_phone[80];
while(1)
{
fprintf(PHONE,"AT"); //sending AT code to mobile phone
delay_ms(100);
fputc(0x0d,PHONE); //ENTER command should be sent
delay_ms(1000);
fprintf(PC, "\n\rHere is the code for sending to mobile phone: AT\n"); //at command shown in hyper terminal
fgets(mobile_phone,PHONE); //getting data from mobile phone
fprintf(PC, "\n\rData from mobile: %s\n",mobile_phone); //data from mobile phone is shown in hyper terminal
} |
When i send AT command, it is waiting for receiving datas from mobile. But it never stops and program can not pass to the other step.
There is a problem but i really don't know what it is :S
Can you help me?
Thanks in advance. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Mar 25, 2012 1:06 pm |
|
|
First problem is that after sending the AT-command to the phone you have a delay of 1000ms before you start listening for the response. I don't see the code for hardware flow control, so the phone will not wait for you to be listening and has long since sent a reply. Now the phone is waiting for a new command while you are waiting for the phone's response. Deadlock.
Some minor suggestions:
- With the hardware UART always add the 'ERRORS' directive to the #use rs232 line. This will add code to automatically clear overflow error conditions.
- Why do you have a delay between sending 'AT' and the newline character?
- Easier to read is when you combine the 'AT' command and newline into a single: Code: | fprintf(PHONE,"AT\n"); //sending AT code to mobile phone | Note the \n. Some phone require '\n\r'. |
|
|
gokayk
Joined: 25 Mar 2012 Posts: 8
|
|
Posted: Sun Mar 25, 2012 1:55 pm |
|
|
Thanks for quick reply.
New code:
Code: | #use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, STREAM = PC, ERRORS)
#use rs232 (baud=9600, xmit=pin_C4, rcv=pin_C5, STREAM = PHONE, ERRORS)
char mobile_phone[];
while(1)
{
fprintf(PHONE,"AT\r\n"); //sending AT code to mobile phone
fprintf(PC, "\n\rHere is the code for sending to mobile phone: AT\n"); //at command shown in hyper terminal
fgets(mobile_phone,PHONE); //getting data from mobile phone
fprintf(PC, "\n\rData from mobile: %s\n",mobile_phone); //data from mobile phone is shown in hyper terminal
} |
I've tried these too:
Code: | fprintf(PHONE,"AT\n"); //sending AT code to mobile phone
fprintf(PHONE,"AT\r"); //sending AT code to mobile phone
fprintf(PHONE,"AT\r\n"); //sending AT code to mobile phone
fprintf(PHONE,"AT\n\r"); //sending AT code to mobile phone
|
But still no response. Still waiting in fgets() |
|
|
andrewg
Joined: 17 Aug 2005 Posts: 316 Location: Perth, Western Australia
|
|
Posted: Sun Mar 25, 2012 10:44 pm |
|
|
The problem is the PIC can only buffer one or two characters. By the time you get to the fgets(), the fprintf to the PC has taken so long you've missing the response from the modem.
The simple option would be to fprintf to the PC first, then the modem, then the fgets, then the final fprintf.
In the long run, it would be even better to forget fprintf and fgets entirely and write your own based on interrupt-driven buffers. See the CCS examples EX_SISR.C (receiving) and EX_STISR.C (transmitting). _________________ Andrew |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Mar 26, 2012 2:22 am |
|
|
In addition to Andrew's comments. I've built a similar application a long time ago and I can fully recommend the interrupt driven approach. However... only the hardware UART can generate an interrupt and most PIC processors have only one hardware UART. It would have made my project a lot easier when I had a PIC with two UARTS. You are lucky because these do exist now, for example the PIC18F23K22 (28 pin, PDIP and SMD housings, $1.34 at 5000 pieces), or the PIC16F1526 (64 pin, SMD only, $1.47 at 5000 pieces).
And then, of course, there are the PIC24 and many ARM processors that have 2 or more UARTs and are similar priced (or cheaper) then these PICs but require you to use other compilers and programmer tools. |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Mon Mar 26, 2012 7:24 am |
|
|
Hi,
I can bet you 5 bucks your problem can be solved like this:
Swap the tx/rx lines from your the PIC to your phone.
here is why:
http://en.wikipedia.org/wiki/Data_terminal_equipment
ask yourself, who is who?
read my last comment on my post:
http://www.ccsinfo.com/forum/viewtopic.php?t=42527
that should take care of 90% of your startup problems.
Write a small, short program that only tests for proper response to the AT command.
G. _________________ CCS PCM 5.078 & CCS PCH 5.093
Last edited by Gabriel on Mon Mar 26, 2012 7:39 am; edited 2 times in total |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Mon Mar 26, 2012 7:31 am |
|
|
you dont show your input buffer or your ISR for the USART.
that is very important as well.
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
gokayk
Joined: 25 Mar 2012 Posts: 8
|
|
Posted: Tue Mar 27, 2012 12:54 pm |
|
|
First of all i'd like to say thank you for your all beneficial comments,
I've modified my program with reference to Gabriel's program.
Here it is:
Code: | #if defined(__PCM__)
#include <18F452.h>
#include <string.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOOSCSEN //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOCPD //No EE protection
#FUSES NOCPB //No Boot Block code protection
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#elif defined(__PCH__)
#include <18F452.h>
#include <string.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOOSCSEN //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOCPD //No EE protection
#FUSES NOCPB //No Boot Block code protection
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#endif
#define green_led pin_c2
#define blue_led pin_c3
volatile int counter_search=0; //counter to traverse the array
volatile int counter_read=0; //counter to fill the array
volatile char recieve_string[70]; //buffer for incoming data
////////////////////////////////////////////////////////////////////////////////
#int_RDA
void RDA_isr(void)
{
recieve_string[counter_read]=getchar();
counter_read++;
if(counter_read==69)
{
counter_read=0;
}
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
output_low(green_led);
output_low(blue_led);
set_tris_c(0b10100000);
output_high(green_led);
delay_ms(500);
output_low(green_led);
delay_ms(500);
output_high(blue_led);
delay_ms(500);
output_low(blue_led);
delay_ms(500);
while(1)
{
////////////////////////////////////////////////////////////////////////////////
counter_read=0;
printf("AT\n");
putchar(0x0D);
output_high(blue_led);
while(counter_read<8)
{
}
output_low(blue_led);
counter_read=0;
delay_ms(500);
////////////////////////////////////////////////////////////////////////////////
counter_search=0;
while((recieve_string[counter_search]!='O')&&(counter_search<10))
{
counter_search++;
}
if((recieve_string[counter_search]=='O')&&(recieve_string[counter_search+1]=='K'))
{
output_high(green_led);
counter_search=0;
}
else
{
output_low(green_led);
counter_search=0;
}
////////////////////////////////////////////////////////////////////////////////
}
} |
I've tried this program with hyper terminal, it is waiting me to entry datas should include O and K somewhere in 8 bytes, i can see the result on my circuit (turn on green light).
However; when i try it with mobile (sony ericsson t290i), blue led never stops it means program still waiting for datas until 8 byte completes.
I've tried changing rx/tx cables from mobile side, it didn't work
I'm sendig my circuit picture too. Just have a look please.
Can you something wrong? Or do you have any idea about my still-continuing problem?
|
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Tue Mar 27, 2012 1:26 pm |
|
|
Ah! you are using the same cell as my program!
I see you modified the code a bit...
no need for the '\n' character... take it off.
also:
Code: | while(counter_read<8) |
my code was:
Code: | while(counter_read<=8) |
im expecting "A T \R \R \N O K \R \N" from the phone...
however note that the above string includes the echoed characters..
if you disabled the local echo "ATE=0", you will only get:
"\R \N O K \R \N" which is less than 8 chars...so you will be stuck in the loop... waiting for nothing.
I know I advised to turn off local echos... however the code in the post is designed with local echo enabled.... it was my first attempt at GSM.
You can change the loop to wait for (1)one character (if local echo is off!)... and then give it
a 500ms (Completly arbitrary, however reasonable for testing) delay.
Also.. I am assuming since you are using the T290i that you have the serial cable (DB9 connector on the end).... and that you are using a MAX232 chip.... you swap the tx/rx lines between the MAX chip and the DB9 connector on the cable (pins 2 and 3)
You must swap the tx/rx lines, and pull pin 4 high if don't remember correctly (i tied it directly to VCC however a 10k pull up i think does the job ).... you need to make your own cable... that goes from the breadboard to the cell cable's DB9 connector... or use one of those breadboard DB9 adapters...
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Tue Mar 27, 2012 2:18 pm |
|
|
Just to be clear...
You need to pull high pin 4 on the DB9 connector of the CELL.
Swap the tx rx lines between the Cell and your MAX232.
g. _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
gokayk
Joined: 25 Mar 2012 Posts: 8
|
|
Posted: Tue Mar 27, 2012 3:08 pm |
|
|
Gabriel wrote: | Ah! you are using the same cell as my program!
I see you modified the code a bit...
no need for the '\n' character... take it off.
also:
Code: | while(counter_read<8) |
my code was:
Code: | while(counter_read<=8) |
im expecting "A T \R \R \N O K \R \N" from the phone...
however note that the above string includes the echoed characters..
if you disabled the local echo "ATE=0", you will only get:
"\R \N O K \R \N" which is less than 8 chars...so you will be stuck in the loop... waiting for nothing.
I know I advised to turn off local echos... however the code in the post is designed with local echo enabled.... it was my first attempt at GSM.
You can change the loop to wait for (1)one character (if local echo is off!)... and then give it
a 500ms (Completly arbitrary, however reasonable for testing) delay.
Also.. I am assuming since you are using the T290i that you have the serial cable (DB9 connector on the end).... and that you are using a MAX232 chip.... you swap the tx/rx lines between the MAX chip and the DB9 connector on the cable (pins 2 and 3)
You must swap the tx/rx lines, and pull pin 4 high if don't remember correctly (i tied it directly to VCC however a 10k pull up i think does the job ).... you need to make your own cable... that goes from the breadboard to the cell cable's DB9 connector... or use one of those breadboard DB9 adapters...
G |
The best way of learning something new, try to understand how it is written ;)
I will change them, then i will try again. And i think i wont disable the local echo until i can't find any new solutions.
Sometimes when i try to send AT command to phone by using hyper terminal, then few attempts fails. I mean I can't send AT all the time. But after i can send AT commands, it gives OK responses right away. I don't know why is like that. The problem can be because of this issue. What do you think?
I bought USB data cable (it is difficult to find data cable with DB9 connector in Turkey) then i cut the USB side includes its own circuit. Then i soldered new control cable to the connector (phone side), i am using 3 cable (rx,tx & gnd) for my max232 circuit.
So which pin should i pull-up by using resistor from phone side?
http://pinouts.ru/CellularPhones-P-W/erics_t28_pinout.shtml
Sorry about too many questions |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Tue Mar 27, 2012 3:21 pm |
|
|
Your diagram does not show the phone ground connected to the PIC ground.
Without this it won't work. Perhaps the diagram is wrong or you really don't have a ground ?? |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Tue Mar 27, 2012 3:44 pm |
|
|
I'm not able to see your diagram... link?
Ok, so i guess you are hooking up the pic directly to the phone? and are only using the connector to get physical access to the pone pins?
Then you do not need the Max 232... however the phone is operating at 3.3V..... a level converter should be used probably. in this case a voltage divider on the PIC tx line should do the trick.
If you connect directly then you don't need to swap the lines... just make sure you have tx to Rx and rx to Tx accordingly.
Which pin on the cell needs to be high?
http://en.wikipedia.org/wiki/IEEE_802.11_RTS/CTS ignore this...
Edit... its this link...
Quote: | http://en.wikipedia.org/wiki/RS-232_RTS/CTS#RTS.2FCTS_handshaking |
That should give you a hint.
However.... check the AT command list and see if it is possible to turn off the Hardware flow control.... if so, then all you need is GND. RX and TX!
G. _________________ CCS PCM 5.078 & CCS PCH 5.093
Last edited by Gabriel on Tue Mar 27, 2012 4:01 pm; edited 2 times in total |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Tue Mar 27, 2012 3:52 pm |
|
|
Quote: | Sometimes when i try to send AT command to phone by using hyper terminal, then few attempts fails. I mean I can't send AT all the time. But after i can send AT commands, it gives OK responses right away. I don't know why is like that. The problem can be because of this issue. What do you think? |
The above worries me alot.
How are you connecting the phone to hyperterminal?
The PC is using +/-12V signals... if you hook this up the phone directly.. you probably fried the cell... and thats why you only have intermittent functionality if any.
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
gokayk
Joined: 25 Mar 2012 Posts: 8
|
|
Posted: Wed Mar 28, 2012 2:29 am |
|
|
temtronic wrote: | Your diagram does not show the phone ground connected to the PIC ground.
Without this it won't work. Perhaps the diagram is wrong or you really don't have a ground ?? |
Phone ground & pic ground & Max232 circuit ground & power supply ground are all connected to common ground. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|