PDA

View Full Version : ghi và đọc eeprom?


sandro_bk
12-09-2007, 01:23 AM
tui có bảng giá trị sin,muốn ghi vào eeprom tui dùng lệnh sau
#rom 0x2100={1,2,3,4,5,6,7,8}
khi bắt đầu chương trình pic có tốn thời gian để ghi giá trị này vào eeprom hay ko?theo tui thấy là có
sau đó đọc ra dùng lệnh
value = read_eeprom (address)
address từ 0 -255 có đúng ko?
tui viết bằng CCS,ai biết chỉ dùng

nhh
13-09-2007, 11:14 AM
tui có bảng giá trị sin,muốn ghi vào eeprom tui dùng lệnh sau
#rom 0x2100={1,2,3,4,5,6,7,8}
khi bắt đầu chương trình pic có tốn thời gian để ghi giá trị này vào eeprom hay ko?theo tui thấy là có
sau đó đọc ra dùng lệnh
value = read_eeprom (address)
address từ 0 -255 có đúng ko?
tui viết bằng CCS,ai biết chỉ dùng

Với CCS C,

+ Để ghi vào internal eeprom:
write_eeprom(address,value);

+ Để đọc ra từ internal eeprom:
read_eeprom(address);

Các thông số, ví dụ như address thì phải tùy thuộc vào từng chip mà có địa chỉ từ đâu đến đâu, cả giá trị ghi vào nữa. Về thời gian tiêu tốn để gọi mấy hàm này, CCS C help đều nói rất rõ.

Còn #rom 0x..., quả thật chưa dùng, bạn đọc help thử xem.

sandro_bk
13-09-2007, 01:04 PM
cám ơn bạn đã trả lời,nhưng có điều tui ghi đến 256 giá trị nếu dùng lệnh ghi
write_eeprom(address,value); thì phải làm đến 256 lệnh hơi bị oải,với lại mỗi lệnh xử lý hết vài ms thì 1 đống đó ít nhất cũng mất vài giây,với lại value tui ghi vào lớn hơn 255 được ko?tui dùng 18f4331

thaithienanh
13-09-2007, 07:38 PM
cám ơn bạn đã trả lời,nhưng có điều tui ghi đến 256 giá trị nếu dùng lệnh ghi
write_eeprom(address,value); thì phải làm đến 256 lệnh hơi bị oải,với lại mỗi lệnh xử lý hết vài ms thì 1 đống đó ít nhất cũng mất vài giây,với lại value tui ghi vào lớn hơn 255 được ko?tui dùng 18f4331

Cách dùng "#rom" như bạn nói thì hoàn toàn đuợc nhưng nó chỉ đuợc áp dụng khi bạn dùng Rom cho mục đích dạng như là một "bảng tra" chẳng hạn bởi vì thực chất nó rất là bất tiện (không linh hoạt) bởi lẽ chỉ cho phép ta đặt vào đó những phần tử là hằng số mà thui, nếu mục đích chỉ là muốn ghi vào Rom những giá trị cố định biết trước thì dùng nó là phương cách tối ưu :) , còn đối với lệnh "write_eeprom(address,value);" thì bạn có thể chèn vào vị trí "value" là một biến động và tiếp theo quan trọng nhất là bạn phải học cách điều khiển giá trị của biến này cho hiệu quả và chính xác phù hợp với đề tài của mình ví dụ như sử dụng những vòng lặp, mệnh đề điều kiện,.... :). Nếu bạn muốn ghi tăng lên mãi thì ô nhớ Rom sẽ nhảy đến vị trí tận cùng của nó luôn, hoặc có thể "nhảy cóc" nếu thay đổi địa chỉ đi :D

Thân.

sandro_bk
13-09-2007, 07:58 PM
tui muốn ghi một bảng giá trị cố định,tui dùng lệnh #rom.... nhưng có vẻ như không đọc giá trị trong eeprom được,vì tui thử đọc ra led thì ko có gì cả,với lại giá trị nạp vào có thể là số 16 bit phải ko?

namqn
14-09-2007, 03:25 AM
Đa số các phần mềm nạp PIC đều cho phép nạp trước nội dung nào đó vào EEPROM, do đó bảng hằng số của bạn có thể được nạp vào EEPROM trong quá trình bạn nạp chương trình cho PIC. Sau đó trong chương trình bạn chỉ việc đọc các hằng số đó, và việc đọc diễn ra rất nhanh.

Ngay cả khi ở đầu chương trình mà bạn phải ghi các hằng số này thì nó cũng không ảnh hưởng gì đến chương trình, vì thao tác này chỉ diễn ra có một lần.

Theo tài liệu của CCS C thì họ có một ví dụ về cách dùng built-in EEPROM của PIC (tên tập tin là ex_intee.c). Tôi không dùng CCS C, chỉ đọc tài liệu hướng dẫn của nó và nhận thấy có thông tin như vậy (nội dung của tập tin ex_intee.c được liệt kê ở phần phụ lục của tài liệu hướng dẫn C Compiler Reference Manual của CCS C).

Nếu bạn muốn cập nhật bảng hằng số trong EEPROM đó thì bạn phải ghi vào từng ô nhớ bằng hàm write_eeprom() thôi.

Thân,

sandro_bk
19-09-2007, 02:07 AM
cám ơn bạn đã quan tâm,mình có một bảng sin có 256 giá trị,giá trị là số 16 bit, hình như eeprom chỉ cho phép ghi data 8 bit thì phải,ko biết có cách nào ko?

namqn
19-09-2007, 02:42 AM
cám ơn bạn đã quan tâm,mình có một bảng sin có 256 giá trị,giá trị là số 16 bit, hình như eeprom chỉ cho phép ghi data 8 bit thì phải,ko biết có cách nào ko?
PIC10 đến PIC18 là các chip vi điều khiển 8-bit, có độ rộng kênh dữ liệu là 8 bit. Do đó, nếu dùng EEPROM hay RAM của các chip này thì kiểu dữ liệu intrinsic có độ dài 8-bit. Tuy nhiên, nếu lưu vào flash của các PIC18 thì vẫn có thể lưu các giá trị 16-bit, vấn đề ở chỗ các chip này vẫn chỉ xử lý dữ liệu cơ sở là 8-bit.

PIC24 và dsPIC30/dsPIC33 là các chip 16-bit, có độ rộng kênh dữ liệu là 16-bit. Như vậy, EEPROM của PIC24/dsPIC30 hay RAM của PIC24/dsPIC30/dsPIC33 sẽ có độ dài 16-bit. Các chip này có flash gồm các word 24-bit.

Bạn cần xác định xem có cần độ phân giải 16-bit cho một bảng có 256 giá trị hay không.

Thân,

minhminh17
12-02-2009, 12:41 PM
Cách dùng "#rom" như bạn nói thì hoàn toàn đuợc nhưng nó chỉ đuợc áp dụng khi bạn dùng Rom cho mục đích dạng như là một "bảng tra" chẳng hạn bởi vì thực chất nó rất là bất tiện (không linh hoạt) bởi lẽ chỉ cho phép ta đặt vào đó những phần tử là hằng số mà thui, nếu mục đích chỉ là muốn ghi vào Rom những giá trị cố định biết trước thì dùng nó là phương cách tối ưu :) , còn đối với lệnh "write_eeprom(address,value);" thì bạn có thể chèn vào vị trí "value" là một biến động và tiếp theo quan trọng nhất là bạn phải học cách điều khiển giá trị của biến này cho hiệu quả và chính xác phù hợp với đề tài của mình ví dụ như sử dụng những vòng lặp, mệnh đề điều kiện,.... :). Nếu bạn muốn ghi tăng lên mãi thì ô nhớ Rom sẽ nhảy đến vị trí tận cùng của nó luôn, hoặc có thể "nhảy cóc" nếu thay đổi địa chỉ đi :D

Thân.

mình vừa viết xong chương trình đọc giá trị biến trở bằng bộ adc pic bây giờ mình rất mong bạn giúp mình ghi vào eeprom nội pic bằng nút nhấn được không mình cần 1 nút start và 1 nút stop để ghi nội dung và ngừng ghi nội dung mong bạn giúp đỡ gấp mình viết bằnng ccs c

xuanhiendk2
13-02-2009, 01:48 PM
Các bạn cho mình hỏi ví dụ mình muốn lưu một chuỗi "XINCHAO" vào eeprom sau đó lại đọc từ eeprom ra thì lúc này chuỗi XINCHAO sẽ được mã hóa như thế nào?

tungtot_vl
13-02-2009, 02:18 PM
Các bạn cho mình hỏi ví dụ mình muốn lưu một chuỗi "XINCHAO" vào eeprom sau đó lại đọc từ eeprom ra thì lúc này chuỗi XINCHAO sẽ được mã hóa như thế nào?

cái này còn phải xem cách mã hóa của bạn như thế nào. chữ xinchao mỗi chữ là 1 byte hay mỗi chữ là nhiều byte
có 2 cách lưu: trực tiếp và gián tiếp
lưu trực tiếp tức là lưu toàn bộ những gì bạn cần lưu vào eeprom sau đó đọc nó ra
gián tiếp tức là bạn dùng một biến trung gian để lưu nó vào eeprom sau đó khi cần lấy biế trung gian này ra rồi từ đó tìm lại cái bạn cần

nguyennam8888
15-02-2009, 11:38 AM
cái này còn phải xem cách mã hóa của bạn như thế nào. chữ xinchao mỗi chữ là 1 byte hay mỗi chữ là nhiều byte
có 2 cách lưu: trực tiếp và gián tiếp
lưu trực tiếp tức là lưu toàn bộ những gì bạn cần lưu vào eeprom sau đó đọc nó ra
gián tiếp tức là bạn dùng một biến trung gian để lưu nó vào eeprom sau đó khi cần lấy biế trung gian này ra rồi từ đó tìm lại cái bạn cần

vậy khi nào nên lưu trực tiếp là tốt nhất , khi nào gian tiếp là tốt, rồi có phải lưu trực tiếp khi lấy data ra sẽ nhanh hơn gián tiếp, mong chỉ giáo

tungtot_vl
16-02-2009, 11:33 AM
lưu trực tiếp khi data bạn lưu vào eeprom phải nhỏ hơn dung lượng của eeprom khi đó code sẽ đơn giản hơn nhiều
lưu gián tiếp thì cần khi số byte của bạn cần lưu quá lớn, lớn hơn nhiều lần so với dung lượng eeprom của vdk bạn đang dùng. cái này code cần có thêm bộ giải mã để so sánh và lấy data ra. dương nhiên là data đã có sẳn và được lưu trong rom

xuanhiendk2
16-02-2009, 12:24 PM
cái này còn phải xem cách mã hóa của bạn như thế nào. chữ xinchao mỗi chữ là 1 byte hay mỗi chữ là nhiều byte
có 2 cách lưu: trực tiếp và gián tiếp
lưu trực tiếp tức là lưu toàn bộ những gì bạn cần lưu vào eeprom sau đó đọc nó ra
gián tiếp tức là bạn dùng một biến trung gian để lưu nó vào eeprom sau đó khi cần lấy biế trung gian này ra rồi từ đó tìm lại cái bạn cần
Ví dụ như em khai báo:
Char Const a[7] = "XINCHAO" thì chúng sẽ là các ký tự mã ASCII phải ko anh?

the_duyet
04-06-2009, 02:49 AM
Bác nào có ví dụ về ghi và đọc eeprom cho giá trị 16 bit thì cho a e tham khảo với, chứ nói thế này ứng dụng khó quá. Giả sử :

int16 a;
int8 b,c;
void ghi_eeprom()
{
b=a/255;
c=a%255;
write_eeprom(1,c);
write_eeprom(2,b);
}
void doc_eeprom()
{
b=read_eeprom(2);
c=read_eeprom(1);
a=b*255+c;
}
Thì nó chạy thế nào,mình đã chạy thử nhưng ko thực hiện được phép nhân bên trên.hix

cskiller
04-06-2009, 11:21 AM
Bác nào có ví dụ về ghi và đọc eeprom cho giá trị 16 bit thì cho a e tham khảo với, chứ nói thế này ứng dụng khó quá....

Prototype các hàm đọc ghi EEPROM 16/32 bits:

void write_eeprom_16(int16 address,int16 value); //Ghi so 16-bits
int16 read_eeprom_16(int16 address); //Doc so 16-bits
void write_eeprom_32(int16 address,int32 value); //Ghi so 32-bits
int32 read_eeprom_32(int16 address); //Doc so 32-bits


Hiện thực của các Prototype:

void write_eeprom_16(int16 address,int16 value)
{
int i;
for(i=0;i<sizeof(value);i++,address++){
write_eeprom(address,*((char *)(&value)+i));
}
}

int16 read_eeprom_16(int16 address)
{
int16 ret;
int i;
for(i=0;i<sizeof(int16);i++,address++){
*((char *)(&ret)+i)=read_eeprom(address);
}
return ret;
}

void write_eeprom_32(int16 address,int32 value)
{
int i;
for(i=0;i<sizeof(value);i++,address++){
write_eeprom(address,*((char *)(&value)+i));
}
}

int32 read_eeprom_32(int16 address)
{
int32 ret;
int i;
for(i=0;i<sizeof(int32);i++,address++){
*((char *)(&ret)+i)=read_eeprom(address);
}
return ret;
}

vinasheva
12-07-2010, 10:02 PM
Cho mình hỏi 2 cách sau có giống nhau k?
1. #rom 0x2100={1}
2. write_eerom(0x000,0x01)
Mình thử dùng cách thứ 2 và dùng read_eeprom thì trả giá trị đúng. Còn cách đầu tiên thì k dc.