|
|
View previous topic :: View next topic |
Author |
Message |
TheRidDler
Joined: 13 Jun 2007 Posts: 7
|
Wireless Communication Problem |
Posted: Sun Jun 24, 2007 9:47 pm |
|
|
Hi all! I really love this forum, one learns quickly here I have a small problem, i hope you can help me with this, as its my final year project and need to get this working or no degree :( Me and a friend wrote this code together specifically for our system.
This is our setup : We have a remote board with a GPS unit and a Radiometrix Transmitter. The board is controlled by a 18F252. The PIC takes the positional sentence from the GPS and transmits it to the local receiver board. The local board has a Radiometrix Receiver unit , 18F252 and a MAX232N. This board only relays the data to the PC so that a GUI can play with it.
When opening the console window however, absolutely nothing gets received. If possible could you guys that probably know a bit more about PIC coding than us please take a look at our code to see if you can maybe spot something that might be causing this? Thanks alot for all your help!
Remote (GPS) Board
Code: |
#include <18F252.h>
#include <stdlib.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,stop=1,parity=N,rcv=PIN_B4,bits=8,stream=GPS,errors) //data from GPS to PIC
char ToBeSend[128],EncodedData[256];
void encodeRF()
{
//Encoding of data byte to manchester coding
char Send1,Send2,txbyte;
int8 encode=0, index=0;
while (encode < 128){
txbyte = ToBeSend[encode];
encode++;
if (bit_test(txbyte,7)) { bit_set(Send1,7), bit_clear(Send1,6); }
else { bit_clear(Send1,7), bit_set(Send1,6); }
if (bit_test(txbyte,6)) { bit_set(Send1,5), bit_clear(Send1,4); }
else { bit_clear(Send1,5), bit_set(Send1,4); }
if (bit_test(txbyte,5)) { bit_set(Send1,3), bit_clear(Send1,2); }
else { bit_clear(Send1,3), bit_set(Send1,2); }
if (bit_test(txbyte,4)) { bit_set(Send1,1), bit_clear(Send1,0); }
else { bit_clear(Send1,1), bit_set(Send1,0); }
if (bit_test(txbyte,3)) { bit_set(Send2,7), bit_clear(Send2,6); }
else { bit_clear(Send2,7), bit_set(Send2,6); }
if (bit_test(txbyte,2)) { bit_set(Send2,5), bit_clear(Send2,4); }
else { bit_clear(Send2,5), bit_set(Send2,4); }
if (bit_test(txbyte,1)) { bit_set(Send2,3), bit_clear(Send2,2); }
else { bit_clear(Send2,3), bit_set(Send2,2); }
if (bit_test(txbyte,0)) { bit_set(Send2,1), bit_clear(Send2,0); }
else { bit_clear(Send2,1), bit_set(Send2,0); }
EncodedData[index] = Send1;
EncodedData[index+1] = Send2;
index = index+2;
}
}
void Transmit(char IDUnit)
{
int8 i = 0;
set_tris_a(0x00);
#use rs232(baud=57600,parity=N,bits=8,xmit=PIN_A0,RESTART_WDT,errors)// data from PIC to PC
//delay_ms(40); //Give Relay Unit time to change TRX to RX mode
delay_ms(5);
for (i=0;i<200;i++) //Training sequence
putc(0xAA);
putc(0xFF);
putc(0xFF);
putc(0xCC); //Header #1
putc(0x33); //Header #2
putc(0x55); //Header #3
putc(IDUnit); //ID of unit to be communicated to
for (i=0; i<256; i++)//Data
putc(EncodedData[i]);
putc(0x00); //Ending Sequence of transmition
putc(0x00);
for (i=0;i<128;i++)
{ //clear the TX buffer for next transmission
ToBeSend[i] = 0x00;
}
}
#define GPS_BUFFER_SIZE 128
char gps_buffer[GPS_BUFFER_SIZE]; // A place to store the string
char *GPS_GetField( int index )
{
char *p = gps_buffer;
int count = 0;
while( *p )
{
if( *p++ == ',' )
{
if( count++ == index )
{
return p;
}
}
}
return p;
}
long GPS_Min_To_Dec( char *p )
{
long value;
int decimal;
value = atol(p) + 3; // to round to the nearest minute
decimal = value % 100;
value -= decimal;
value /= 10;
value += decimal / 6;
return value;
}
void Send_To_PC()
{
int t;
for(t=0;t<GPS_BUFFER_SIZE;t++)
ToBeSend[t]=gps_buffer[t];
encodeRF();
Transmit(0xAA);
}
void main()
{
char ch;
int checksum1, checksum2, index;
set_tris_b( 0xFF );
port_b_pullups( 1 );
for(;;)
{
ch = getch(GPS);
switch( ch )
{
case '\n':
continue;
case '$':
index = checksum1 = checksum2 = 0;
break;
case '*':
checksum2 = 1;
break;
case '\r':
ch = gps_buffer[index-2];
checksum2 = ((ch < 'A') ? (ch - '0') : (ch - 'A' + 10)) << 4;
ch = gps_buffer[index-1];
checksum2 += ((ch < 'A') ? (ch - '0') : (ch - 'A' + 10));
if( checksum1 == checksum2 )
{
gps_buffer[index] = 0;
// the first unique letter is R
if( gps_buffer[3] == 'R' )
{
Send_To_PC();
}
}
default:
if( checksum2 == 0 )
{
checksum1 ^= ch;
}
break;
}
if( index < GPS_BUFFER_SIZE - 1 )
{
gps_buffer[index++] = ch;
}
}
}
|
Local Reveiver Board
Code: |
#include <18F252.h>
#include <stdlib.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
const char Address = 0xAA;
char Received[256],RFIndicator = 0x00,DecodedData[128];
int16 timeout = 0;
char decodeRF (char P1,P2)
{
char value = 0x00;
//Decoding of manchester encoded received information
disable_interrupts(GLOBAL);
if( bit_test(P2,0) && !bit_test(P2,1) ) { bit_clear ( value,0); }
else if( !bit_test(P2,0) && bit_test(P2,1) ) { bit_set ( value,0); }
else goto ERROR;
if( bit_test(P2,2) && !bit_test(P2,3) ) { bit_clear ( value,1); }
else if( !bit_test(P2,2) && bit_test(P2,3) ) { bit_set ( value,1); }
else goto ERROR;
if( bit_test(P2,4) && !bit_test(P2,5) ) { bit_clear ( value,2); }
else if( !bit_test(P2,4) && bit_test(P2,5) ) { bit_set ( value,2); }
else goto ERROR;
if( bit_test(P2,6) && !bit_test(P2,7) ) { bit_clear ( value,3); }
else if( !bit_test(P2,6) && bit_test(P2,7) ) { bit_set ( value,3); }
else goto ERROR;
if( bit_test(P1,0) && !bit_test(P1,1) ) { bit_clear ( value,4); }
else if( !bit_test(P1,0) && bit_test(P1,1) ) { bit_set ( value,4); }
else goto ERROR;
if( bit_test(P1,2) && !bit_test(P1,3) ) { bit_clear ( value,5); }
else if( !bit_test(P1,2) && bit_test(P1,3) ) { bit_set ( value,5); }
else goto ERROR;
if( bit_test(P1,4) && !bit_test(P1,5) ) { bit_clear ( value,6); }
else if( !bit_test(P1,4) && bit_test(P1,5) ) { bit_set ( value,6); }
else goto ERROR;
if( bit_test(P1,6) && !bit_test(P1,7) ) { bit_clear ( value,7); }
else if( !bit_test(P1,6) && bit_test(P1,7) ) { bit_set ( value,7); }
else goto ERROR;
// value decoded
return value;
ERROR:
return 'E';
}
void Send_To_GUI()
{
int t;
#use rs232(baud=57600,stop=1,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8,errors)
output_high(PIN_B3);
for(t=0;t<128;t++)
putc(DecodedData[t]);
}
void Receive()
{
int counter = 0x00, position = 0x00;
char Header[3] = {0x00,0x00,0x00};
char Identifier = 0x00;
int RFtimeout = 20;
for (counter=0;counter<128;counter++)
Received[counter] = 0x00;
counter = 0x00;
#use rs232(baud=57600,stop=1,parity=N,rcv=PIN_C7,bits=8,RESTART_WDT,errors)
//WAITING RX ROUTINE..
set_timer3(0x0000);
timeout = 0;
enable_interrupts(int_TIMER3);
enable_interrupts(global);
WAIT:
//WAITING RX ROUTINE
Header[0] = getchar();
if(timeout > RFtimeout)
{
disable_interrupts(int_TIMER3);
timeout = 0;
RFIndicator = 0x01; //This is the timeout and well received indicator
goto OUT;
}
if(Header[0] != 0xCC)
goto WAIT;
Header[1] = getchar();
if(timeout > RFtimeout)
{
disable_interrupts(int_TIMER3);
timeout = 0;
RFIndicator = 0x01; //This is the timeout and well received indicator
goto OUT;
}
if(Header[1] != 0x33)
goto WAIT;
Header[2] = getchar();
if(timeout > RFtimeout)
{
disable_interrupts(int_TIMER3);
timeout = 0;
RFIndicator = 0x02; //This is the timeout and well received indicator
goto OUT;
}
if(Header[2]!= 0x55)
goto WAIT;
Identifier = getchar();
if(timeout > RFtimeout)
{
disable_interrupts(int_TIMER3);
timeout = 0;
RFIndicator = 0x03; //This is the timeout and well received indicator
goto OUT;
}
if(Identifier != Address)
goto WAIT;
Identifier = 0x00;
disable_interrupts(int_TIMER3);
while(counter < 128)
{
Received[counter] = getchar();
counter++;
}
counter = 0x00;
while (counter < 64)
{
DecodedData[position] = decodeRF(Received[counter],Received[counter+1]);
position++;
counter = counter + 2;
}
RFIndicator = 0x00; //This is the timeout and well received indicator
OUT:
disable_interrupts(global);
}
void main()
{
output_high(PIN_B2);
while(1)
{
Receive();
Send_To_GUI();
output_low(PIN_B3);
}
}
|
Some Additional Info :
Remote Board -> GPS Receive(Pin B4), RF Xmit(Pin A0) [GPS=9600,RF=57600]
Local Receiver Board -> RF Receive(Pin C7), Max232 Xmit(Pin A0),Max232 Rcv (Pin A1), B2&B3 - LED's [RF=57600, Max232=57600]
Both run at 20Mhz.
Thnx again! |
|
|
grasspuddle
Joined: 15 Jun 2006 Posts: 66
|
|
Posted: Tue Jun 26, 2007 6:39 am |
|
|
Is your for loop suppose to be empty?
Quote: | Code: |
void main()
{
char ch;
int checksum1, checksum2, index;
set_tris_b( 0xFF );
port_b_pullups( 1 );
for(;;)
{
ch = getch(GPS);
|
| [/b] |
|
|
TheRidDler
Joined: 13 Jun 2007 Posts: 7
|
|
Posted: Tue Jun 26, 2007 8:42 am |
|
|
Hey, thnx for the reply. Yes, that part of the code is working fine, the problem lies somewhere in the RF section... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 26, 2007 1:16 pm |
|
|
Quote: | enable_interrupts(int_TIMER3);
enable_interrupts(global); |
You're enabling interrupts, but you don't have an #INT_TIMER3
interrupt service routine. This means your program will crash
the first time it gets a Timer3 interrupt.
You're setting the TRIS, but you haven't specified #use fast_io(a) mode.
The default mode of the compiler is "standard io" mode. In that mode
it sets the TRIS for you. Because the compiler is in standard i/o mode,
the library code and the CCS pin i/o functions will override your
set_tris_a(0x00) statement as required.
I didn't check the rest of your code because there's just too much of it. |
|
|
|
|
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
|