PDA

View Full Version : Chuỗi được lưu trong Flash


bien_van_khat
12-11-2006, 10:55 PM
Anh em cho mình hỏi, trong CCS nếu mình khai báo một string trong ROM thì làm cách nào lấy ra để hiển thị lên LCD vậy?

Thì cứ khai báo

const rom char tuila = "mot nguoi nao do";

xong rồi coi nó như một con trỏ hằng kiểu char.
À nếu sai thì bạn thông cảm nhé, vì có khi tớ lộn với C18 :)

minhpic
13-11-2006, 11:05 PM
Bạn chưa thử đúng không?
không được đâu bạn ạ, mình cũng đã thử nhưng k được

namqn
13-11-2006, 11:33 PM
Theo tài liệu của CCS:

Để khai báo:
BYTE CONST TABLE [10]= {9,8,7,6,5,4,3,2,1,0};

Để dùng:
x = TABLE [i];
hay
x = TABLE [5];

Nhưng không được dùng con trỏ như sau:
ptr = &TABLE [i];

Thân,

minhpic
14-11-2006, 06:57 AM
Không tui hỏi là khai báo một mảng string trong rom, ban chưa hiểu ý mình rồi!!!!!!!

namqn
14-11-2006, 06:39 PM
Không tui hỏi là khai báo một mảng string trong rom, ban chưa hiểu ý mình rồi!!!!!!!
String được lưu như một array of byte trong ROM. Bạn có thể dùng:

BYTE CONST STRING [10] = "Hello";

Đừng máy móc quá khi học PIC nói riêng và vi điều khiển nói chung.

Thân,

minhpic
15-11-2006, 10:35 AM
ha ha, the ban da thu khai bao mot mang tring chu khong phai 1 tring nhu vay, sau do hien thi len lcd ntn?
minh nho cac ban giup

nhh
15-11-2006, 04:07 PM
ha ha, the ban da thu khai bao mot mang tring chu khong phai 1 tring nhu vay, sau do hien thi len lcd ntn?
minh nho cac ban giup

Không biết mục tiêu của bác là gì ?????:confused:
Bác muốn khai báo một mảng chứa nhiều string, thì có khác gì một mảng bình thường đâu.

Ví dụ bác có 3 string để hiển thị lên LCD là
+ "Chao em"
+ "Em xinh qua!"
+ "Em xinh the!"
Bác có thể khai báo một mảng:

int hi[] = "Chao emEm xinh qua!Em xinh the!";

Muốn hiển thị lên LCD string 1, bác cho 1 biến đếm tăng dần rồi truy xuất đến chuỗi cần hiển thị của bác là OK rồi.

Nhưng làm như vậy rất khó chịu, cứ khai báo 3 mảng khác nhau chứa 3 string trên.Khi cần truy xuất sẽ dễ dàng và chương trình nhìn sáng sủa hơn nhiều.

Chào!

namqn
15-11-2006, 06:26 PM
ha ha, the ban da thu khai bao mot mang tring chu khong phai 1 tring nhu vay, sau do hien thi len lcd ntn?
minh nho cac ban giup
Tôi không có hứng thú với CCS, cũng không có ý định thử những vấn đề mà bạn cần thực hiện trên mạch thực. Tôi chỉ đọc tài liệu của CCS và nhận thấy đó là cách thực hiện điều bạn đang muốn làm. Việc thử nghiệm là của bạn, nếu bạn có lòng muốn giúp đỡ các bạn khác thì post kết quả thử nghiệm lên đây.

Hơn nữa, ban đầu bạn hỏi cách khai báo và truy xuất một string trong ROM. Bây giờ bạn đang đặt câu hỏi tiếp theo hay cho rằng câu trả lời không đúng?

Thân,

namqn
15-11-2006, 06:28 PM
Không biết mục tiêu của bác là gì ?????:confused:
Bác muốn khai báo một mảng chứa nhiều string, thì có khác gì một mảng bình thường đâu.

Ví dụ bác có 3 string để hiển thị lên LCD là
+ "Chao em"
+ "Em xinh qua!"
+ "Em xinh the!"
Bác có thể khai báo một mảng:

int hi[] = "Chao emEm xinh qua!Em xinh the!";

Muốn hiển thị lên LCD string 1, bác cho 1 biến đếm tăng dần rồi truy xuất đến chuỗi cần hiển thị của bác là OK rồi.

Nhưng làm như vậy rất khó chịu, cứ khai báo 3 mảng khác nhau chứa 3 string trên.Khi cần truy xuất sẽ dễ dàng và chương trình nhìn sáng sủa hơn nhiều.

Chào!
nhh chú ý: Bạn này đang hỏi về cách sử dụng Flash để lưu các hằng string.

Thân,

minhpic
15-11-2006, 09:47 PM
Đúng là bạn chỉ đọc tài liệu thật, mình đã làm và thấy rất bất cập nên mới hỏi các bạn, đâu có thách đố ai, vả lại mình cần vì nó phụ thuộc vào thuật toán mình đang làm, có lẽ bạn cũng không thể biết, CCs còn đang lỗi về kiểu khai báo này, có rất nhiều điều có trong help nhưng lại không thể thực hiện được, mình nói lại mình chẳng có ý định gì cả, những điều mình hỏi là vì không làm được, bạn cũng chưa biết là viết hàm hiển thị một string lưu trong rom đúng không? mình nghĩ là chỉ xem help thôi thì bạn đừng nên quy chụp vội, tôi chưa bao giờ thách đố ai cả, vì trình độ tôi còn kém lắm, và mình cũng rất ngưỡng mộ kiến thức của bạn

namqn
15-11-2006, 10:25 PM
Đúng là bạn chỉ đọc tài liệu thật, mình đã làm và thấy rất bất cập nên mới hỏi các bạn, đâu có thách đố ai, vả lại mình cần vì nó phụ thuộc vào thuật toán mình đang làm, có lẽ bạn cũng không thể biết, CCs còn đang lỗi về kiểu khai báo này, có rất nhiều điều có trong help nhưng lại không thể thực hiện được, mình nói lại mình chẳng có ý định gì cả, những điều mình hỏi là vì không làm được, bạn cũng chưa biết là viết hàm hiển thị một string lưu trong rom đúng không? mình nghĩ là chỉ xem help thôi thì bạn đừng nên quy chụp vội, tôi chưa bao giờ thách đố ai cả, vì trình độ tôi còn kém lắm, và mình cũng rất ngưỡng mộ kiến thức của bạn
Tất nhiên là tôi biết cách hiển thị một string trong Flash lên LCD chứ, bạn có thể đọc tutorial 3 về dsPIC của tôi để kiểm tra. Tôi biết rằng CCS có một số nhược điểm, do đó tôi không có hứng thú với nó. Nhưng bạn vẫn muốn dùng CCS nên tôi mới đọc tài liệu giúp bạn. Tôi sẽ thử hiển thị một mảng string trong ROM lên LCD với CCS, và sẽ cho bạn biết kết quả sau.

Thân,

minhpic
16-11-2006, 02:01 PM
Rất cám ơn bạn, mình hiện tại vẫn phải đi đường vòng bằng cách xử dụng hàm strcopy để đưa các string từ rom sang ram, điều này rất bất tiện, mong bạn tìm cách khác hợp lý hơn giúp mình. Chân thành cảm ơn bạn.

namqn
16-11-2006, 06:21 PM
Dưới đây là một ví dụ hiển thị mảng string gồm 2 string trong Flash lên LCD, tôi dùng PORTB để giao tiếp với LCD. Code đã được chạy thử. Tôi tin là bạn biết cách kết nối phần cứng giữa LCD và PIC.

#define use_portb_lcd TRUE

#if defined(__PCM__)
#include <16F877.H>
#device *=16
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#elif defined(__PCH__)
#include <18F452.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif

#include <lcd.c>

// CONSTANTS
byte const str_table [2][10] = {"Hello!", "Xin chao!"};

void main() {

lcd_init();
delay_ms(6);

//Print first line to LCD
lcd_putc(str_table[0]);

//Move to the beginning of the second line
lcd_gotoxy(1, 2);

//Print second line to LCD
lcd_putc(str_table[1]);

// loop always
while(TRUE);
}

Thân,

minhpic
17-11-2006, 04:14 AM
Mình không biết nhưng lcd_putc() là hàm hiển thị lên lcd một ký tự mà bạn, bạn có nhầm không

minhpic
17-11-2006, 02:32 PM
Cám ơn bạn, mình thử rồi.

namqn: Bạn chỉ cần nhấn vào nút "Cảm ơn" ở post tương ứng, không nên post chỉ một dòng cảm ơn.

namqn
17-11-2006, 06:10 PM
Mình không biết nhưng lcd_putc() là hàm hiển thị lên lcd một ký tự mà bạn, bạn có nhầm không
Tài liệu của CCS nói rằng tuy lcd_putc() là hàm hiển thị ký tự, nhưng nó chấp nhận một string. Đó là điểm mở rộng của hàm vì nó sẽ thuận lợi hơn cho người sử dụng.

Thân,

chinhha
23-11-2006, 10:38 AM
Các cao thủ cho mình hỏi một chút nhé: Mình muốn lưu một bảng dữ liệu gồm 128 phần tử số thực vào trong ROM, sau đó gọi ra theo index của từng phần tử, liệu có được không? Cụ thể là mình muốn hiển thị ra LCD.
Nếu được thì cho mình một vài ví dụ đơn giản nhé.
Cảm ơn các bạn nhiều!

namqn
23-11-2006, 07:02 PM
Các cao thủ cho mình hỏi một chút nhé: Mình muốn lưu một bảng dữ liệu gồm 128 phần tử số thực vào trong ROM, sau đó gọi ra theo index của từng phần tử, liệu có được không? Cụ thể là mình muốn hiển thị ra LCD.
Nếu được thì cho mình một vài ví dụ đơn giản nhé.
Cảm ơn các bạn nhiều!
Theo tài liệu của CCS, cách khai báo tương tự (như tôi đã nêu trên) có thể dùng cho số thực float. Tuy nhiên, bạn cần xem lại số phần tử, vì 1 số float cần 32-bit, hay 4 byte. Với 128 phần tử, bạn sẽ cần có 512 byte RAM. Và tôi không nghĩ rằng có chip PIC16 nào có nhiều hơn 368 byte RAM. Điều đó có nghĩa là nếu bạn vẫn muốn có 128 phần tử trong bảng thì phải dùng PIC18.

Thân,

chinhha
27-11-2006, 02:11 PM
vậy mình có thể khai báo 2 bảng,mỗi bảng gồm 64 phần tử. Sau đó vẫn gọi ra theo index của từng bảng. Mình đã thử dùng cách này, nhưng có vẻ không được ổn lắm. Vậy còn cách nào khác không các bạn?

namqn
28-11-2006, 01:20 AM
vậy mình có thể khai báo 2 bảng,mỗi bảng gồm 64 phần tử. Sau đó vẫn gọi ra theo index của từng bảng. Mình đã thử dùng cách này, nhưng có vẻ không được ổn lắm. Vậy còn cách nào khác không các bạn?
2 bảng, mỗi bảng gồm 64 phần tử thì vẫn cần 512 byte RAM! Bạn không hiểu ý tôi đã nói là PIC16 chỉ có tối đa 368 byte RAM.

Thân,

hpecom
28-11-2006, 12:07 PM
Chào bác Nam!

Em cũng theo dõi luồng này, và nhận thấy bác hay dùng RAM trong khi các bạn đang hỏi ROM (Flash), bác có thể viết một bài cụ thể hướng dẫn cách phân biệt RAM, ROM và khả năng lưu trữ của chúng ở dòng chip 16 được không?
Cảm ơn bác.

namqn
28-11-2006, 08:40 PM
Ồ, xin lỗi bạn chinhha nhé, không hiểu sao hai post vừa rồi tôi lại nghĩ là bạn muốn dùng RAM để lưu các số thực. Nếu dùng Flash thì không có vấn đề gì khi bạn muốn dùng 128 phần tử trong một mảng.

Tôi nói thêm một ít về RAM và ROM thôi, không cần phải dài dòng. Chúng ta dùng RAM trong trường hợp cần biến để tính toán khi chương trình thực thi, chúng ta thường dùng ROM để lưu trữ các hằng (số, chuỗi, ký tự, ...). Chúng ta vẫn có thể dùng RAM để lưu trữ các hằng, nhưng như vậy là lãng phí, vì dung lượng RAM thường nhỏ hơn dung lương ROM khá nhiều lần.

Đối với PIC nói chung, và PIC16 nói riêng, việc lưu dữ liệu trong ROM đòi hỏi một phương pháp truy cập dữ liệu khác với phương pháp dùng cho RAM, vì kiến trúc RISC của PIC. Tuy nhiên, các trình biên dịch cấp cao (như CCS chẳng hạn) có thể xử lý những thao tác đó cho chúng ta, do vậy, điều chúng ta cần quan tâm chỉ là khai báo cho đúng cú pháp để trình biên dịch hiểu được chúng ta muốn lưu dữ liệu vào đâu. Với một số PIC có khả năng tự ghi vào bộ nhớ chương trình thì dữ liệu hằng không nhất thiết là không thể thay đổi, nghĩa là chúng ta có thể cập nhật các hằng đó khi chương trình thực thi, hay thông qua một firmware tương tự như bootloader chẳng hạn. Với các PIC không có khả năng tự ghi vào bộ nhớ chương trình, chúng ta vẫn có giải pháp cho việc cập nhật các dữ liệu hằng, đó là EEPROM của PIC. Tuy nhiên, EEPROM thường có dung lượng nhỏ hơn RAM (trong các PIC), và cũng đòi hỏi một phương pháp truy cập khác với RAM.

Hy vọng đã đáp ứng được yêu cầu của bạn.

Thân,

chinhha
01-12-2006, 07:57 AM
anh namqn có thể cho em một ví dụ cụ thể về khai báo một mảng 128 phần tử thực được không?

namqn
05-12-2006, 11:46 PM
anh namqn có thể cho em một ví dụ cụ thể về khai báo một mảng 128 phần tử thực được không?
Ví dụ:

float const table[] = {1.0, 2.0};

Bạn chịu khó điền vào cho đủ 128 phần tử nhé (tôi lười quá nên chỉ đánh vậy thôi).

Thân,

nguyenluan0728
15-12-2010, 09:43 AM
thank moi nguoi nhieu