Ðăng Nhập

View Full Version : Cần giúp đỡ về mảng kích thước lớn trong flash


datk45d
13-01-2009, 12:28 AM
Chào các bác.

Tôi đang có một ứng dụng dùng pic16f886, trong đó đọc lần lượt các giá trị trong flash và đưa ra spi. Tôi dùng khai báo "const unsigned char data[]={...}" để đặt sẵn các giá trị trong flash. Chương trình OK, nhưng chỉ với kích thước giới hạn nhỏ hơn 0x800. Còn với mảng dữ liệu lớn hơn thì không được, HTPIC pro báo:"can't find 0x801 words for psect "strings" in segment "CODE" ". Có vẻ như HTPIC không thể đặt dữ liệu trong 2 block flash thì phải. Bác nào biết cách khắc phục xin giúp đỡ. Thank trước.

namqn
13-01-2009, 12:43 AM
Chào các bác.

Tôi đang có một ứng dụng dùng pic16f886, trong đó đọc lần lượt các giá trị trong flash và đưa ra spi. Tôi dùng khai báo "const unsigned char data[]={...}" để đặt sẵn các giá trị trong flash. Chương trình OK, nhưng chỉ với kích thước giới hạn nhỏ hơn 0x800. Còn với mảng dữ liệu lớn hơn thì không được, HTPIC pro báo:"can't find 0x801 words for psect "strings" in segment "CODE" ". Có vẻ như HTPIC không thể đặt dữ liệu trong 2 block flash thì phải. Bác nào biết cách khắc phục xin giúp đỡ. Thank trước.
Mời bạn xem hình 2-3 trong datasheet của PIC16F886. Bộ nhớ chương trình của PIC16F886 được tổ chức thành 4 trang (trang 0 đến trang 3, mỗi trang có độ dài 0x800 = 2048 word). Để truy cập dữ liệu nằm ở nhiều trang thì cần theo dõi và cập nhật thanh ghi PCLATH cho tương ứng với trang cần dùng.

Bạn thử tách dữ liệu của bạn thành nhiều khối có độ dài 2048 xem. Tôi không dùng HTPIC nên không rõ cách làm cụ thể như thế nào trong HTPIC, bạn nên vào diễn đàn của HTPIC (http://www.htsoft.com/support/forums.php) để hỏi.

Về thuật toán truy cập bảng kích thước lớn, bạn có thể tham khảo piclist (www.piclist.com), nhưng code mẫu của họ thường dùng hợp ngữ. Chẳng hạn trang này: http://www.piclist.com/techref/microchip/bigtable.htm.

Thân,

namqn
13-01-2009, 01:14 AM
Lỗi mà bạn đã gặp là lỗi (491) can’t find 0x* words for psect "*" in segment "*", đã được mô tả khá chi tiết ở trang 408 của tài liệu hướng dẫn sử dụng cho HTPIC Pro.

Bạn cần một khối nhớ liên tục có kích thước đủ lớn để đặt mảng hằng số vào. Việc này liên quan đến việc bạn cho biết linker phải đặt các psect vào đâu. Làm việc này như thế nào trong HTPIC thì tôi mù tịt. Trong MPLAB C18 chẳng hạn thì tôi chỉ cần chỉnh lại linker script được dùng để liên kết các module vào thành chương trình hoàn chỉnh.

Thân,