|
|
View previous topic :: View next topic |
Author |
Message |
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Mon May 24, 2010 1:31 pm |
|
|
Hey guys, I'm trying to communicate 2 pics 16f877, so I found this topic, and do exactly like you said. But it didn't work. When I try to simulate it in Proteus, the SCL line is kept in 0 and the program does nothing.
Here my master code:
Code: |
#include <16F877.H>
#fuses XT, NOWDT, PROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)
//====================================
void main()
{
int8 data;
// Write the letter 'B' to the slave board.
i2c_start();
i2c_write(0xA0);
i2c_write(0x00);
i2c_write('B');
i2c_stop();
// Read from the slave board and display the data.
i2c_start();
i2c_write(0xA0);
i2c_write(0x00);
i2c_start();
i2c_write(0xA1);
data = i2c_read(0);
i2c_stop();
printf("read %c \n\r", data);
while(1);
} |
And the slave code:
Code: | ///////////////////////////////////////////////////////////////////////////
//// EX_SLAVE.C ////
//// ////
//// This program uses the PIC in I2C slave mode to emulate the ////
//// 24LC01 EEPROM. You can write to addresses 00h to 0Fh with it. ////
//// ////
//// This program is to be used in conjunction with the ex_extee.c ////
//// sample. Use the "#include <2402.C>" or "#include <2401.c>". ////
//// Only 16 bytes of address space are implemented, however. ////
//// ////
//// If using a compiler version before 2.639 add "*0x14 = 0x3E;" to ////
//// the begining of main(), and add "NOFORCE_SW" as the last ////
//// parameter in the #use i2c directive. ////
//// ////
//// Jumpers: ////
//// PCM,PCH pin C7 to RS232 RX, pin C6 to RS232 TX ////
//// ////
//// This example will work with the PCM and PCH compilers. The ////
//// following conditional compilation lines are used to include a ////
//// valid device for each compiler. Change the device, clock and ////
//// RS232 pins for your hardware if needed. ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)
BYTE address, buffer[0x10];
#INT_SSP
void ssp_interupt (){
BYTE incoming, state;
state = i2c_isr_state();
if(state <= 0x80) //Master is sending data
{
incoming = i2c_read();
if(state == 1) //First received byte is address
address = incoming;
if(state == 2) //Second received byte is data
buffer[address] = incoming;
}
if(state == 0x80) //Master is requesting data
{
i2c_write(buffer[address]);
}
}
void main ()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while (TRUE) {}
}
|
Please, help.
Cya |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 24, 2010 1:42 pm |
|
|
Put 4.7K pull-up resistors on SCL and SDA. |
|
|
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Mon May 24, 2010 1:51 pm |
|
|
I already do it. =/ |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 24, 2010 2:07 pm |
|
|
Post your Proteus schematic on a free image hosting website,
and then post a link to the image in this thread. |
|
|
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Mon May 24, 2010 2:17 pm |
|
|
PCM_PROGRAMMER thanx for your attention, this is my schematic
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon May 24, 2010 2:40 pm |
|
|
No clock source shown on either chip.
You are specifying 'XT', with a 4MHz delay, which implies an external 4MHz crystal for the master, and HS, and a 20MHz delay, which implies an external 20MHz crystal for the slave. Where are these?.
Best Wishes |
|
|
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Mon May 24, 2010 3:00 pm |
|
|
I Change my schematic to this:
But it's still don't works... =/
X1 -> 4mhz and X2->20mhz |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 24, 2010 3:19 pm |
|
|
It could be that Proteus doesn't correctly simulate a software i2c master.
Try adding FORCE_HW to the master:
Quote: |
#use i2c(Master, sda=PIN_C4, scl=PIN_C3, FORCE_HW)
|
The slave code doesn't need it. The slave always uses hardware i2c.
If that doesn't fix the problem, then it could be caused by your version
of Proteus. |
|
|
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Mon May 24, 2010 3:40 pm |
|
|
I add force_hw to the master, then the problem was change, now the scl don't go to slow, and the program run until the end, but it's not writing on the slave and neither read.
I receive it on therminal:
"Read -1"
On debug "data" assumes 0xff value |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
hansimg
Joined: 24 May 2010 Posts: 8
|
|
Posted: Tue May 25, 2010 9:58 am |
|
|
I install proteus 7.6 and problem solved.
Thank you so much!! |
|
|
iVoVa
Joined: 12 Mar 2011 Posts: 7
|
|
|
|
|
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
|