PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   hỏi về kinh nghiệm ghi EEPROM 24C256 !!! (http://www.picvietnam.com/forum/showthread.php?t=5458)

rikimaru87 04-12-2009 02:33 PM

hỏi về kinh nghiệm ghi EEPROM 24C256 !!!
 
mình đang bị đau đầu vì chuyện ghi dữ liệu vào EPPROM. mong các bạn giúp:

+dữ liệu là nhiệt độ của cái lò sấy ( ghi từng giây )
+mạch của mình sử dụng IC 24c256. truyền bằng I2C.
+sử dụng tiny bootloader cho PIC 16f877A

mỗi lần ghi dữ liệu vào eeprom xong làm sao để lưu dữ liệu đó . và khi khởi động lên thì ghi tiếp vào vùng nhớ tiếp theo . mỗi lần khởi động mạch thì giá trị của biến địa chỉ address lại quay về 0 .

mình muốn mỗi lần sấy lò xong . ghi dữ liệu xong. nó lưu vô epprom . khi khởi động lại . sấy lò tiếp . thì nó ghi vào vùng nhớ tiếp theo ( hiện tại khởi động xong nó ghi lại vùng nhớ cũ vì các biến quay lại giá trị ban đầu )

thật sự mong các bạn giúp đỡ mình .

phamminhtuan 04-12-2009 03:02 PM

Trích:

Nguyên văn bởi rikimaru87 (Post 31955)
mình đang bị đau đầu vì chuyện ghi dữ liệu vào EPPROM. mong các bạn giúp:

+dữ liệu là nhiệt độ của cái lò sấy ( ghi từng giây )
+mạch của mình sử dụng IC 24c256. truyền bằng I2C.
+sử dụng tiny bootloader cho PIC 16f877A

mỗi lần ghi dữ liệu vào eeprom xong làm sao để lưu dữ liệu đó . và khi khởi động lên thì ghi tiếp vào vùng nhớ tiếp theo . mỗi lần khởi động mạch thì giá trị của biến địa chỉ address lại quay về 0 .

mình muốn mỗi lần sấy lò xong . ghi dữ liệu xong. nó lưu vô epprom . khi khởi động lại . sấy lò tiếp . thì nó ghi vào vùng nhớ tiếp theo ( hiện tại khởi động xong nó ghi lại vùng nhớ cũ vì các biến quay lại giá trị ban đầu )

thật sự mong các bạn giúp đỡ mình .

Do tốc độ ghi dữ liệu vào Eeprom của bạn khá cao nên bạn muốn ghi vào nhiều nơi để tăng thời gian "sống" cho dữ liệu của bạn đúng không?

Bạn có thể ghi block dữ liệu của bạn vào eeprom và 1 byte checksum (XOR), giả sử dữ liệu của bạn là 4 byte, vậy bạn cần ghi block 5 byte, lần lượt ở các địa chỉ: 0x00, 0x05, ...., bạn sẽ mất khoảng thời gian nhỏ khi khởi động bằng các đọc tất cả các block đó và tính checksum 4 byte ,so sánh với byte 5, khi nào bạn phát hiện checksum không đúng thì địa chỉ trước đó chính là dữ liệu bạn ghi cuối cùng, còn khi địa chỉ vượt qua giới hạn của eeprom bạn có thể đọc dữ liệu cuối cùng và tiến hành ghi đè lên block đầu tiên.

rikimaru87 04-12-2009 03:14 PM

mình ko hiểu ý nghĩa của checksum lắm ( lần đầu làm mà )
mình vì dụ mình ghi 1 block 4byte nhiệt độ lần lượt là 00,23,45,68 . ghi vào 4 byte . vậy thì byte checksum nên ghi gì . và lúc kiểm tra checksum ntn ?
sorry vì câu hỏi ngu ngốc nha .

phamminhtuan 04-12-2009 04:15 PM

Trích:

Nguyên văn bởi rikimaru87 (Post 31957)
mình ko hiểu ý nghĩa của checksum lắm ( lần đầu làm mà )
mình vì dụ mình ghi 1 block 4byte nhiệt độ lần lượt là 00,23,45,68 . ghi vào 4 byte . vậy thì byte checksum nên ghi gì . và lúc kiểm tra checksum ntn ?
sorry vì câu hỏi ngu ngốc nha .

là XOR đó bạn, checksum = 0x00 xor 0x23 xor 0x45 xor 0x68 (giả sử số của bạn cho đều là số ở hệ cơ số 16 => checksum = 0x0E

rikimaru87 04-12-2009 05:05 PM

cảm ơn bạn này nhiều nha !!! mình hiểu rùi .

enti 07-12-2009 11:13 AM

Theo mình sử dụng checksum thì mới kiểm tra tính đúng đắn của dữ liệu, còn để làm sao biết được sẽ ghi data vào vùng kế tiếp mỗi khi khởi động thì có cách khác.
1. nếu dùng cách checksum, mỗi lần khởi động sẽ phải read lại eeprom để kiểm tra vùng data cuối cùng, thời gian đọc và kiểm tra sẽ lâu, nếu dữ liệu phình ra.
2. bạn dùng 1 vùng epprom nào đó để lưu trữ địa chỉ epprom lần ghi cuối cùng, vùng này sẽ được ghi lại sau mỗi lần ghi data vào eeprom. khi khởi động lại bạn đọc vùng này ra và làm việc.

phamminhtuan 07-12-2009 01:55 PM

Trích:

Nguyên văn bởi enti (Post 32023)
Theo mình sử dụng checksum thì mới kiểm tra tính đúng đắn của dữ liệu, còn để làm sao biết được sẽ ghi data vào vùng kế tiếp mỗi khi khởi động thì có cách khác.
1. nếu dùng cách checksum, mỗi lần khởi động sẽ phải read lại eeprom để kiểm tra vùng data cuối cùng, thời gian đọc và kiểm tra sẽ lâu, nếu dữ liệu phình ra.
2. bạn dùng 1 vùng epprom nào đó để lưu trữ địa chỉ epprom lần ghi cuối cùng, vùng này sẽ được ghi lại sau mỗi lần ghi data vào eeprom. khi khởi động lại bạn đọc vùng này ra và làm việc.

Nếu bạn ghi 1.000.000 lần, vùng nhớ chứa "địa chỉ epprom lần ghi cuối cùng" của bạn sẽ die

lybao_huy 07-12-2009 02:59 PM

write, read eeprom by i2c
 
phone cho mình,mình chỉ cho

lybao_huy 07-12-2009 03:00 PM

write, read eeprom by i2c
 
phone cho mình,mình chỉ cho, 0906745086

rikimaru87 07-12-2009 03:58 PM

bạn cho sdt đi

phamminhtuan 08-12-2009 09:37 AM

Có một cách nữa có lẽ là hay hơn:

Bạn tiến hành các bước sau:
+ Tạo một vùng nhớ index, trỏ đến block dữ liệu của bạn, có thể 1 byte hay 2 byte tùy thuộc vào dung lượng EEPROM, đặt nó ở địa chỉ đầu tiên, có thể là 0x00
+ Định dạng cho mỗi Block dữ liệu của bạn bao gồm dữ liệu và 2 byte chứa số lần ghi eeprom (gọi là MaxWriteTime).
+ Khi đọc dữ liệu, bạn đọc index trước để xác định vị trí của block dữ liệu trong eeprom
+ Khi ghi dữ liệu, bạn đọc index để xác định vị trí sẽ ghi block dữ liệu, đọc MaxWriteTime, nếu MaxWriteTime lớn hơn SỐ LẦN TỐI ĐA GHI EEPROM(1.000.000) thì tăng index lên, và ghi vào vùng nhớ tiếp theo xác định bởi index. Nếu MaxWriteTime nhỏ hơn SỐ LẦN TỐI ĐA GHI EEPROM thì có thể ghi đè lên, và không thay đổi index.


Tùy thuộc vào dung lượng mà cách này có thể tăng tối đa số lần ghi eeprom lên 1.000.000 lần nữa.

Cách đầu tiên ở bài POST #1 có thể mất một khoảng thời gian nhỏ khi khởi động, nhưng số lần ghi tối đa có thể cao hơn rất nhiều nếu dung lượng eeprom càng lớn

rikimaru87 17-12-2009 10:28 AM

cảm ơn bạn nhiều heng . mình đã làm ok phần này rùi

rikimaru87 17-12-2009 10:29 AM

Mỗi cách đều có 1 hiệu quả riêng. cách của bạn mất 1 it thời gian khởi động nhưng rất chặt chẽ .


Múi giờ GMT. Hiện tại là 11:34 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam