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

i2c communication doesn't work...

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



Joined: 15 Dec 2010
Posts: 2

View user's profile Send private message

i2c communication doesn't work...
PostPosted: Wed Dec 15, 2010 2:41 am     Reply with quote

Thanks to this forum i have master and slave codes. But i cannot communicate the master with slave. I put some LEDs to test the circuit and i guess the interrupt in the slave is not triggered.

My master is 18F452, and slave is 16F877A. I have two 4,7K pull-up resistors for SCL and SDA lines. Vdd is 5V. My compiler version is 4.110.

Master code:
Code:
#include <18f452.H>
#device *=16
#fuses HS, NOWDT, NOBROWNOUT, NOPROTECT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)

   
#define SLAVE1_WRT_ADDR   0x12
#define SLAVE1_READ_ADDR  0x13

#define BUF_SIZE 8

//====================================
void main()
{

   int16 i;
   int16 data[BUF_SIZE];
   data[0]=0;
   while(1)
   {
      output_high(PIN_D0);  //works
      if(data[0]!=0x12) output_high(PIN_D1); //works
      else output_low(PIN_D1); //doesn't work
      delay_ms(1000);
      i2c_start();
      i2c_write(SLAVE1_READ_ADDR);

      for(i = 0; i < 7; i++)
      {
         data[i] = i2c_read(); 
         delay_ms(50);
      }
   
      delay_ms(500);
      data[7] = i2c_read(0);
      i2c_stop();
      output_low(PIN_D0); //doesn't work
     
   }
 
}


Slave code:
Code:
#include <16F877A.h>
#device *=16
#fuses HS, NOWDT, NOBROWNOUT, NOPROTECT, PUT, NOLVP
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x12)

#INT_SSP
void ssp_interrupt()
{
   int8 incoming, state;

   state = i2c_isr_state();

   output_high(PIN_D0);  //doesn't work

   if(state < 0x80)   
   {
      incoming = i2c_read(); 
   }

   if((state >= 0x80)) 
   {
      i2c_write(0x12);
   }

}

//======================================
void main ()
{
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   
   while(1){
      delay_ms(300);           //works
      output_high(PIN_D1);  //works
      delay_ms(300);          //works
      output_low(PIN_D1);  //works
   }
}


At the first try the SDA line goes low and never comes high (i see it from the LEDs). I searched the forum but it didn't helped much.

Can anyone tell me where i am mistaking? May i be mistaking with the "#fuses..." part?
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Wed Dec 15, 2010 3:31 am     Reply with quote

Even if things were working perfectly, you would never see the output_low(PIN_D0).
Think about it, the computer is executing 5MIPS. The pin is sent low, then the code jumps back to the start of the loop, and the pin is driven high. Time between, about 4 instruction times (two times for a jump, and a couple to update the TRIS). So under 1uSec. This will be completely invisible.....

Now, do not understand what you mean by seeing SDA go high with the LED's?. Are you saying that you have put an LED on the SDA line?. If so, this will almost certainly stop it working. The pull up is only 4.7K, and the PIC pin needs to go up to 4v, to see a logic 1 (assuming you are running on 5v). If it doesn't, the code cannot work. The interrupt will never trigger.....

Best Wishes
Mortal



Joined: 15 Dec 2010
Posts: 2

View user's profile Send private message

PostPosted: Wed Dec 15, 2010 4:47 am     Reply with quote

Thank you Ttelmah...

I didn't think the LEDs on the SDA and SCL lines can cause problems. But they did. When i remove the LEDs the communication works perfectly.

Thank you...
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Wed Dec 15, 2010 6:11 am     Reply with quote

Worth just thinking about it. The 'high' level on a Schmitt input, is 0.8*Vcc (4v with a 5v supply). With 4K7R pull-ups, The I2C bus can source a maximum of 0.212mA, and take the line to this level. Any more, and the system won't work....

You can put LED's on the lines, by going the 'other way', and monitoring when the line is pulled _down_. In this direction, the drivers can typically deliver several mA, but really something involving less current (scope, logic analyser etc.,), and with faster responses (remember the pulses on the I2C but will only be 10uSec wide, even running at 100KHz), is the way to monitor the bus.

Best Wishes
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