Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[PIC] Spi commiication use in two PIC18f452

Status
Not open for further replies.

AmmarAkhlaq

Junior Member level 1
Junior Member level 1
Joined
Dec 12, 2013
Messages
17
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
162
I am try to communicate b/w two pic18f452:
I am sending package of data from master. slave should receive it properly. and send back data according to the received one:
here problem is I am getting data for some value like when I call the function:
sent_data(10,20,30);
I received it correctly but when I sent:
sent_data(150,180,180);
I am not receiving it communication is not establishing.
I need to received data correctly all the time.
PLZZZZZ help me out I extreme need plzzzz
plzz tell me what iam doing wrong I am using MicroC for coding

here is my master:

Code:
unsigned char theta1,theta2,theta3,Count2,Count3,datain,intiCom,ready,Thetax=0,Thetay,Thetaz,x,y,z1,reset;
unsigned char Write(char dataout);
void mapInput();
void SysInit();
void sent_data(unsigned char Theta1 ,unsigned char Theta2 , unsigned char Theta3 );
void main(){
      SysInit();
      intiCom=0;
      PORTB=0xFF;
      delay_ms(1000);
      PORTB=0x00;
      intiCom=Write(0x0F); // inititalize the communication:    1
      //Send 0x0F if reviced is F0 the Communication line is stablish
      PORTB = intiCom;
      Delay_ms(500);
      if(intiCom==0xF0)
      {
         while(1)
         {
             sent_data(150,180,180);
         }
      }


}
unsigned char Write(unsigned char dataout)
{
      PORTD = dataout;
      PORTC.B2=0;          // SS select low  slave is selected  port C pin 2
      delay_ms(10);        // wait
      SPI1_Write(dataout); // transmit the dataout
      //while(SSPSTAT.BF);   // wait till end of data transmission
      delay_ms(50);        // wait.
      PORTC.B2=1;
      return  SSPBUF;
}
void SysInit()
{
     TRISA=0xFF; // configure Port A as input
     ADCON1=0x06;// disable ADC and make all the pins of Port A as digital input.
     TRISD=0x00; // configure Port D as output
     PORTD=0x00; // Clear all pin of Port D
     TRISB=0x00; // configure Port B as output
     PORTB=0x00; // Clear all pin of Port B
     TRISC.B2=0; // Output for Slave select
     TRISC.B3=0; // SCK output
     TRISC.B4=1; // SDI input
     TRISC.B5=0; // SDO output
     PORTC.B2=1; // SS select high no slave is select
     //Set SPI1 module to master mode, clock = Fosc/4, data sampled at the middle of interval,
     //clock idle state low and data transmitted at low to high edge:
     SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); // Setup the spi
}

void sent_data(unsigned char Theta1 ,unsigned char Theta2 , unsigned char Theta3 )
{

          ready=Write(0x10);            //2
          Delay_ms(50);
          if(ready==0x70)
          {
              Thetax=Write(Theta1);     //3
             // PORTB=Thetax;
              Delay_ms(50);
          }
          if(Thetax==0x30)
          {
                x=Write(0x05);          //4
                //PORTB=x;
                Delay_ms(50);
          }
          if(x==0x40)
          {
            Thetay=Write(Theta2);       //5
            //PORTB=Thetay;
            Delay_ms(50);
          }
          if(Thetay==0x50)
          {
             y=Write(0x06);             //6
             //PORTB=y;
             Delay_ms(50);
          }
          if(y==0x60)
         {
            Thetaz=Write(Theta3);       //7
            //PORTB=Thetaz;
            Delay_ms(50);
         }
         if(Thetaz==0x80)
         {
                z1=Write(0x08);         //8
                //PORTB=z1;
                Delay_ms(50);
         }
         if((z1==0x90)&&(y==0x60)&&(x==0x40))
         {
             reset= Write(0x09);       //9
             z1=0;
             y=0;
             x=0;
             Thetaz=0;
             Thetay=0;
             Thetax=0;
             ready=0;
             PORTB=Theta3;
              
         }

}

here is salve code:


Code:
unsigned char Received(unsigned short dataout);
unsigned short datain,dataout;
unsigned char intiCom=0,ready=0,Thetax=0,x,Thetay,y,Thetaz,z1,update;
void SysInit();
void InitTimer1();
void Interrupt();
void mydelay_10us(long int a);
unsigned long int total,high1,high2,high3,low,theta1,Required_delay1=0,theta2;
unsigned long int Required_delay2=0,theta3,Required_delay3=0;
void main() {
  //InitTimer1();
  SysInit();
  intiCom=0;
  intiCom=Received(0xF0);                   //1
  // inititalize the communication:
  // Send 0x0F if reviced is F0 the Communication line is stablish

  while(1)
  {
      ready=Received(0x70);                //2  Ready for communication
      //PORTB=ready;
      if(ready==0x10)
      {
          Thetax= Received(0x30);          //3 recive theta 1 is ready
          //PORTB=Thetax;
          delay_ms(30);
          x = Received(0x40);              //4 conform that Theta 1 has been recived
      }
      if(x==0x05)
       {
           Thetay=Received(0x50);          //5 recive theta2 if reception of theta 1 is conformed
           // PORTB=Thetay;
           delay_ms(30);
           y= Received(0x60);              //6  conform that Theta 2 has been recived
       }
      if(y==0x06)
      {
            Thetaz=Received(0x80);         //7  recive theta3 if reception of theta 2 is conformed
            //PORTB=Thetaz;
            delay_ms(30);
            z1 = Received(0x90);           // 8  conform that Theta 3 has been recived
      }
      if((z1==0x08)&&(y==0x06)&&(x==0x05)) // after conformation of all the theta 1 2 3
        {
            update=Received(0xA0);         //9 if update comand is revieced the chage the value of angles.
            delay_ms(30);
            if(update==0x09)
            {
                theta1=(long int)Thetax;
                theta2=(long int)Thetay;
                theta3=(long int)Thetaz;
                update=0;
                z1=0;
                y=0;
                x=0;
                ready=0;
                PORTB=theta3;
            }
       }
  }
 }

unsigned char Received(unsigned short dataout)
{
     while(SSPSTAT.BF);
     datain= SPI1_Read(dataout);
     delay_ms(60);
     //PORTD=dataout;
     //PORTB=datain;
     return datain;
}
void SysInit()
{
  ADCON1=0x06;   // disable ADC and make all the pins of Port A as digital input
  TRISA=0xFF;
  PORTA=0x00;
  TRISB=0x00;
  PORTB=0x00;
  TRISD=0x00;
  PORTD=0x00;
  TRISC.B6=0;
  TRISC.B7=0;
  TRISC.B4=1;    //SDI input
  TRISC.B3=1;    //SCK input from master
  TRISC.B5=0;    //SDO output
  SSPSTAT.SMP=0; //input data sampled at middle
  SSPSTAT.CKE=0; // transition from idle to active
  SPI1_Init_Advanced(_SPI_SLAVE_SS_ENABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
 }
 
Last edited by a moderator:

It will be better if you zip and post mikroC project files and also use syntax tags to post the code.

Code C - [expand]
1
your code [/syntax ] (remove the space before bracket close).

 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top