|
|
View previous topic :: View next topic |
Author |
Message |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 14, 2006 9:31 pm |
|
|
Quote: | while(1)
{
i2c_start();
i2c_write(0xa0)
i2c_write("a")
i2c_stop();
} |
1. You don't have an i2c_write() statement for the address of the
byte in the eeprom. You need to add this statement. See the
program below.
2. You need to put the letter in single quotes, like this: i2c_write('a');
See the program below.
Also:
1. Don't use a letter such as 'a' for the data, because it can be confused
with the address of the chip (0xa0). Use some other letter for the data.
See the program below which shows some corrections for your code.
The following program works OK with EX_SLAVE.C:
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);
} |
|
|
|
WHUNG.JOHN Guest
|
TKS U PROGRAMMER |
Posted: Fri Sep 15, 2006 12:01 pm |
|
|
PCM programmer wrote: | Quote: | while(1)
{
i2c_start();
i2c_write(0xa0)
i2c_write("a")
i2c_stop();
} |
1. You don't have an i2c_write() statement for the address of the
byte in the eeprom. You need to add this statement. See the
program below.
2. You need to put the letter in single quotes, like this: i2c_write('a');
See the program below.
Also:
1. Don't use a letter such as 'a' for the data, because it can be confused
with the address of the chip (0xa0). Use some other letter for the data.
See the program below which shows some corrections for your code.
The following program works OK with EX_SLAVE.C:
Code: |
#include <16F877>
#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);
} |
|
****************************************************
TKS u very much pcm progammer ,i learned i2c communication
agreement with u ,my progamm corrections as follws;
master progam:
#include <16F77.h>
#fuses XT, NOWDT, PROTECT, BROWNOUT, PUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3,SLOW)
//====================================
void main()
{
WHILE(1)
{
i2c_start();
i2c_write(0xA0);
DELAY_MS(100);
i2c_write('5');
DELAY_MS(100);
i2c_write('H');
DELAY_MS(500);
i2c_stop();
DELAY_MS(200);
}
}
slave progamm:
include <16F77.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#include "lcd.c"
#use i2c(SLAVE,address=0XA0,sda=PIN_C4,scl=PIN_C3,slow)
INT8 GG;
void main()
{
int i;
LCD_INIT();
WHILE(1)
{
IF (I2C_POLL()==TRUE)
{
GG=i2c_read();
LCD_GOTOXY(1,1); PRINTF(LCD_PUTC,"\fGG=%C",GG);
}
}
}
the progamm is right ,and lcd panel can display number right,
i think to simplify,do u (pcm progammer) have time teach?
gramercy for pcm progammer . |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Sep 15, 2006 12:27 pm |
|
|
Quote: | The progam is right. I think to simplify. |
It looks very simple right now. You only have two lines of i2c code in
the slave.
I don't really want to teach i2c. I like to help people solve immediate
problems, so their project can move forward. I don't want to do the
whole project for them. |
|
|
domdom
Joined: 06 Sep 2006 Posts: 29
|
|
Posted: Wed Mar 21, 2007 8:19 pm |
|
|
Hi, PCM_programmer,
Does this code work for master 16f877a? I pulled up two SDA and SCL with 4.7K resistor and program the slave chip(16f877a) with EX_SLAVE.c (without any modification)
But i failed to get the communication working. Kindly please give some comment
Code: |
#include <16F877>
#fuses HS, NOWDT, PROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=19200, 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);
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 21, 2007 8:49 pm |
|
|
It should work with Ex_Slave.c. It's basically similar to the master code
that I posted in this link:
http://www.ccsinfo.com/forum/viewtopic.php?t=28097&start=9
Make sure that you:
1. Have SDA on the Slave connected to SDA on the master.
2. Have SCL on the Slave connected to SCL on the master.
3. Have a ground connection between the two boards.
4. Have one pull-up resistor on SDA, and one on SCL.
If it doesn't work, then post your compiler version. |
|
|
domdom
Joined: 06 Sep 2006 Posts: 29
|
|
Posted: Thu Mar 22, 2007 6:18 am |
|
|
Hi PCM programmer,
I program the master.c code in my master PIC , and EX_SLAVE.c in my slave PC.
the output of terminal is like below:
[img]
http://img144.imageshack.us/img144/5611/outputuc3.gif
[/img]
The code seems like not working. May be the baudrate i used?
Can you check again?! |
|
|
domdom
Joined: 06 Sep 2006 Posts: 29
|
|
Posted: Sat Mar 24, 2007 11:43 pm |
|
|
Hi PCM programmer,
Did you see the url? what is my problem for my window terminal?
Or may be the code is not working? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 24, 2007 11:59 pm |
|
|
You have a problem with sending serial data to Hyperterminal.
Even if the i2c code produces bad output, you should still see
the text in this printf statement:
Code: | printf("read %c \n\r", data); |
You should see the word "read" in the Hyperterminal window.
I don't see it.
Try this very simple program, just to test if you can talk to PIC
by typing characters into the HyperTerminal window:
http://www.ccsinfo.com/forum/viewtopic.php?t=29538&start=6
Modify the PIC #include file and #use delay() statement
as required to fit your actual hardware.
You shoul be able to type characters and have the PIC send
them back to HyperTerminal, where they are displayed. |
|
|
funmix
Joined: 27 Mar 2007 Posts: 33
|
|
Posted: Sat Mar 31, 2007 11:06 am |
|
|
Hi PCM programmer,
the example you use for master i2c is 16f877a, i changed the 16877A to 18f4520. It doesn't work.
Is there any errata for this chip? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
|
|
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
|