View previous topic :: View next topic |
Author |
Message |
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
pic to pic serial communication |
Posted: Tue Feb 21, 2012 5:10 am |
|
|
I trying to communicate b/w two pic 16f877a via serial. The first pic sends a number and it has to be received by the 2nd pic. The two pic's were configured using UART and sending the value through hardware USART to the 2nd pic. This data is further sent to the pc via software USART. But i am getting some garbage value on the hyper terminal.Can anyone please help? |
|
|
mateeb4u@gmail.com
Joined: 07 Feb 2012 Posts: 19 Location: pakistan
|
Baud rate |
Posted: Tue Feb 21, 2012 5:37 am |
|
|
Check about there Baud Rate
Baud must be same |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Tue Feb 21, 2012 6:48 am |
|
|
1) post compiler version...
2) post small version of compilable code .
3) Are you using MAX232 chips between PICs and PC ?
4)Have you tried a 'loopback test' to confirm hyperterminal/PC are working right?Baudrate,databits,stopbits,flow control,etc.
5)Have you added 'errors' to the USE RS232(...) options, if using the hardware UART in the PICs? |
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
|
Posted: Tue Feb 21, 2012 8:45 am |
|
|
Compiler version 3.36
Ya I am using MAX232 on Both sides
I first checked the transmitter side by connecting it to the PC hyper terminal. Its working.
At the reliever side I am using both hardware and software serial . I tried to print some data to PC through software serial and its also working.
And also Baud Rate , 9600 at both ends.
My doubt is whether I have to make any conversion?
I haven't used errors. I will check it now.
Thanks for the reply |
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
Transmit program |
Posted: Tue Feb 21, 2012 8:54 am |
|
|
Code: | #include<16F877A.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include<String.h>
#include<pic.h>
void main()
{
while(1)
{
printf("rain");
}
} |
|
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
Receive program |
Posted: Tue Feb 21, 2012 8:55 am |
|
|
Code: | #include<16F877A.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include<String.h>
#include<pic.h>
void main()
{
int i;
char a[5];
trisd=0x00;
RD0=RD1=RD2=RD3=RD4=RD5=RD6=RD7=0;
while(1)
{
char pwd[]="rain";
for(i=0;i<4;i++)
{
a[i]=getchar();
}
if(Strcmp(a,pwd)==0)
{
RD0=1;
delay_ms(2000);
RD0=0;
delay_ms(2000);
}
else
{
RD1=1;
delay_ms(2000);
RD1=0;
delay_ms(2000);
}
}
} |
|
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Tue Feb 21, 2012 12:57 pm |
|
|
What are you expecting to see as an indication that you received something
(good or bad) on the receive PIC? All you are doing is assigning a value to
a variable. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Tue Feb 21, 2012 3:44 pm |
|
|
In fact, the receive chip will hang after the first pass.
The transmit sends 'rain' continuously. 960 characters per second, without pause.
The receive function, waits for four characters, and then _does not null terminate the string_. So will not match the required test value. As soon as it fails, the 4 seconds of delay, will have 3840 characters arriving without being handled. UART will therefore lock....
So, you need _ERRORS_ in the receive code.
You need to have a delay in the transmit code that it _more_ than those in the receive, or you will never have any chance of keeping synchronisation (or send a line feed after the message, and synchronise to this).
You need to add the null termination to the string before testing.
Best Wishes |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Tue Feb 21, 2012 4:03 pm |
|
|
To emphasize a point Ttelmah makes, when you send "rain" continuously like that, the Stop bit of 'n' will be immediatly followed by the Start bit of 'r' and the receiver UART will have a very hard time synchronizing to the incoming barrage of bits.
It would help a lot to leave a character wide gap (1ms) between messages so the UART knows when to start. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
|
Posted: Tue Feb 21, 2012 4:25 pm |
|
|
Thanks for the replies . I will try with delay and errors. and will reply back |
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
RX pgm |
Posted: Tue Feb 21, 2012 5:39 pm |
|
|
Now here is my code : Receiver
Code: | #include<16F877A.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,errors,bits=8,stream=s1)
#use rs232(baud=9600,parity=N, xmit=PIN_D0,rcv=PIN_D1,errors,bits=8,stream=s2)
#include<String.h>
#include<pic.h>
void main()
{
int i;
char a[5];
trisd=0x00;
RD0=RD1=RD2=RD3=RD4=RD5=RD6=RD7=0;
fprintf(s2,"SoftSerial");
for(i=0;i<4;i++)
{
a[i]=0;
}
while(1)
{
char pwd[]="rain";
if(!kbhit())
{
for(i=0;i<4;i++)
{
a[i]=getchar();
}
a[i]='\0';
fprintf(s2,a);
}
if(Strcmp(a,pwd)==0)
{ fprintf(s2,"SoftSerial2");
RD0=1;
RD1=0;
delay_ms(800);
}
else
{
fprintf(s2,"SoftSerial failed");
delay_ms(800);
RD1=1;
}
}
} |
|
|
|
ratheeshbr
Joined: 26 Jan 2011 Posts: 31
|
|
Posted: Tue Feb 21, 2012 5:40 pm |
|
|
Transmit:
Code: | #include<16F877A.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include<String.h>
#include<pic.h>
void main()
{
while(1)
{
printf("rain");
delay_ms(2);
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Feb 22, 2012 3:21 am |
|
|
You are still missing the fundamental 'point' about timing.
Assume both chips start together.
The 'transmit' chip starts sending 'rain' immediately.
Your receive chip, now sits and sends 'SoftSerial', taking 9.6mSec to do so.
By this time, the transmit chip will have sent 'rain rai'.
The hardware receive buffer will contain the 'a', and the 'i' (probably), so you receive 'ainr' when you start to look for the string.
Your slave needs to _synchronise_. It needs to actually scan the incoming data either looking for a 'marker' character you add to say 'end of message', or the time break that is now present, and only then start looking for the message The receive code needs to be looking for the time delay, or you need to add a marker character, and look for this (typically line feed, or ASCII STX).
Best Wishes |
|
|
|