CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

sending data to pic via max 232 by rs232 not working in prot

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

sending data to pic via max 232 by rs232 not working in prot
PostPosted: Sat Dec 28, 2013 9:57 pm     Reply with quote

Hi guys i posted this post in two forums before i post this here
but no one gave me a answer.I know this site is only for ccs c problems not for proteus problems. so only for now please help me with this problem if you can

I need send data between pc and pic so i made this schematic using proteus wrote the very simple ccs c code for pic 18f2550.
Code:

#include<18f2550.h>
#fuses NOWDT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
 #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,INVERT,parity=N,bits=8)   

void main()
{
char a;
printf("Start typing ...\n.");

while(1)   
  {
   a=getc();
   putc(a);   
  }   
}

and my schematic is goto http://obrazki.elektroda.pl/2276196000_1388233204.jpg
and when i run the code the result is like this goto http://obrazki.elektroda.pl/6774018100_1388233383.jpg

So friend before this i used ex_sisr.c with little change
Code:

#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)   

#elif defined(__PCH__)
#include <18F2550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS,INVERT)   

#elif defined(__PCD__)
#include <30F2010.h>
#fuses HS, NOWDT, NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, UART1A)
#endif     
#define BUFFER_SIZE 32
 
 BYTE buffer[BUFFER_SIZE];
 BYTE next_in = 0;
 BYTE next_out = 0;
#int_rda

void serial_isr()
{    int t;

 buffer[next_in]=getc();   
 t=next_in;
 next_in=(next_in+1) % BUFFER_SIZE;   
 if(next_in==next_out)     
 next_in=t;           // Buffer full !!
 }

#define bkbhit (next_in!=next_out)   

BYTE bgetc()
{
BYTE c;
while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;   
return(c);
}


void main()
{
   enable_interrupts(int_rda);
   #if defined(__PCD__)   
   enable_interrupts(intr_global);   
   #else
   enable_interrupts(global);
   #endif
   printf("\r\n\Running...\r\n");
                 

// The program will delay for 10 seconds and then display                // any data that came in during the 10 second delay
do
  {
   delay_ms(10000);       
   printf("\r\nBuffered data => ");
   while(bkbhit)
   putc( bgetc() );
  } while (TRUE);
}

so proteus result for this is http://obrazki.elektroda.pl/5680434400_1388234039.jpg

So in the both above cases i clicked on rx vir: terminal pressed keyboard buttons but they (the characters i pressed) did not appear in output terminal.
If i say clearly in first case (according to my little code) i pressed keys buttons but output is like in image ("start typing" then nothing).
In second case the long code i keep pressing keys for 10s but output like the image i added ( buffered data..buffered data.. as in there).

And also i used Hyperterminal with virtual serial port software in second experiment but same results came as in image.
I'm using proteus 7.8


Think you clearly got my problem and show me how to fix this...
Please help me guys!!
dyeatman



Joined: 06 Sep 2003
Posts: 1923
Location: Norman, OK

View user's profile Send private message

PostPosted: Sat Dec 28, 2013 10:06 pm     Reply with quote

When using the RS232 chip (appears to be MAX232) you should not use the INVERT switch.
_________________
Google and Forum Search are some of your best tools!!!!
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

PostPosted: Sat Dec 28, 2013 10:11 pm     Reply with quote

thanks for quick replying
but here i spend two days searching websites to fix this but unable to do it.
And here if there is no INVERT the output will be wrong. I tested it before.
dyeatman



Joined: 06 Sep 2003
Posts: 1923
Location: Norman, OK

View user's profile Send private message

PostPosted: Sat Dec 28, 2013 10:32 pm     Reply with quote

sounds like a Proteus problem to me...
_________________
Google and Forum Search are some of your best tools!!!!
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Dec 28, 2013 10:41 pm     Reply with quote

Did you read the post near the top of the forum. We don't want to solve
your Proteus simulator problems. You should google for it.

In your case, you have a problem with the virtual terminal in Proteus
not working as you expected, when you use a max232 and the invert
option. So, google for this:
Quote:
Proteus virtual terminal max232 invert

For any Proteus questions in the future, please google for the answer.
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

PostPosted: Sat Dec 28, 2013 10:51 pm     Reply with quote

to avoid that invert case you mentioned i put the invert in # use rs232..see the result is in images
And I spent 2 days searching on web for answer. so what you guys suggest me to do?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 1:13 am     Reply with quote

Well how many inversions do you have ? The total number of inversions
must be an even number, meaning either 0 or 2.

You have one device that always inverts, which is the Max232.
Then you have the PIC, which can optionally invert.
Then you have the virtual terminal which can also optionally invert.

Since the Max232 always inverts, that means you must have only
one other inversion in the circuit. Either the PIC or the virtual terminal
must be configured to invert, but not both of them.
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 1:30 am     Reply with quote

ya i used only 2 invertions..
one is by max232
other one is by pic
and you see i'm getting the output start typing buffered data=>..(look my image)
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 2:15 am     Reply with quote

I can't fix Proteus problems. My suggestion is to simplify the program
and the circuit to the smallest possible size.

1. Get rid of the Max232 and the DB9 connector.
2. Get rid of the ex_sisr.c code.
3. Just have a simple program with a printf statement with "Hello World".
4. Get rid of all INVERT parameters.

i.e., Strip your test setup down to almost nothing.
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 2:17 am     Reply with quote

KK got your point thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19332

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 2:47 am     Reply with quote

Start at the beginning.

You do _not_ want INVERT.

Key is to understand that 'TTL async serial' (which is what the PIC UART generates), is designed to connect directly to the MAX232, and is the correct way round. The 'INVERT' keyword is designed for people attempting to run without the inversion in the MAX232.

Internally the PC uses the same logic, and has a built in MAX232 (equivalent), to invert the signal before it comes out of the RS232 port. RS232, is an 'inverted' transmission standard (logic '0', is a high level on the RS232 lines), and the MAX232 generates this inversion. By adding 'INVERT', you are ending up inverting the signal three times (once in the INVERT, once in your MAX232, and once in the MAX232 in the 'virtual PC'). This won't work....

So get rid of INVERT.

Using INVERT has a much larger implication as well though. The PIC hardware cannot generate inverted serial. So as soon as you use 'INVERT', you switch to using software RS232. This will stop ex_sisr from working, since it _relies_ on using the hardware.

As PCM programmer says, 'start simple':
Code:

#include<18f2550.h>
#fuses NOWDT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,UART1,ERRORS, parity=N,bits=8)   

void main(void)
{
   char a;
   delay_ms(20); //The capacitors in the MAX232 take a few mSec to charge
   printf("Start typing ...\n.");
   while(1)   
   {
      a=getc();
      putc(a);   
  }   
}


When using the hardware UART, you should _always_ have the ERRORS keyword, unless _you_ explicity handle errors yourself.
Since I'm using the hardware UART, I can just use 'UART1', instead of the pin names.
Note the delay at the start. Proteus does not simulate the need for this correctly, but if you start sending straight away on a 'real' MAX232, the first character may well be corrupted. It takes perhaps 10mSec for the chip to charge it's output capacitors.

This code runs correctly on a PIC18F2550, with a 20MHz crystal, and MAX232.

Best Wishes
maxD



Joined: 16 Dec 2013
Posts: 22

View user's profile Send private message

PostPosted: Sun Dec 29, 2013 3:20 am     Reply with quote

K I got your point
Thank you so much !!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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