![]() |
Sửa lỗi
các bác có thể cho em biết khi em biên dịch nó báo lỗi thể này, em không tài nào sửa được. các câu lệnh không lỗi . Có phải đây là lỗi do trình biên dịch hay không?
C:\DOCUME~1\Lenovo\LOCALS~1\Temp/ccy7qmcV.s:7299: Error: Cannot use psvpage on a symbol (_s) that is not located in a code, psv, or eedata section. |
Trích:
Dựa vào đâu bạn cho rằng câu lệnh không lỗi? Trình biên dịch bạn đang dùng là trình biên dịch gì? Thân, |
Hi, a Nam thông cảm cho em, tai em mới bập bõm làm quen với dspic nên đoán mò a ạ,
khi biên dịch nó báo lỗi thế này Link Error: Could not allocate section .data_0x400 at 0x400 Link Error: Could not allocate program memory Em nghĩ là do câu lệnh sau có vấn đề : const unsigned char __attribute__ ((space(psv), address (0x0400))) chuoi0[]=" Lo Nhiet \0", chuoi1[]= "Dat nhiet do = \0", chuoi2[]=" Dat kp = \0", chuoi3[]=" Dat ki = \0", chuoi4[]=" Dat kd = \0", chuoi5[]= " Nhiet do thuc = \0"; unsigned char __attribute__ ((space(psv), address (0x0500))) s[15]; // khai báo biến tạm Khi em bỏ lệnh : unsigned char __attribute__ ((space(psv), address (0x0500))) s[15]; nó lại báo lỗi thế này : C:\DOCUME~1\Lenovo\LOCALS~1\Temp/ccrApifs.s:6362: Error: Cannot use psvpage on a symbol (_s) that is not located in a code, psv, or eedata section. A sửa giúp em. em dùng con dspic30f4012 , C30 complier à nếu em muốn xuất số 0.0123 ra LCD. Trong C thường em biết có hàm ftoa để chuyển kiểu float sang kiểu char, vậy trong C30 có hỗ trợ hàm này không anh, anh có thể chỉ cho em thuật toán hiển thị số 0.0123 ra màn hình LCD ko ạ. Cám ơn anh nhiều |
Cách giải quyết đơn giản là bạn đặt các chuỗi hằng của bạn (chuoi0[], chuoi1[], ...) ở cuối vùng nhớ chương trình của dsPIC (với dsPIC30F4012 thì bạn cứ dùng địa chỉ từ 0x7000 trở lên đến 0x7FFF). Sau khi bạn vừa ý với chương trình đã viết thì mới điều chỉnh vị trí các chuỗi hằng này (hoặc cứ để chúng ở cuối vùng nhớ chương trình cũng chẳng sao). Như vậy sẽ tránh việc code của bạn đè lên các chuỗi hằng này khi chương trình dài ra, dẫn đến lỗi cấp phát bộ nhớ như bạn đã thấy.
Về các biến, bạn không dùng thuộc tính psv cho chúng, vì chúng được lưu vào RAM chứ không lưu vào bộ nhớ chương trình hay EEPROM. Chẳng hạn, biến s của bạn chỉ cần khai báo như sau: Code:
unsigned char s[15]; |
Cám ơn anh Nam nhé, e đã sủa được rồi . Em đọc và sủa như sau:
const unsigned char __attribute__ ((space(auto_psv))) chuoi0[]=" cty CEVT \0", chuoi1[]= "Dat nhiet do = \0", chuoi2[]=" Dat kp = \0", chuoi3[]=" Dat ki = \0", chuoi4[]=" Dat kd = \0", chuoi5[]= " Nhiet do thuc = \0"; unsigned char __attribute__ ((space(auto_psv))) s[15]; Em để tự động định địa chỉ. Thưa anh, em muốn hỏi anh ở phần hiển thị LCD. Trong tutorial 4 của anh có sử dụng các tín hiệu data của LCD cho cổng E. Nhưng giờ em muốn nối thể này (tại em làm tiếp cái của người khác đang làm ) : Cổng F cho D4,D5 ; E4,E5 cho D6,D7. Giờ em khai báo như thế này có được không : Code:
#define LCD_DAT1 LATE |
Code của tôi dùng cho trường hợp 4 bit dữ liệu vào ra LCD nằm ở 4-bit của port E. Bạn dùng cả hai port E và F để xuất/nhập dữ liệu với LCD thì trước khi xuất xung Enable bạn phải thao tác dữ liệu trên cả hai port E và F, để ghi ra LCD. Code hiện thời của bạn chưa làm được điều đó.
Thân, |
Bác cho em hỏi thêm : Những cảnh báo sau co "nguy hiểm" không bác :
Code:
C:\Documents and Settings\Lenovo\Desktop\lonhiet.c: In function '_INT0Interrupt': |
Trích:
Thân, |
Anh ơi em viết hàm con hiển thị số dạng float ra màn hình cụ thể như sau :
Code:
void hienthi( float o, unsigned char a[15])Code:
int main()Code:
C:\Documents and Settings\Lenovo\Desktop\lonhiet2.c:183: warning: passing argument 2 of 'hienthi' discards qualifiers from pointer target type |
Không rõ a[] và s[] của bạn được khai báo ra sao. PSV chỉ dùng cho các hằng được lưu trong bộ nhớ chương trình hay trong EEPROM. Bạn không cần truyền con trỏ của các mảng này đến hàm hienthi() của bạn (cứ dùng chúng như mảng hằng toàn cục).
Lập trình cho PIC khác với lập trình cho máy tính nói chung, vì tài nguyên của PIC rất hạn chế. Theo tôi, cách thực hiện của bạn khá rối rắm. Bạn có thể tham khảo các đoạn code C sau về chuyển dữ liệu nhị phân thành chuỗi ASCII, và phần code liên quan đến việc hiện thực phép chia cho 10: http://www.piclist.com/techref/langu...onvertbase.htm Thân, |
Trích:
Code:
|
Chương trình con Write2Pins() của bạn đang thực hiện ghi bit thấp nhất của nibble ra D7, còn bit cao nhất của nibble ra D4. Tương tự cho các bit còn lại. Đây có thể là lý do khiến chương trình của bạn chạy không đúng ý đồ.
Theo tôi hiểu, chân D7 của bạn (LATE5) đang nối vào chân tương ứng (D7) của module LCD, và tương tự cho các chân còn lại. Thân, |
1 Attachment(s)
Em cũng đã sửa lại rồi, nhưng vẫn không được anh ạ.
nó không báo lỗi gì cả . Em đưa bất kỳ file hex nào vào kitpic2 nó đều cảnh báo sau. lỗi ở đâu |
Trích:
Code của bạn đã đặt các từ cấu hình FOSC, FWDT, FBORPOR, và FGS, như vậy là đủ. Tuy nhiên, PICkit 2 Programmer vẫn tìm kiếm giá trị cho FICD (chỉ được đề cập từ datasheet phiên bản DS70135F, tháng 7 năm 2008). Đây không phải là lỗi, chỉ là cảnh báo rằng một vài từ cấu hình không được đặt giá trị tường minh trong code (ở trường hợp này là FICD). Bạn có thể thêm dòng sau vào code của bạn để không gặp cảnh báo này nữa: Code:
_FICD( ICS_NONE ); |
Em thử vẫn vẫn cảnh báo như vậy anh ạ . Em thử chương trình khác nó cũng cảnh báo như vậy nhưng vẫn chạy, còn chương trình LCD thì nó vẫn không chịu hiển thị. Anh xem lại cho em chương trình LCD xem sao.
Code:
|
Xác nhận với bạn rằng PICkit 2 v2.55 vẫn đưa ra cảnh báo trên ngay cả khi tất cả các field của tất cả các từ cấu hình đã được mô tả tường minh giá trị trong code.
Về code LCD của bạn, bạn để ý trong chương trình con khởi tạo LCD của tôi, sau mỗi bước đặt cấu hình tôi đều có delay 1 ms (sau khi xóa màn hình thì phải chờ khoảng 5 ms), code của bạn đang xuất ào ào các giá trị cấu hình ra LCD. Bạn thử chỉnh lại phần này xem, nếu vẫn không thành công, có lẽ bạn phải thực hiện quá trình khởi động mềm cho LCD, tham khảo quy trình ở post #269, link dưới đây: http://www.picvietnam.com/forum/showthread.php?t=357 Xung Enable của bạn có thể không đủ rộng (vì bạn bật xong thì tắt nó ngay). Code ví dụ của tôi có 1 vòng for nhỏ dùng để tạo độ rộng tối thiểu 1 us cho xung Enable. Thân, |
1 Attachment(s)
Cám ơn anh Nam nhé, em đã làm đúng như anh bảo nhưng LCD vẫn không chịu hiển thị, em kiểm tra phần cứng không có vấn đề gì, em thử test chương trình cũ của một anh ( tên là H ) ra đi không một lời chăn chối thì LCD vẫn chạy. Thôi em đành bỏ cái mạch đó đi làm lại mạch mới, nhưng em vẫn ấm ức lắm, rồi có ngày em sẽ tìm được nguyên nhân.
Thưa anh em nhận được nhiệm vụ mới đó là thực hiện điều khiển số PFC để ổn định áp ra...... Em đã viết code mong em xem giúp em : Code:
////////////////////////// tham khao tutorial 06.01 cua anh Nguyen Quang Nam //////////////////3 Biến đổi AD đưa vào 3 chân AN0,1,2. ( ở phần khai báo không biết có đúng không ) Phần tính toán PI của áp và dòng em thực hiện trong vong ngắt của ADC: Bằng suy nghĩ của một nông dân, em cứ thực hiện từng bước tính toán như sơ đồ của nó. Em đình dạng dữ liều ra kiểu fractional (Q15) cho ADC, thưa anh có phải khi biến đổi ADC ở 3 đầu vào thì kết quả của từng việc biến đổi sẽ lưu lần lượt ở ADCBUF0,1,2 không hả anh ? và khi em thực hiện phép nhân Vx = Vc*ADC_Vi; liệu rằng nhân 2 số kiểu fractional nó có tràn không anh và cách xử lý ra sao ? Liệu răng chương trình này có điều khiển được không anh nhỉ, Em tham khảo nhiều tài liệu , thấy họ viết code rất phức tạp, dùng ngắt timer, ngắt PWM, ADC, ..... |
Có lẽ bạn nên đọc thêm về module ADC của dsPIC. Khi đã hiểu rõ hơn cách hoạt động của module này, bạn có thể bắt đầu với code đơn giản để đọc 3 tín hiệu analog, rồi mới tiếp tục những công việc xử lý khác.
Nói chung, không nên thực hiện những tính toán phức tạp, hay gọi hàm tính toán phức tạp trong chương trình xử lý ngắt (với cách thiết lập trong ví dụ của tôi, bạn sẽ có khoảng 40000/16 = 2500 ngắt ADC mỗi giây). Nhân hai số fractional trong dsPIC sẽ không tràn, điều này được đảm bảo. Trong sơ đồ bạn đã post lên, không có phần D trong PID. Như bạn đã viết, người ta dùng chương trình khá phức tạp để thực hiện bài toán mà bạn đang nghiên cứu. Do vậy, bạn cứ từ từ tìm hiểu, và tiến dần từ những chương trình rất đơn giản, và cơ bản. Chúc bạn thành công. Thân, |
| Múi giờ GMT. Hiện tại là 09:51 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