PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   giúp đỡ I2c (http://www.picvietnam.com/forum/showthread.php?t=4441)

kaka_pato 09-07-2009 05:06 AM

giúp đỡ I2c
 
1 Attachment(s)
em mới bắt đầu học PIC có đoạn code nhưng không biết nó sai chỗ nào,có ai bít chỉ giúp em với: giao tiếp với rom 24c01
tại sao em đọc lại giá trị đã ghi vào rom o vi trí 0x04h mà lại có giá trị la 0xffh và tại sao cùng là hàm write nhưng hàm write trên có ack còn hàm write dưới lại la nack,hình mô phỏng protus em pót ở dưới
#include <16F877A.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,BROWNOUT,NOLVP
#use delay(clock=20M)
#use i2c(master, SLOW,sda=PIN_C4, scl=PIN_C3)
#use rs232(baud=9600, parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=9)
/////////////////////////////////////////////////////////////////


//khai bao cac ham su dung
int read(int address); //Lay du lieu tu ROM
void write(int address,int data); // Ghi du lieu vao ROM
//chuong trinh chinh
void main()

{
int tam;
write(0x04,5);
write(0x07,3);
tam=read(0x04);
}
//cac chuong trinh con
int read(int address)
{
int data;
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return data ;
}

void write(int8 address, int8 data)
{
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_write(data);
i2c_stop();

}

kaka_pato 09-07-2009 01:53 PM

1 Attachment(s)
không ai giúp đỡ em sao,em có sửa lại code một chút nhưng nó vẫn chưa đúng,khi e thêm hàm delay giữa các lần write và read thì có xung ACK chứ không phải NACK như bài trên,có ai biết tại sao không?,và khi em thay đổi thời gian delay thì cái em nhân được từ Rom nó cũng thay đổi theo thời gian delay lun,tại sao vậy??có ai chỉ dùm em với.

#include <16F877A.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,BROWNOUT,NOLVP
#use delay(clock=20M)
#use i2c(master,sda=PIN_C4, scl=PIN_C3)
#use rs232(baud=9600, parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=9)
/////////////////////////////////////////////////////////////////


//khai bao cac ham su dung
int read(int address); //Lay du lieu tu ROM
void write(int address,int data); // Ghi du lieu vao ROM
//chuong trinh chinh
void main()

{
int tam;
trisc=0b00011000;
write(0x05,0x42);
delay_ms(10);
write(0x07,0x15);
delay_ms(10);
tam=read(0x05);
putc(tam+0x30);


}
//cac chuong trinh con
int read(int address)
{
int data;
i2c_start();
i2c_write(0XA0);

i2c_write(address);
i2c_start();
i2c_write(0XA1);
data=i2c_read(0);
i2c_stop();
return data ;
}

void write(int8 address, int8 data)
{
i2c_start();
i2c_write(0XA0);
i2c_write(address);
i2c_write(data);
i2c_stop();

}



em gởi số 0x42 vào dia chỉ 0x05 mà lại nhận được 0x05 từ địa chỉ 0x05,có ai biết chỉ dùm e với


Múi giờ GMT. Hiện tại là 07:25 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam