![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
filjoa
Joined: 04 May 2008 Posts: 260
|
read sms without interrupts |
Posted: Mon May 26, 2008 9:57 am |
|
|
Hi
is possible read an sms without use interrupts?
I have mobile phone on virtual port RS232 and I like read an sms how stay on phone... I have this...
Code: |
#include <18F252.h>
#include <stdlib.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=gpsport)
#use rs232(baud=19200, parity=N, xmit=PIN_C4, rcv=PIN_C5, bits=8, stream=tlmport)
void read()
{
char sms[];
char lsms;
int i,k;
i=0;
k=0;
//ler SMS recebida
fprintf(tlmport,"at\n\r");
delay_ms(500);
fprintf(tlmport,"at+cmgf=1\r");
delay_ms(500);
fprintf(tlmport,"at+cmgr=1\r");
do {
i++;
lsms=getc(tlmport);
sms[i]=lsms;
}while(sms!='\n');
//comparar SMS's
fprintf(gpsport,"mensagem:\n\r");
for (k=6;k<=15;k++)
{
fprintf(gpsport,"%c"sms[k]);
}
}
void main()
{
while(1)
{
if (input(PIN_B7)==1)
{
read();
}
}
}
|
this program stop on "do{} while" some one can give me an idea?
regards |
|
![](templates/subSilver/images/spacer.gif) |
Indy
Joined: 16 May 2008 Posts: 24
|
|
Posted: Mon May 26, 2008 11:07 am |
|
|
sms is the start address of the array, it will never become equal to '\n'. Change to Code: | }while(lsms!='\n'); |
|
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Tue May 27, 2008 4:00 am |
|
|
hi
I correct this bug but it dont work
when I write on terminal at+cmgr=1 phone return this:
Quote: |
+CMGR:"REC UNREAD","+351965542750", "0", "0",,"08/05/26,16:16:36+04"
localizacao <SMS via www.tmn.pt>
OK
|
is possible copy this to a array?
or if is possible generate an interrupt on a virtual RS232...
best regards |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 27, 2008 8:16 am |
|
|
First time I only had a quick look at your code but there appear to be more problems. Code: | #fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000) | The XT fuse and a clock speed of 40MHz are an invalid combination. What speed are you running?
This only declares a pointer to an array. There is no space allocated for the array which means that in your code you are writing to random memory. A huge bug!
Change to Code: | #define MAX_SMS_LENGTH 200 // Set this to the maximum SMS length you expect to receive
char sms[MAX_SMS_LENGTH]; |
A minor bug: Code: | fprintf(gpsport,"%c"sms[k]); | A comma is missing between the specifier string and the parameter, correct code is Code: | fprintf(gpsport,"%c",sms[k]); | Strange, the CCS compiler should have given an error message here but instead it compiles correctly.
Quote: | is possible copy this to a array? | Yes, you can copy the received data to an array. The only change to your program required is not to stop at '\n' but stop on 'OK'.
Quote: | or if is possible generate an interrupt on a virtual RS232... | It is not a virtual RS232, the correct name is 'software UART'. Only with a trick you can get an interrupt for a software UART, that is when you feed the receive signal to the INT_EXT pin. For example code on how to do this you will have to search this forum. |
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Tue May 27, 2008 3:47 pm |
|
|
Hi
thanks ckielstra, my project runing on 40Mhz with oscilator external...
I make this updates to my program but I cant save sms at array I dont know what stay wrong...
Code: |
#include <18F252.h>
#include <stdlib.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=gpsport)
#use rs232(baud=19200, parity=N, xmit=PIN_C4, rcv=PIN_C5, bits=8, stream=tlmport)
#build(reset=0x200)
#build(interrupt=0x208)
#org 0x0000,0x01ff
void bootloader() {
#asm
nop
#endasm
} // Reserve space for the bootloader
#define MAX_SMS_LENGTH 200 // Set this to the maximum SMS length you expect to receive
void read()
{
char sms[MAX_SMS_LENGTH];
char lsms;
int i,k;
i=0;
k=0;
//ler SMS recebida
fprintf(tlmport,"at\n\r");
delay_ms(500);
fprintf(tlmport,"at+cmgf=1\r");
delay_ms(500);
fprintf(tlmport,"at+cmgr=1\r");
fprintf(gpsport,"SMS:\n\r");
/*
while(1)
{
lsms=fgetc(tlmport); //escrever directo o que esta a ler do GPS
fputc(lsms,gpsport);
}
*/
do {
i++;
lsms=fgetc(tlmport);
sms[i]=lsms;
}while(lsms!='K');
fprintf(gpsport,"print:\n\r");
for (k=6;k<=15;k++)
{
fprintf(gpsport,"%c",sms[k]);
}
}
void main()
{
int a;
a=0;
a=input(PIN_B7);
while(1)
{
fprintf(gpsport,"cicle...\n\r");
if (input(PIN_B7)==1)
{
read();
}
}
}
|
on this simple example I like print on terminal the sms number one... if I write this commands on terminal mobile phone give me the sms but this way no...
now when it program runing on terminal I see "cicle..." and when I put a positive signal on pin B7 appear "SMS:" and program break... dont give more data...
if some have ideias....
regards |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 27, 2008 5:18 pm |
|
|
Quote: | now when it program runing on terminal I see "cicle..." and when I put a positive signal on pin B7 appear "SMS:" and program break... dont give more data... | Strange. I only have some minor suggestions, maybe one of them will fix the problem.
filjoa wrote: | my project runing on 40Mhz with oscilator external... | Than you have to change the XT fuse to EC or EC_IO (this makes OSC2 pin available for I/O). Using the XT fuse probably will work but is wasting current.
Don't forget to change the fuse in your bootloader as well. The bootloader can not change the fuses so effectively only the fuses of the bootloader are used.
Code: | fprintf(tlmport,"at+cmgr=1\r");
fprintf(gpsport,"SMS:\n\r"); | Try reversing these two lines. Now you are running the risk that the phone is already sending a response while you are still transmitting at the gpsport. You could loose up to 6 or 7 characters.
Code: | do {
i++;
lsms=fgetc(tlmport);
sms[i]=lsms;
}while(lsms!='K'); | It's not a bug, but in C an array starts at offset 0. You are writing to offset 1, wasting 1 byte of memory. The fix is easy, increment i at the end of the loop, not at the start.
Another problem is that we have no protection for receiving a message larger than the array size. This could lead to unpredictable results. Here is an improved version of the above code:
Code: | do
{
lsms=fgetc(tlmport);
sms[i]=lsms;
i++;
}while( (lsms!='K') && (i<MAX_SMS_LENGTH) ); |
|
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Wed May 28, 2008 11:43 am |
|
|
Hi
thanks for opinion of oscilator... you have reason I put EC_IO .... on bootloadr stay all correct
now I make how tell me and change "for cicle" to:
Quote: |
for (k=0;k<=30;k++)
{
fprintf(gpsport,"%c",sms[k]);
}
|
and now on terminal when I click on PIN_B7 I see:
SMS:
print:
cicle...
it continue dont save sms on array...
this is code after your ideia...
Quote: |
#include <18F252.h>
#include <stdlib.h>
#include <string.h>
#fuses EC_IO,NOWDT,NOPROTECT,NOLVP
#use delay(clock=40000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=gpsport)
#use rs232(baud=19200, parity=N, xmit=PIN_C4, rcv=PIN_C5, bits=8, stream=tlmport)
#build(reset=0x200)
#build(interrupt=0x208)
#org 0x0000,0x01ff
void bootloader() {
#asm
nop
#endasm
} // Reserve space for the bootloader
#define MAX_SMS_LENGTH 200 // Set this to the maximum SMS length you expect to receive
void read()
{
char sms[MAX_SMS_LENGTH];
char lsms;
int i,k;
i=0;
k=0;
fprintf(gpsport,"SMS:\n\r"); //ler SMS recebida
fprintf(tlmport,"at\n\r");
delay_ms(500);
fprintf(tlmport,"at+cmgf=1\r");
delay_ms(500);
fprintf(tlmport,"at+cmgr=1\r");
/*
while(1)
{
lsms=fgetc(tlmport); //escrever directo o que esta a ler do GPS
fputc(lsms,gpsport);
}
*/
do
{
lsms=fgetc(tlmport);
sms[i]=lsms;
i++;
}while( (lsms!='K') && (i<MAX_SMS_LENGTH) );
fprintf(gpsport,"print:\n\r");
for (k=0;k<=30;k++)
{
fprintf(gpsport,"%c",sms[k]);
}
}
void main()
{
int a;
a=0;
a=input(PIN_B7);
while(1)
{
fprintf(gpsport,"cicle...\n\r");
if (input(PIN_B7)==1)
{
read();
}
}
}
|
I dont know what stay wron...
regards |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed May 28, 2008 5:47 pm |
|
|
What is your compiler version number? |
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Wed May 28, 2008 6:09 pm |
|
|
IDE Ver.4.058
PCB Ver.4.058
PCM Ver.4.058
PCH Ver.4.058
PCD Ver.4.057
you think how this program stay correct and problem is cause compiler? |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed May 28, 2008 6:55 pm |
|
|
Strange...
Can you change the Code: | fprintf(gpsport,"%c",sms[k]); | to Code: | fprintf(gpsport," %2X",sms[k]); | Note the space before the % sign.
If you see all '00' values printed than check your hardware.
How is the phone connected to the PIC? Is there a MAX232 or similar voltage level converter used? |
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Thu May 29, 2008 9:32 am |
|
|
Hi
when arrive at home I try modify this print in code..
my mobile phone is samsung sgh-x450 and I dont have any interface for connect phone to PIC this stay direct...
I need put MAX232? TTL phone work at 3.3V.. if I need put an MAX232 how I conect them?
regards |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu May 29, 2008 9:47 am |
|
|
You said you connected the phone to a terminal program. I assume this terminal program was running on the PC? How do you connect the phone to the PC?
I'm not sure you need a max232. Check out the hardware of your phone for:
- What is the voltage on the serial line when no data is sent?
- And what is the voltage on the serial line when data is sent?
If the phone is running at 3.3V, then what voltage is the PIC running at? |
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Thu May 29, 2008 5:08 pm |
|
|
Hi
with this modification on terminal I see this many times when I press B7:
Quote: |
SMS:
print:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00cicle...
|
what this mean "00 00 00...."??
My conections is:
phone conect to the PIC (virtual RS232) and PIC to the PC (terminal)
I use an USB to RS232 converter.
I see voltage on PIC and phone and on PIC(TX=4.4V RX=4.4V) on PHONE(TX=2.4V RX=4.4V)
phone try talk with PIC with 2.4V dont is litle? |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu May 29, 2008 5:44 pm |
|
|
The software UART generated by the CCS compiler is very simple. It expects the inactive state to have a logic high and the first start bit will then cause the signal to go low. As soon as the soft UART sees a logic low it starts sampling data.
You received all '00' data, this means the soft UART always sees a logic low. This is a hardware related problem.
Quote: | PHONE(TX=2.4V RX=4.4V) | If your PIC is running at 5V than the 2.4V is too low, you will have to insert a 3V to 5V voltage level translator. Search the internet on this subject. Texas Instruments sells specialized chips but you can also create a simple converter with a transistor and few resistors.
From the PIC to the phone for safety it is best to add a 5V to 3V level translator (just two resistors). Otherwise if your phone input is not 5V compliant you are running the risk of destroying your phone. |
|
![](templates/subSilver/images/spacer.gif) |
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Sat May 31, 2008 10:50 am |
|
|
Hi
today I edit my circuit and put one max232 but I only can conect line TX of mobile phone... have this:
Phone(TX)--->>max(11)-->max(14)---->>PIC(RX)
or
Phone(TX)--->>max(13)-->max(12)---->>PIC(RX)
with this program:
Quote: |
void read()
{
char sms[MAX_SMS_LENGTH];
char lsms;
int i,k;
i=0;
k=0;
fprintf(gpsport,"SMS:\n\r"); //ler SMS recebida
fprintf(tlmport,"at\n\r");
delay_ms(500);
fprintf(tlmport,"at+cmgf=1\r");
delay_ms(500);
fprintf(tlmport,"at+cmgr=1\r");
do
{
lsms=fgetc(tlmport); //escrever directo o que esta a ler do GPS
fputc(lsms,gpsport);
i++;
}while((lsms!='K') && (i<MAX_SMS_LENGTH) );
fprintf(gpsport,"\n\r");
|
but result on terminal is this:
Quote: |
cicle...
SMS:
º”—*ŠÚTÜV
cicle...
SMS:
к”–*ŠÚTÖV
cicle...
SMS:
=©9%1å
cicle...
SMS:
º”—*ŠÚTÜV
cicle...
|
if I try connect phone(RX) to the max232 it stop write on terminal...
some ideias?
regards |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|