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 CCS Technical Support

RS485.c - Communication won't work

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







RS485.c - Communication won't work
PostPosted: Wed Nov 22, 2006 3:56 am     Reply with quote

hy,

im a student and actually working on a project where i need rs485,
i've tried to utilize the included rs485.c,
but when monitoring the communication between 2 pic'S i only see a 5V-peak from the sending to the receiving pic.

plz take a look at my source,

thanks in advance,

emil

Code:


#include <18f2580.h>
#use delay(clock=8000000)


#include "lcd_HD44780_4x16.c"
#fuses INTRC_IO, NOWDT, NOMCLR, NOLVP, NOPROTECT
#define RS485_DRIVER
#define RS485_ID  0x20                 // The device's RS485 address or ID
#define RS485_USE_EXT_INT FALSE        // Select between external interrupt
#define RS485_RX_PIN       PIN_C7   // Data receive pin
#define RS485_TX_PIN       PIN_C6   // Data transmit pin
#define RS485_ENABLE_PIN   PIN_B4   // Controls DE pin.  RX low, TX high.
#define RS485_RX_ENABLE    PIN_B5   // Controls RE pin.  Should keep low.

#use rs232(baud=9600, xmit=RS485_TX_PIN, rcv=RS485_RX_PIN, enable=RS485_ENABLE_PIN, bits=9, long_data, errors, stream=RS485)
#use rs232(baud=9600, xmit=RS485_TX_PIN, rcv=RS485_RX_PIN, enable=RS485_ENABLE_PIN, bits=9, long_data, force_sw, multi_master, errors, stream=RS485_CD)

#if getenv("AUART")
    #define RCV_OFF() {setup_uart(FALSE);}
 #else
    #define RCV_OFF() {setup_uart(FALSE);}
#endif

#define RS485_wait_time 20             // Wait time in milliseconds
#bit    rs485_collision = rs232_errors.6
#define RS485_RX_BUFFER_SIZE  40

int rs485_state, rs485_ni, rs485_no;
int rs485_buffer[RS485_RX_BUFFER_SIZE];
int8 temp_ni;

void RCV_ON(void) {
      while(kbhit(RS485)) {getc();} // Clear RX buffer. Clear RDA interrupt flag. Clear overrun error flag.
      #if getenv("AUART")
         setup_uart(UART_ADDRESS);
         setup_uart(TRUE);
      #else
         setup_uart(TRUE);
      #endif
}

void rs485_init() {
   RCV_ON();
   rs485_state=0;
   rs485_ni=0;
   rs485_no=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   output_low(RS485_RX_ENABLE);
}

void rs485_add_to_temp(int8 b) {
   // Store the byte
   rs485_buffer[temp_ni] = b;

   // Make the index cyclic
   if(++temp_ni >= RS485_RX_BUFFER_SIZE)
   {
      temp_ni = 0;
   }
}

#int_rda
void incomming_rs485() {
   int16 b;
   static int8  cs,state=0,len;
   static int16 to,source;

   b=fgetc(RS485);
   cs^=(int8)b;

   switch(state) {
      case 0:  // Get from address
         temp_ni=rs485_ni;
         source=b;
         cs=b;
         rs485_add_to_temp(source);
         break;

      case 1:  // Get to address
         to=b;
         #if (getenv("AUART")&&(RS485_USE_EXT_INT==FALSE))
            setup_uart(UART_DATA);
         #endif
         break;

      case 2:  // Get len
         len=b;
         rs485_add_to_temp(len);
         break;

      case 255:   // Get checksum
         if ((!cs)&&(bit_test(to,8))&&(bit_test(source,8))&&((int8)to==RS485_ID)) {  // If cs==0, then checksum is good
            rs485_ni=temp_ni;
         }

         #if (getenv("AUART")&&(RS485_USE_EXT_INT==FALSE))
            setup_uart(UART_ADDRESS);
         #endif

         state=0;
         return;

      default: // Get data
         rs485_add_to_temp(b);
         --len;
         break;
   }
   if ((state>=3) && (!len)) {
      state=255;
   }
   else {
      ++state;
   }
}

int1 rs485_send_message(int8 to, int8 len, int8* data) {
   int8 try, i, cs;
   int1 ret = FALSE;

   RCV_OFF();

   for(try=0; try<5; ++try) {
      rs485_collision = 0;
      fputc((int16)0x100|rs485_id, RS485_CD);
      fputc((int16)0x100|to, RS485_CD);
      fputc(len, RS485_CD);

      for(i=0, cs=rs485_id^to^len; i<len; ++i) {
         cs ^= *data;
         fputc(*data, RS485_CD);
         ++data;
      }

      fputc(cs, RS485_CD);
      if(!rs485_collision) {
         ret = TRUE;
         break;
      }
      delay_ms(RS485_ID);
   }

   RCV_ON();

   return(ret);
}

void rs485_wait_for_bus(int1 clrwdt)
{
   int16 i;

   RCV_OFF();
   for(i=0; i <rs485_wait_time>0; --n)
      {
         *data_ptr = rs485_buffer[rs485_no];
         if(++rs485_no >= sizeof(rs485_buffer))
         {
            rs485_no = 0;
         }
         ++data_ptr;
      }
      return TRUE;
   }
}

/** H A U P T P R O G R A M M *************************************************/

void main(void)
{
   int8 *z,lol,lol1,lol2,id_send,data_leng,data_send;
   char text[15];


   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);   //stellt die Frequ. auf 8MHz

   set_tris_a(0x00);   OUTPUT_a(0xFF);
   delay_ms(500);
   OUTPUT_a(0x00);
   delay_ms(500);
   OUTPUT_a(0xFF);
   delay_ms(500);
   OUTPUT_a(0x00);
   delay_ms(500);
   OUTPUT_a(0xFF);
   delay_ms(500);
   OUTPUT_a(0x00);
   delay_ms(500);

   lcd_init();            //initialisiert das LCD
   rs485_init();
   lcd_clearlcd();
   printf(lcd_putc,"Warten auf Rx...");
   rs485_get_message(*z,TRUE);
   lcd_gotoxy(1,3);
   id_send=*z;
   data_leng=*(z+8);
   data_send=*(z+16);
   lol=&z;
   lol1=&z+8;
   lol2=&z+16;
   sprintf(text,"%i %i %i %i %i %i",id_send,data_leng,data_send, lol, lol1, lol2);
   printf(lcd_putc,text);


}
emil86



Joined: 14 Nov 2006
Posts: 6
Location: Austria, Vienna

View user's profile Send private message ICQ Number

Forgotten
PostPosted: Wed Nov 22, 2006 3:59 am     Reply with quote

the source of the sender:

Code:
void main(void)
{
   int8 *x,y;
   y=130;
   *x=y;

   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);   //stellt die Frequ. auf 8MHz

   set_tris_a(0x00);   OUTPUT_a(0xFF);
   delay_ms(500);
   delay_ms(500);
   delay_ms(500);
   delay_ms(500);

   lcd_init();            //initialisiert das LCD
   lcd_definechar();      //intitialisiert eigenen Zeichen (pfeil rauf, pfeil runter)

   lcd_gotoxy(11,1);
   printf(lcd_putc,"SEAS");
   delay_ms(300);

   rs485_init();
   delay_ms(300);
   while (rs485_send_message(0x20, 1 ,*x)==FALSE)
   {
   rs485_send_message(20, 1 ,*x);
   }
   lcd_clearlcd();
   printf(lcd_putc,"Paket gesendet");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"0x20,5");


thx
Ttelmah
Guest







PostPosted: Wed Nov 22, 2006 4:18 am     Reply with quote

RS485, _is_ a 5v signalling standard. It uses a pair of differential 5v lines. You have got the hardware drivers for these differential signals?.

Best Wishes
emil86



Joined: 14 Nov 2006
Posts: 6
Location: Austria, Vienna

View user's profile Send private message ICQ Number

PostPosted: Wed Nov 22, 2006 4:26 am     Reply with quote

i have them lying around,...but i think i dont need them now, because im transmitting on one Board (3cm)

i think it also should work if im only using 2 pic's and connecting rx-->tx and tx<--rx.

Do you can find any errors in the source ??

thanks in advance,
emil
Ttelmah
Guest







PostPosted: Wed Nov 22, 2006 5:27 am     Reply with quote

The point is that RS485, is a 5v standard. It is also half duplex. The original code as writen, requires the drivers, to allow the bus turnround, and the presence of multiple receivers. If you only want to talk between two chips, then you don't need the RS485 stuff at all. Just connect RX on one chip to TX on the other, then the same the other way, and send the data.

Best Wishes
BOB_SANTANA



Joined: 16 Oct 2006
Posts: 110
Location: HOVE, EAST SUSSEX

View user's profile Send private message

PostPosted: Wed Nov 22, 2006 6:20 am     Reply with quote

As Ttelmah

You dont need to use the RS485 chips if you just want pic to pic communication except if it is one of the specification for your project.
if can find some info here for Rs485
www.basicstampiii.com/dl/docs/prod/appkit/rs485Communication.pdf

Good luck
_________________
BOB_Santana Smile
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