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 with 18F242

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



Joined: 14 Dec 2005
Posts: 11
Location: South Africa

View user's profile Send private message ICQ Number

I2C with 18F242
PostPosted: Tue Jan 17, 2006 7:07 am     Reply with quote

HI

Today I tried to get a simple connection of two 18F242 started.
I just wanted to send a value from the master to the slave PIC and back. After that I send the value via RS232 to the PC to see if it works of not.
Unfortunately I do not have any kind of simulation tool where I can check the program. So trial and error.
What kind of setups do I need to edjust?
Aren't there some examble codes available?
Here the simple programs:

SLAVE:
Code:

#device adc=8
#use delay(clock=3276800)
#fuses NOWDT,WDT128,XT, NOPROTECT, NOOSCSEN, BROWNOUT, BORV20, PUT, STVREN, NODEBUG, LVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Slave,Fast,sda=PIN_C4,scl=PIN_C3,address=0xa)

Code:

include "RCcarI2CSlave.h"
#include <stdlib.h>

/*   RS-CAR CONTROL PROGRAMM Motor PIC

*/


int16 data;

#int_SSP
SSP_isr()

{
   Output_high(PIN_B4);
   i2c_start();
   data = i2c_read();
   i2c_write(data);
   i2c_stop();
   Output_low(PIN_B4);
}

void main()
{

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   setup_spi (SPI_SLAVE);

   while(1)
   {
   }
}


MASTER:

Code:

#include <18F242.h>
#device adc=8
#use delay(clock=3276800)
#fuses NOWDT,WDT128,XT, NOPROTECT, NOOSCSEN, BROWNOUT, BORV20, PUT, STVREN, NODEBUG, LVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)



subroutine:
Code:


void ICE()

{
   test = 99;

   i2c_start();
   i2c_write(0xa0);     // Device address
   i2c_write(test);     // Data to device
   i2c_start();         // Restart
   i2c_write(0xa1);     //   to change data direction
   data=i2c_read(0);    // Now read from slave
   i2c_stop();

   printf("%ld", data);
}



Bye
rnielsen



Joined: 23 Sep 2003
Posts: 852
Location: Utah

View user's profile Send private message

PostPosted: Tue Jan 17, 2006 12:08 pm     Reply with quote

There are a few problems here...

First,
Quote:
#use i2c(Slave,Fast,sda=PIN_C4,scl=PIN_C3,address=0xa)

The address is actually 0x0a whereas your Master is addressing 0xa0.

Second,
Slaves do not generate a Start() or Stop(). Only the Master generates these signals.

Third,
Your Slave code is trying to receive And send data every time the ISR is entered. The ISR will be entered when the Slave is addressed by the Master and it will try to send nothing. You need to have some code that will test the condition of the ISR to know what needs to be done.

I, personally, don't like to use the built in functions for I2C communications. Rather, I like to use the registers directly. See the post here, http://www.ccsinfo.com/forum/viewtopic.php?t=24095&highlight=i2c

Ronald
Now that I've typed all of this stuff in, what in the heck was it I said? Wink
PICLeo



Joined: 14 Dec 2005
Posts: 11
Location: South Africa

View user's profile Send private message ICQ Number

PostPosted: Wed Jan 18, 2006 3:06 am     Reply with quote

Hi

I thought the zero or one behind the slave-address indicates if the master wants to write or send. ?!

I tried it like that and the interrupt on the slave PIC occured.
I deleted the start and stop lines within the slave code.
But I am still not able to send data.

Bye
PICLeo



Joined: 14 Dec 2005
Posts: 11
Location: South Africa

View user's profile Send private message ICQ Number

PostPosted: Wed Jan 18, 2006 8:30 am     Reply with quote

Hi

I changed my program now and I do get the right data at the slave PIC (3). I checked it with Hyper Terminal.
I am still busy with sending the data back. Will take a while.

Something curious:
I takes maybe 5-7 seconds till the slave PIC starts working. After that it gets the data correctly. But why this break at the startup?
I didn't use a delay in any way.
I DON'T UNDERSTAND?

Here the code SLAVE:
Code:
BYTE data;
#int_SSP
SSP_isr()

{
   if(i2c_read() == 1)
      {
         data = i2c_read();
      }
   if(i2c_read() == 2)
      {
         i2c_write(0x45);
      }
 
     printf("%X", data);
}


Subrouting MASTER:
Code:
void ICE()

{
   output_high(PIN_B3);

   i2c_start();
   i2c_write(0xa0);     
   i2c_write(1);
   i2c_write(3);
   i2c_start();
   i2c_write(0xa1);
   i2c_write(2);
   data = i2c_read();
   i2c_stop();
   printf("%d,%X", data,data);
   sendready = 0;
   output_low(PIN_B3);
}
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