PDA

View Full Version : Dạng dữ liệu lưu vào eeprom!


lequocbao
01-12-2008, 12:52 PM
Pic có bộ nhớ eeprom 8k (0-255).vậy để lưu dữ liệu dạng số có từ 2 chữ số trở lên thì phải làm như thế nào mọi người ơi?

lệnh lưu:write_eeprom(addr,value);
lệnh đọc:read_eeprom(addr);
//vậy thì cái value mình có phải định dạng như thế nào không?

vd:lưu số 100 vào ô nhớ không thì viết như vậy đúng không:
x=100;
write_eeprom(0,x);// x phải là biến như thế nào mọi người?

ai biết chỉ giúp mình với!

namqn
01-12-2008, 04:45 PM
Pic có bộ nhớ eeprom 8k (0-255).vậy để lưu dữ liệu dạng số có từ 2 chữ số trở lên thì phải làm như thế nào mọi người ơi?

lệnh lưu:write_eeprom(addr,value);
lệnh đọc:read_eeprom(addr);
//vậy thì cái value mình có phải định dạng như thế nào không?

vd:lưu số 100 vào ô nhớ không thì viết như vậy đúng không:
x=100;
write_eeprom(0,x);// x phải là biến như thế nào mọi người?

ai biết chỉ giúp mình với!
Tất cả dữ liệu lưu trong PIC là dạng số. Dạng 2 chữ số mà bạn nói đến là dạng nào (dùng cơ số mấy)?

PIC 8-bit có dữ liệu dạng byte (8-bit), còn PIC24 thì có dữ liệu 16-bit. Với các PIC 8-bit, mỗi ô nhớ trong EEPROM dài 8-bit, trong CCS C thì có thể dùng kiểu char hay unsigned int8 để khai báo biến.

Thân,

lequocbao
01-12-2008, 05:42 PM
Là dạng cơ số 10 anh ah!
mỗi ô nhớ dài 8 bit, vậy là mình chỉ lưu được từ 00 đến 99 thôi phải không anh Namqn?

namqn
01-12-2008, 05:49 PM
Là dạng cơ số 10 anh ah!
1 byte có thể mã hóa giá trị từ 0 đến 255 thập phân (cơ số 10).
2 byte có thể mã hóa giá trị từ 0 đến 65535 thập phân.
4 byte có thể mã hóa giá trị từ 0 đến 4294967295 thập phân.

Nếu lưu lại để tính toán thì nên lưu dạng nhị phân, nếu lưu lại để hiển thị thì nên chuyển sang dạng chuỗi ký tự. Kiểu nào cũng đều có thể lưu vào EEPROM, vì chúng đều chỉ là một chuỗi gồm một hay nhiều byte.

Thân,

lequocbao
01-12-2008, 06:21 PM
Đúng cái em cần rồi đây!
Vậy anh Namqn ơi nếu mình lưu con số >=256D vào eeromp thì sao anh (em đang dùng pic8).Em đoán như vậy là bị tràn phải không anh?(khi bị tràn thì ô nhớ đó sẽ chứa dữ liệu gì vậy anh?)
Tại vì write_eeprom(addr,value); thì addr chỉ là 01 ô nhớ (dài 8 bit) không thể chứa được con số >=256D.
Vậy với pic8 thì mình có cách nào để lưu số >=256D không anh?

namqn
01-12-2008, 06:32 PM
Đúng cái em cần rồi đây!
Vậy anh Namqn ơi nếu mình lưu con số >=256D vào eeromp thì sao anh (em đang dùng pic8).Em đoán như vậy là bị tràn phải không anh?(khi bị tràn thì ô nhớ đó sẽ chứa dữ liệu gì vậy anh?)
Tại vì write_eeprom(addr,value); thì addr chỉ là 01 ô nhớ (dài 8 bit) không thể chứa được con số >=256D.
Vậy với pic8 thì mình có cách nào để lưu số >=256D không anh?
Dựa vào một luồng khác tôi biết bạn đang dùng CCS C. Trình dịch này cung cấp 2 hàm itoa() và atoi() để chuyển đổi giữa dạng số nguyên và chuỗi ký tự thể hiện giá trị số nguyên đó. Bạn đọc tài liệu hướng dẫn của CCS C về cách dùng các hàm này.

Để lưu số nguyên 32-bit (4 byte) vào EEPROM, bạn có thể dùng hàm itoa() để chuyển nó thành một chuỗi ký tự, sau đó bạn có thể lưu từng ký tự này vào EEPROM. Để lấy lại giá trị số nguyên từ EEPROM, bạn có thể dùng hàm itoa(). Nếu chỉ cần hiển thị số nguyên đó thì có thể dùng thẳng chuỗi trong EEPROM.

Thân,

LTD_LEO
01-12-2008, 11:44 PM
Đúng cái em cần rồi đây!
Vậy anh Namqn ơi nếu mình lưu con số >=256D vào eeromp thì sao anh (em đang dùng pic8).Em đoán như vậy là bị tràn phải không anh?(khi bị tràn thì ô nhớ đó sẽ chứa dữ liệu gì vậy anh?)
Tại vì write_eeprom(addr,value); thì addr chỉ là 01 ô nhớ (dài 8 bit) không thể chứa được con số >=256D.
Vậy với pic8 thì mình có cách nào để lưu số >=256D không anh?


Với số 256D khi đổi ra nhị phân : 100000000 ( 9bit); vậy nghĩ là tràn ô nhớ eeprom( chỉ có 8 bit);
vậy để lưu được những số lớn hơn 8 bit thì bạn nên tách số mà bạn muốn lưu thành những số 8 bit ... rồi lưu từng số 8 bit vào eeproom lưu vào eeprom ..rồi muốn lấy lại số đó thì chỉ cần đọc giá trỉ 2 byte đó rồi ghép chúng lại .
pic 16( điển hình là 16f887 có 256byte eeprom ) vậy bạn có thể lưu được 256 byte rồi ..
Trong CCS thì nó cung cấp cho ban các lệnh tạo số 8 bit , 16 bit , 32 bit .
(make8(var,offset))..v...v.. cái này bạn vào trong help của ccs xem đi ...
Còn nếu bạn muốn nhanh gọn thì chỉ cần dịch trái , dich phải để tách số 8 bit thôi , sau đó and nó lại là ok rồi..

lequocbao
02-12-2008, 05:12 PM
Ngoài cách kiểm tra dữ liệu sẽ nạp vào 01 ô nhớ (nếu >=256) thì cho tách dữ liệu.
thì còn có cách nào khác biết 1 ô nhớ bị tràn không bạn(ví dụ như bật một cờ báo nào đó chẳng hạn- mình dùng ccs - c nha!)?để mình có thể kiểm tra nếu tràn thì tự động cho tách dữ liệu.

namqn
02-12-2008, 08:36 PM
Ngoài cách kiểm tra dữ liệu sẽ nạp vào 01 ô nhớ (nếu >=256) thì cho tách dữ liệu.
thì còn có cách nào khác biết 1 ô nhớ bị tràn không bạn(ví dụ như bật một cờ báo nào đó chẳng hạn- mình dùng ccs - c nha!)?để mình có thể kiểm tra nếu tràn thì tự động cho tách dữ liệu.
Bạn đọc lại post #4 của tôi. Nếu con số mà bạn muốn lưu trữ vượt quá khả năng biểu diễn của một kiểu dữ liệu thì bạn dùng kiểu dữ liệu có nhiều byte hơn.

Lấy ví dụ, giả sử chúng ta dùng một biến kiểu unsigned int32 (lưu trữ trong 4 byte) để lưu giá trị của một đại lượng nào đó.

- Nếu giá trị của đại lượng đó >= 16777216, thì chắc chắn byte cao nhất của biến sẽ khác 0x00,
- Nếu giá trị của đại lượng đó nằm giữa 65536 và 16777216 (65536 <= giá trị < 16777216) thì chắc chắn byte cao thứ nhì của biến sẽ khác 0x00, byte cao nhất sẽ bằng 0x00,
- Nếu giá trị của đại lượng đó nằm giữa 256 và 65536 (256 <= giá trị < 65536) thì chắc chắn byte thấp thứ nhì của biến sẽ khác 0x00, byte cao nhất và cao thứ nhì sẽ bằng 0x00,
- Nếu giá trị của đại lượng đó <= 255 thì chắc chắn byte thấp nhất của biến sẽ khác 0x00, các byte cao hơn sẽ bằng 0x00.

Dữ liệu đã nằm sẵn ở các byte của biến, bạn có thể dùng hàm make8() của CCS C để lấy chúng ra và ghi vào EEPROM bất kỳ lúc nào.

Khả năng tràn số chỉ xảy ra khi bạn thực hiện phép toán số học trên biến, và PIC có cờ C trong thanh ghi STATUS cho biết phép toán số học gần nhất có tạo ra việc nhớ/mượn.

Khi đã xảy ra tràn số thì bạn không thể so sánh để phát hiện đâu. Ví dụ, bạn dùng một byte để lưu giá trị. Giả sử hiện thời giá trị là 200. Sau khi bạn cộng nó với 100, về lý thuyết thì bạn có kết quả là 300, nhưng vì 1 byte không thể biểu diễn được 300, nên bạn chỉ nhận được giá trị 0x2C (44 thập phân) trong byte đó, và bit thứ 9 đã được chuyển vào cờ C trong thanh ghi STATUS. Lúc này, xuất hiện việc tràn số do kết quả của phép cộng. Byte nhớ của bạn sẽ không bao giờ chứa được giá trị >= 256, do đó phép so sánh >= 256 của bạn sẽ luôn luôn cho kết quả false.

Nếu bạn dùng biến có độ dài 2 byte để lưu giá trị, thì với phép cộng trên, byte thấp sẽ là 0x2C, còn byte cao sẽ là 0x01, và không xảy ra sự tràn số. Các dữ liệu đã nằm sẵn ở các byte tương ứng, không cần phải tách dữ liệu bằng cách so sánh giá trị xem có >= 256 hay không.

Thân,