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

rs232 fault when receiving response

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



Joined: 10 Aug 2015
Posts: 3

View user's profile Send private message

rs232 fault when receiving response
PostPosted: Mon Aug 10, 2015 6:52 am     Reply with quote

Hi guys I need your help about rs232 communication, I try to communicate 2 pic18f67k22 using rs232 com. and max487 component.
1. I send the send something to slave obtain data that have
2. Slave can understand that is for reading
3. Then slave send response to master
4. Master should get the data but I cant get anything from slave side

All my code is below and can you tell me that where is the fault!
MASTER
Code:


#include <18f67k22.h>
#INCLUDE <stdlib.h>
#use delay(clock=8000000)
#fuses INTRC_IO,NOWDT,PROTECT,NOPUT,NOMCLR
#fuses CCP2C1
#fuses SOSC_DIG

int8 indata_S1=0, indata_S2, veri[8];

int gonder=0,sayac=0;
 //a[6],b[6],c[6],d[6],f[6],g[6];

#pragma use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=S_1, UART1)
#pragma use rs232(baud=9600, xmit=PIN_G1, rcv=PIN_G2, STREAM=S_2, UART2)






#INT_rda      // for slave communication // I cant get the response here
void rda_interupt ()               
   {

           disable_interrupts(int_rda);  //
           
           indata_S1=getc(S_1);
           veri[sayac]=indata_S1;         // store the indata in veri[]
           
           if(indata_S1 == 'e')              // if comming data is end
                  {   
                       
                     if(veri[sayac-1]=='b')   // if coming id is b
                     {
                           if(veri[sayac-2]==10)      // if data = 10
                           
                           {
                                 output_toggle(pin_e0);        // I cant see the change here .
                           
                           }
                     
                     
                     }
                     
                   
                   
             
                  sayac=0;     
                }
               
           sayac=sayac+1;
           indata_S1=0;
           
   

       delay_us(2);
       enable_interrupts(int_rda);
   }
   
   
#INT_rda2
void rda2_interupt ()
   {

         

         
           
          }
         
         
           
   

       delay_us(2);
       enable_interrupts(int_rda2);
   }
 

void veriiste(char x)
{
       
       output_high(pin_c5);
       delay_ms(5);                 
       putc(x,S_1);                  // mode write or read                       
       delay_ms(5);
       putc('b',S_1);                // id which pic do you want to reach
       delay_ms(5);
       putc('e',S_1);                // end bit
       delay_ms(5);
       output_low(pin_c5);
       


}




void main()
{
   setup_psp(PSP_DISABLED); // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
   
   
   
    enable_interrupts(GLOBAL);
    output_low(pin_c5);
    output_low(pin_g3);
    enable_interrupts(int_rda);
    enable_interrupts(int_rda2);
    delay_ms(100);
   
   while(1)
   {
     
       delay_ms(1000);
       veriiste('r');               // send daha as read mode
       delay_ms(1000);
       veriiste('w');              // send daha as write mode
     
       
     
   }





}




SLAVE


Code:

#include <18f67k22.h>
#INCLUDE <stdlib.h>
#use delay(clock=8000000)
#fuses INTRC_IO,NOWDT,PROTECT,NOPUT,NOMCLR
#fuses CCP2C1
#fuses SOSC_DIG


int8 indata,veri[10],sensor[6]={10,20,30,40,50,60};
int gonder=0,sayac=0;

#pragma use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM = S_1)


////////////////////////////////////////
void verigonder()   // I can send the data response here
{
       
       output_high(pin_c5);
       delay_ms(10);
       putc(10,S_1);             // send data
       delay_ms(1);               
       putc('b',S_1);             // send own id             
       delay_ms(1); 
       putc('e',S_1);              // send end data                                                           
       delay_ms(10);
       output_low(pin_c5);
     

}

#INT_rda
void rda_interupt ()           // I can  get the all data regular
   {
         
          disable_interrupts(int_rda);  // haberleşeme kesmesi pasif edildi
          indata=getc(S_1);
          veri[sayac]=indata;
       
    if(indata=='e')      // if end comes
          {     
                 
               
               
                if(veri[sayac-1]=='b')   // if id is matched that pic have
                 {
                 
                       if(veri[sayac-2]=='r')     // if coming  data is read mode
                     {
                            output_high(pin_e0);      // to see the behaviour of data
                         
                            verigonder();               // if coming data says that it is for read, then send response
                            indata=0;                   
                            veri[sayac-1]=0;
                            veri[sayac-2]=0;
                     } 
                      if(veri[sayac-2]=='w')
                     {
                            output_low(pin_e0);                       
                            indata=0;
                            veri[sayac-1]=0;
                            veri[sayac-2]=0;
                     } 
                 }
                 
                 sayac=0;
                 
             
          } 
         
       indata=0;   
       sayac=sayac+1;
       delay_us(2);
       enable_interrupts(int_rda);
       
   }


////////////////////////////////////////////




////////////////////////////////////////

void main()

   setup_psp(PSP_DISABLED); // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
   
   
      setup_adc(ADC_CLOCK_INTERNAL);
      setup_adc_ports(ALL_ANALOG);
   
    enable_interrupts(GLOBAL);
    enable_interrupts(int_rda);
    output_low(pin_c5);   
    delay_ms(100);
   
   while(TRUE)
   {
     
       
       
     
     
     
                                                                                       
   }


}



Ttelmah



Joined: 11 Mar 2010
Posts: 19499

View user's profile Send private message

PostPosted: Mon Aug 10, 2015 7:05 am     Reply with quote

First get rid of the pragma declarations.

These are used in some (most) versions of C to force a statement to execute 'before' other stuff. CCS accepts them, but does not use them, and needs things that must be done first to be placed first in the code.

Then there is a nasty problem with your array access. If you receive 'e', at the start of the message, it'll try to access veri[-1]. Uurgh. You need to think when using anything like this, and ensure that the indexes will always be inside the array.

Then get rid of the disable_interrupt (and enable) in int_rda. The _hardware_ disables all interrupts (in the code as used), when you are inside an interrupt handler.

Then get rid of the delay in the interrupt handler. This will cause interrupts to be disabled in all delays in the main code. Ugh.

Then there is a big problem with INT_RDA2. This potentially will hang the chip. If INT_RDA2 triggers, this will be called, and will never exit. Problem is because you do not read the character the interrupt cannot be cleared.

Then SPI_SS_DISABLED, _enables_ the SPI with slave select disabled. The syntax to disable SPI, is setup_spi(FALSE).

I gave up at this point....
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