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;
}
}
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;
}
}