Ðăng Nhập

View Full Version : Ghi một chuỗi ký tự vào ROM ngoài


thientaisodo
24-03-2009, 11:47 AM
Chào các bạn, mình làm giao tiếp I2C giữa 16F877A và 24C64 (sơ đồ mạch và code trong file đính kèm).
Mình đã làm mạch thật, đầy đủ các chân kết nối, sau một hồi loay hoay thì mạch cũng đã chạy, đọc data từ một chuỗi địa chỉ liên tiếp trong ROM ngoài hiển thị lên LCD hay ghi một giá trị vào ROM ngoài ở một địa chỉ thì được. Nhưng sau khi ghi xong, mình tăng địa chỉ lên và ghi tiếp thì chương trình dừng lại, đọc dữ liệu từ 24C64 (qua mạch nạp) thì đúng là có ghi vào địa chỉ đầu tiên, nó không ghi tiếp vào điạ chỉ tiếp theo trong ROM? Kể cả mình đã không chờ ACK, trên LCD báo ghi sang địa chỉ thứ 2 nhưng thực tế thì nó chỉ ghi mỗi một giá trị vào địa chỉ đầu tiên trên ROM.
Bó tay, nhờ các bạn giúp đỡ ? :s

Hic hic, mạng ở cti không cho up files, các bạn nhìn code thì mường tượng ra mạch vậy :((



#include <16F877A.h>
#include <def_877a.h>
//#include <pic.h>
#device *=16 ADC=10
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
#use delay(clock=20000000)
#use i2c(master,sda=PIN_C4,scl=PIN_C3,force_hw,Slow)
#include <lcd_lib_4bit.c>

int16 add;
int8 data,redata,buffer,low,high,count;

void write_ext_eeprom(int16 add, BYTE data)
{
short int status;
i2c_start(); // bao hieu bat dau giao tiep i2c
i2c_write(0xa0); // dia chi thiet bi nhan
i2c_write(add>>8); // gui den dia chi cao cua thiet bi nhan (dia chi cot)
i2c_write(add); // gui den dia chi thap cua thiet bi nhan (dia chi hang)
i2c_write(data); // ghi data vao dia chi tren cua thiet bi nhan
i2c_stop(); // bao hieu ngung ghi
i2c_start(); // bao hieu bat dau giao tiep
status=i2c_write(0xa0); // kiem tra trang thai cua thiet bi nhan
while(status==1) // lap lai cho den khi thiet bi da nhan xong (No Ack)
{
i2c_start();
status=i2c_write(0xa0);
}

delay_us(10);
}

BYTE read_ext_eeprom(int16 add)
{
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write(add>>8);
i2c_write(add);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0); // No Ack
i2c_stop();
return(data);
}

void convert_to_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
}

main()
{
LCD_init(); // Khoi tao LCD
printf(LCD_putchar," Dieu Nhat Tuan ");
lcd_putcmd(0xC0);
printf(lcd_putchar, " thientai_sodo ");
delay_ms(2000);

add=0x00;
count=0x00;
data=99;

while(1)
{

write_ext_eeprom(add,data);
lcd_putcmd(0xC0);
printf(lcd_putchar, "Write Data: ");
LCD_putchar(count);
printf(lcd_putchar, "-");
LCD_putchar(data);
//convert_to_bcd(data);
//LCD_putchar(high);
//LCD_putchar(low);
delay_ms(500);
++add;
++count;

}

}

thientaisodo
24-03-2009, 02:42 PM
HIC HIC , chẳng có ai trả lời, nhưng mà may là tìm ra cách rùi :D, sau khi ghi và trước khi tăng địa chỉ kế tiếp để ghi, mình cho đọc lại dữ liệu tại địa chỉ ROM ngoài vừa ghi xong một lần nữa là ok > amen

cskiller
24-03-2009, 03:07 PM
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write((address>>8)&0x1f);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
i2c_stop();
}

BYTE read_ext_eeprom(long int address) {
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write((address>>8)&0x1f);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}

thientaisodo
24-03-2009, 03:19 PM
Cảm ơn bạn , nhưng cái này có khác gì code mình đã test đâu ? :s

cskiller
25-03-2009, 02:09 PM
delay_us(10); <==> i2c_stop();

thientaisodo
26-03-2009, 05:08 PM
Hì hì, thank, mình phát hiện ra rùi, do chưa tạo tín hiệu Stop :D