PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 23-11-2009, 04:50 PM   #1
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Tràn dữ liệu

Mình gặp vấn đề rất khó chịu khi làm việc với pic dùng CCS để viết code
Khi cần khai báo 1 mảng dữ liệu lớn 1 chút là trình dịch báo lỗi ( thường > 50 phần tử là bị báo lỗi dữ liệu quá lớn )
Ví như mình muốn khai báo 1 mảng hằng số chứa 1024 phần tử int8 . tương đương với 1kb , với dữ liệu 1kb thì bộ nhớ cuả pic thừa sức lưu trữ được. Nhưng ko hiểu sao trình dịch báo lỗi là dữ liệu quá lớn " data item too big"
ví dụ :

const int8 img[1024]= {0, 0, 0, 0, 4, 10, 58, 62,122,210,208,208..........};

>> lỗi

Ai có kinh nghiệm xử lý tình huống này chỉ giúp mình và mọi người với. Mình nghĩ có nhiều người bị vướng mắc vấn đề này

THANKS !
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 06:49 PM   #2
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Bạn dùng PIC16 hay 18?
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 07:02 PM   #3
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
Mình đã test thử, thấy nó chỉ cho phép lưu 1 mảng có nhiều nhất là 256 phần tử (kiểu int8), đối với kiểu int16 thì lại ít hơn.

Mình đoán lỗi này là do CCS thôi, bạn thử dùng trình biên dịch khác xem, vì trong C hình như ko giới hạn độ dài của mảng thì phải.

Nếu không thì bạn có thể chia mảng đó ra thành nhiều mảng khác, ví dụ :

const int8 img[200]= {0, 0, 0, 0, 4, 10, 58, 62,122,210,208,208..........};
const int8 img1[200]= {0, 0, 0, 0, 4, 10, 58, 62,122,210,208,208..........};
const int8 img2[200]= {0, 0, 0, 0, 4, 10, 58, 62,122,210,208,208..........};
.......

Mình cũng đã thử dùng mảng 2 chiều, nhưng kết quả vẫn vậy.
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 08:10 PM   #4
debugger
Đệ tử 2 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 45
:
Mình nhớ là với PIC16 thì CCS không cho phép khai báo mảng liên tục có kích thước lớn hơn 512 byte (hay 1k gì đó, ko nhớ rõ lắm) trong ROM. Nó cũng giống như việc CCS không cho phép viết 1 hàm chiếm quá nhiều ROM. Bạn chia thành nhiều mảng con có kích thước đủ bé thì sẽ giải quyết được vấn đề.
debugger vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 08:17 PM   #5
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Mình dùng pic 16f . Lỗi này mình gặp rất nhiều , trước kia mỗi khi bị mình đều cố gắng tìm cách tối giảm các phần tử trong mảng nhưng đó chỉ là giải pháp tình thế

Giờ mình cần load ảnh lên GLCD 128X64 , mỗi ảnh đều phải tạo 1 bảng mã cần 1024 phần tử .

giải pháp của PK178 cũng hay và có thể xử lý được ,mình cũng nghĩ vậy nhưng làm như vậy thì hơi bất tiện và phức tạp vì phải cắt 1 mảng ra thành nhiều mảng rồi lại ghép vào ...

Ai đã chinh phục được CCS vấn đề này thì chia sẻ cho a e nhé

Thanks
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 08:26 PM   #6
picpen
Đệ tử 5 túi
 
picpen's Avatar
 
Tham gia ngày: Jun 2008
Bài gửi: 112
:
Vậy là chỉ có mỗi cách chia nhỏ sao ? Nếu vậy thì thiệt thòi quá trong khi dùng COVERSION viết cho AVR thì khai báo thoải mái , viết thoải mái mà nó dịch vẫn chuẩn , và ổn định

Có lẽ đã đến lúc mình phải thử nghiệm loại chíp khác cho sản phẩm ( AVR chẳng hạn ....)

Rất cám ơn mọi người đã chia sẻ !
__________________
** xin hãy cho tôi là tượng đá
** Để muôn đời không nhớ thương ai ..!!
picpen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 08:59 PM   #7
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi picpen View Post
Mình dùng pic 16f . Lỗi này mình gặp rất nhiều , trước kia mỗi khi bị mình đều cố gắng tìm cách tối giảm các phần tử trong mảng nhưng đó chỉ là giải pháp tình thế

Giờ mình cần load ảnh lên GLCD 128X64 , mỗi ảnh đều phải tạo 1 bảng mã cần 1024 phần tử .

giải pháp của PK178 cũng hay và có thể xử lý được ,mình cũng nghĩ vậy nhưng làm như vậy thì hơi bất tiện và phức tạp vì phải cắt 1 mảng ra thành nhiều mảng rồi lại ghép vào ...

Ai đã chinh phục được CCS vấn đề này thì chia sẻ cho a e nhé

Thanks
Vấn đề nằm ở cấu trúc phần cứng của PIC16 chứ không phải do trình dịch.

Dùng PIC16 để so sánh với AVR thì có vẻ không công bằng cho PIC. Thế giới PIC 8-bit vẫn còn có PIC18, bạn đã thử viết code tương tự trong CCS C cho PIC18 nào chưa?

Tôi không dùng CCS C, nhưng đã từng viết code thử nghiệm GLCD dùng PIC18F2320, với bitmap được chứa trong mảng 1 chiều 1024 phần tử.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 09:08 PM   #8
tungnh
Đệ tử 5 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 94
:
tôi nghĩ với quy mô đưa ảnh hiển thị lên glcd 128x64 việc lưu trữ như vậy là không nên, kể cả chương trình dịch có cho phép hay không Nó sẽ làm tốn bộ nhớ một cách vô ich.
theo kinh nghiệm của tôi, tôi thường tạo ra các icon nhỏ và sử dụng chúng khi cần thiết. Quan trọng là thuật toán như thế nào. ví dụ bạn có menu, gồm các icon, khi chọn đến mục nào thì icon đó đổi trạng thái , thay vì bạn dùng tới 2 icon thì bạn chỉ cần dùng một icon và khi viết lênh lên glcd thì chỉ việc đảo data là hỉnh sẽ đảo ngược......
nếu chip có modole SPI , sao không dùng thẻ nhớ để ảnh( mã hex ) rồi khi cần hiển thị chỉ việc đọc ra thôi.
Bạn đừng chia tay với em nó mà tội.
__________________
Windows CE 6 R3
tungnh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-11-2009, 11:00 PM   #9
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Trích:
Nguyên văn bởi picpen View Post
Mình gặp vấn đề rất khó chịu khi làm việc với pic dùng CCS để viết code
Khi cần khai báo 1 mảng dữ liệu lớn 1 chút là trình dịch báo lỗi ( thường > 50 phần tử là bị báo lỗi dữ liệu quá lớn )
Ví như mình muốn khai báo 1 mảng hằng số chứa 1024 phần tử int8 . tương đương với 1kb , với dữ liệu 1kb thì bộ nhớ cuả pic thừa sức lưu trữ được. Nhưng ko hiểu sao trình dịch báo lỗi là dữ liệu quá lớn " data item too big"
ví dụ :

const int8 img[1024]= {0, 0, 0, 0, 4, 10, 58, 62,122,210,208,208..........};

>> lỗi

Ai có kinh nghiệm xử lý tình huống này chỉ giúp mình và mọi người với. Mình nghĩ có nhiều người bị vướng mắc vấn đề này

THANKS !

Với khai báo mảng trên 256 phần tử trong CCS với PIC 16 thì hẳn nhiên sẽ gặp lỗi. Tuy nhiên bạn có thể làm được nhưng bằng ... cách khác. Đó là chỉ thị #ROM của CCS, với chỉ thị này bạn có thể thiết kế mảng kích thước tùy ý trong FLASH của PIC bắt đầu tại 1 địa chỉ nào đó.

Code:
#rom address = {list}
#rom int8 address = {list}
#rom char address = {list}
Xem chi tiết trong Manual của CCS. Chúc bạn thành công.

Regards
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam