![]() |
|
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ử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
16f877 có eeprom 256 byte. nếu bạn cần eeprom cao hơn có thế dùng 18f4680 1M.
còn nếu dùng eeprom ngoài có thế dùng 24Cxx nối theo chuẩn I2c. có thể dùng bất cứ chân nào của PIC vẫn được (chỉ cần 2 chân). còn nếu dùng eeprom theo chuẩn // AT28Cxx thì cần đến 19 chân của PIC. dùng cái nào thì code cũng đơn giản cả. nếu bạn dùng CCS cho PIC thì tôi có thể hổ trợ code cho bạn được |
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Sep 2006
Bài gửi: 10
: |
Làm eeprom 24cxx đi anh. em cũng đang muốn làm con này. mà em ko hiểu tại sao em ko ghi được vào rom. em noi 2 chan A0,A1 voi dat. su dung CCs để viết
Code:
#include <16F877A.h> #include <DEFS_16F877A.h> #include <def_877a.h> //#include <pic.h> #device *=16// ADC=10 #fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7) #use i2c(master,sda=PIN_C4, scl=PIN_C3, force_hw,Slow) void write_eeprom(long int address,unsigned char data) { int upper_addr; int lower_addr; upper_addr=(int)(address >> 8); lower_addr=(int)(address & 0x00FF); i2c_start(); i2c_write(0xa0); i2c_write(upper_addr); i2c_write(lower_addr); i2c_write(data); i2c_stop(); delay_ms(11); } //******************************************************** unsigned char read_eeprom(long int address) { unsigned char data; int upper_addr; int lower_addr; upper_addr=(int)(address >> 8); lower_addr=(int)(address & 0x00FF); i2c_start(); i2c_write(0xa0); i2c_write(upper_addr); i2c_write(lower_addr); i2c_start(); i2c_write(0xa1); data=i2c_read(0); i2c_stop(); return(data); } //------------------------ax25--------------------------- main() { //lam gi thi lam } các cao thu xem họ em hai hàm ghi và đọc rom(24c512) có gì sai ko mà em ko đoc được với a.
__________________
Đỉnh của lòng chảo. thay đổi nội dung bởi: namqn, 26-02-2009 lúc 09:11 PM. |
![]() |
![]() |
![]() |
#3 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
24cxx
đoạn chương trình dưới tôi đã dùng và chạy hoàn chỉnh bạn tham khảo nhé. cái này tôi chỉnh lại từ file 2464.c của CCS.
để viết vào 1 byte bạn gọi hàm: write_ext_eeprom(add,data); để đọc ra 1 byte từ 24cxx gọi hàm data = read_ext_eeprom(add) để 24cxx có địa chỉ nhận 0xa0 bạn cần nối chân A0,1,2 xuống GND. lưu ý là ko chạy mô phỏng được nhé chúc vui Code:
#use i2c(master, fast, sda=EEPROM_SDA, scl=EEPROM_SCL) //////////////////////////////////////////////////// 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); } ////////////////// the end ///////////////////////// thay đổi nội dung bởi: namqn, 25-02-2009 lúc 04:23 PM. Lý do: định dạng code |
![]() |
![]() |
![]() |
#4 |
Nhập môn đệ tử
Tham gia ngày: Sep 2006
Bài gửi: 10
: |
vâng cám ơn anh nhiều. em test lai đây
__________________
Đỉnh của lòng chảo. |
![]() |
![]() |
![]() |
#5 |
Nhập môn đệ tử
Tham gia ngày: Sep 2006
Bài gửi: 10
: |
hic hôm nay em ngồi test cả ngày mà ko được. em làm giống như trên mà cũng ko được(em dùng con 24c64 va 24c32). em đọc các giá trị ghi vào trong rom lên mánh tình nhưng ko thấy gì.
Code:
void testrom() { int16 i; unsigned char x; char DIGITS[15] ={"Tran Minh Duc"}; if(RCIF) { x=getch(); portb=x; if(x=='b') { putch('c'); output_low(PIN_B4); output_high(PIN_B5); for(i=0;i<15;i++) { x=read_ext_eeprom(i); putch(x); delay_ms(100); } } if(x=='t') { output_high(PIN_B4); output_low(PIN_B5); for(i=0;i<15;i++) { write_ext_eeprom(i,DIGITS[i]); } putch("a"); } } } main() { while(1) { testrom(); } }
__________________
Đỉnh của lòng chảo. thay đổi nội dung bởi: namqn, 26-02-2009 lúc 06:07 PM. Lý do: định dạng code |
![]() |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Cảm biến hồng ngoại | thaychua | Cảm biến | 17 | 05-09-2011 09:02 AM |
Một số sách nước ngoài hay về điều khiển | minhcuong | Điều khiển | 6 | 16-12-2006 10:48 AM |
tìm ic hồng ngoại | kstn | Tìm mua sản phẩm | 1 | 18-09-2006 04:50 PM |
Thông tin ngoài luồng về PIC | falleaf | Cơ bản về vi điều khiển và PIC | 0 | 24-02-2006 01:48 PM |
Vấn đề tài liệu tiếng Việt hay tiếng nước ngoài? | falleaf | Trao đổi ngoài luồng | 7 | 25-11-2005 06:52 PM |