![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Đệ tử 4 túi
|
Ghi một chuỗi ký tự vào ROM ngoài
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 ![]() Code:
#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; } } |
![]() |
![]() |
![]() |
#2 |
Đệ tử 4 túi
|
HIC HIC , chẳng có ai trả lời, nhưng mà may là tìm ra cách rùi
![]() |
![]() |
![]() |
![]() |
#3 |
Đệ tử 4 túi
Tham gia ngày: Aug 2008
Bài gửi: 89
: |
Code:
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); }
__________________
Quang báo RG/RGB 6/8/12/16 bits màu Phone No: 0905.034.086 Email: lmquyen@gmail.com |
![]() |
![]() |
![]() |
#4 |
Đệ tử 4 túi
|
Cảm ơn bạn , nhưng cái này có khác gì code mình đã test đâu ? :s
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 4 túi
Tham gia ngày: Aug 2008
Bài gửi: 89
: |
delay_us(10); <==> i2c_stop();
__________________
Quang báo RG/RGB 6/8/12/16 bits màu Phone No: 0905.034.086 Email: lmquyen@gmail.com |
![]() |
![]() |
![]() |
#6 |
Đệ tử 4 túi
|
Hì hì, thank, mình phát hiện ra rùi, do chưa tạo tín hiệu Stop
![]() |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|