View previous topic :: View next topic |
Author |
Message |
new2pic
Joined: 02 May 2006 Posts: 16
|
485 communication:gettin started |
Posted: Fri May 05, 2006 6:59 am |
|
|
I am pretty new to the PIC chips and have a project to swap out a 17C756 for an 18f4610. I have tried to match up the Registers as closely as I can, and same thing with the comm protocol. I have found however that my comm only works 90% of the time. I have a function which send a request to another chip, asking it to tell me if one of its inputs is on (there are several chips so i send out the address of the chip i want, the command(tell me if you input is on/off), and the specific input. It then responds back telling me if it is on or not. I found that once in a great while i would get the wrong response back, and later i found a certain combination (specific chip and input) that would give me the wrong response back about 50% of the time. I am wondering if this could be something set up wrong. I have pasted my configuration below.
SYNC = 0; // port asynchronous mode
// BRG16 = 0;
// BRGH = 0;
SPEN = 1; // serial port enable
TXIE = 0; // disable asynch TX interrupt
RCIE = 0; // disable asynch RC interrupt
SPBRG = 3; // 14.745 mhZ desired 57600 baud|FOSC/(64(SPBRG+1))
TXEN = 1; // enable transmit port
CREN = 1; // enable receive port
TX9 = 0;
RX9 = 0;
PORTC = 0x00; // clear portc
TRISC = 0x9D;
Any help or ideas would be greatly appreciated. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Fri May 05, 2006 7:36 am |
|
|
That is not enough information.
Can you post the origonal C code for the 17C756? |
|
|
new2pic
Joined: 02 May 2006 Posts: 16
|
|
Posted: Fri May 05, 2006 8:27 am |
|
|
this is the config for the 17c756, is this what you meant?
SYNC2 = 0; // port 2 asynchronous mode
SPEN2 = 1; // serial port 2 enable
TX2IE = 0; // disable asynch TX interrupt
RC2IE = 0; // disable asynch RC interrupt
SPBRG2 = 3; // 14.745 mhZ desired 57600 baud
TXEN2 = 1; // enable transmit port 2
CREN2 = 1; // enable receive port 2
TX92 = 0;
RX92 = 0;
BSR = 0x05; // select bank 5
ADCON1 = 0x0E; // bank 5 digital I/O
PORTG = 0xFF; // clear portg
DDRG = 0x40; |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Fri May 05, 2006 9:02 am |
|
|
I wanted the WHOLE code.
There could be problems all over the place.
or rather.. Places where, through time, there have been many improvments.
and the forum can describe the best way to handle these problems and suggest improvments. |
|
|
new2pic
Joined: 02 May 2006 Posts: 16
|
|
Posted: Fri May 05, 2006 9:13 am |
|
|
i think this is the just of the 485 com in the 17. There is a timer that if exceeded sets "clear_485_fault" so that the transmission is repeated. "asynch_485_rec_busy" and "asynch_485_timeout_flt" are also part of a time-out scheme.There are different functions that load different value into slave_address, command, data_low, and data_high, but they all end up calling this function
do
{
clear_485_fault = FALSE;
RG5 = TRUE;
DelayIt(2);
Transmit(START_BYTE); DelayIt(20);
Transmit(START_BYTE); DelayIt(20);
Transmit(START_BYTE); DelayIt(20);
Transmit(START_BYTE); DelayIt(20);
Transmit(slave_address); DelayIt(20);
Transmit(command); DelayIt(20);
Transmit(data_high); DelayIt(20);
Transmit(data_low); DelayIt(20);
Transmit(STOP_BYTE); GLINTD = TRUE;
while(!TRMT2);
RG5 = FALSE;
GLINTD = FALSE;
// wait for full receive
serial_resp_counter = 0;
asynch_485_rec_busy = TRUE;
for (i = 0; i < MAX_ASYNCH_BYTES; i++)
asynch_serial_buffer[i] = Receive();
asynch_485_rec_busy = FALSE;
asynch_485_timeout_flt = FALSE;
}while(clear_485_fault);
void Transmit(unsigned char data)
{
BSR = 4;
while(!TRMT2);
TXREG2 = data;
}
unsigned char Receive(void)
{
unsigned char data_buffer;
BSR = 4;
while(!RC2IF)
{
if (clear_485_fault)
break;
}
data_buffer = RCREG2;
return (data_buffer);
}
also I have noticed that I am getting framing errors, but in the manual it talks about adjusting the internal clock, however since i am using an external clock i think that adjusting OSCTUNE would have no affect/ not be applicable, is this correct. I am also getting overrun errors but do not understand where the CKP bit should be set/reset. I think they are saying that it should be set after while(!RC2IF) and reset after data_buffer = RCREG2;
Is this everything? |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Fri May 05, 2006 9:30 am |
|
|
For future reference...when you post code, there is a button to push "code" button before you paste the text. and press it again after the paste.
It will then keep the formating. I don't like the way your sending a byte and then delay 20. I think the normal way is to put the send packet into a circular buffer. Then an interupt routeen read and sends the bytes untill they are all sent. Look at the RS485 example in the example directory. This is a perfect example of how this program can be made MUCH more reliable. |
|
|
new2pic
Joined: 02 May 2006 Posts: 16
|
|
Posted: Fri May 05, 2006 10:33 am |
|
|
How can i get rid of framing errors? |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Fri May 05, 2006 11:54 am |
|
|
If you are using the hardwre USART and IRQ's I don't think there is much to try.
In the protocol there should be a spot that if you get a crc/checksum error you retransmit.
Then a framing error shouldn't be a problem.
But
I have products that talk at 19200 for 4,000 feet and I have only once seen a framing error once.
I use 18 gauge twisted wire, 1pair, 120ohm termination on each end, 1/8 load drivers/recievers.
Is the RS485 terminated correctly?
http://www.bb-elec.com/tech_articles/rs422_485_app_note/table_of_contents.asp
ps:
I had thought about sample_early option of RS232 but this is not for UART.
Quote: |
getc() normally samples data in the middle of a bit time. This option causes the sample to be at the start of a bit time. May not be used with the UART. |
|
|
|
new2pic
Joined: 02 May 2006 Posts: 16
|
|
Posted: Fri May 05, 2006 12:30 pm |
|
|
i dont see anything in the data sheet about CRC or checksum errors? |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Fri May 05, 2006 12:48 pm |
|
|
I am done |
|
|
new2pic
Joined: 02 May 2006 Posts: 16
|
|
Posted: Fri May 05, 2006 12:56 pm |
|
|
what does that mean |
|
|
|