Trích:
Nguyên văn bởi Hard
Hi,
Cảm ơn bác namqn, tui đã dùng #build rồi nhưng khi đặt như vậy thì toàn bộ mã được đặt vào vùng đó mà không có lệnh nhảy đến vùng đó. Vì vậy khi reset thì chip không làm gì cả vì tại địa chỉ 0x0000 chẳng có lệnh gì cả. Ngay cả khi tui đưa vào dòng #build(reset = 0, interrupt = 0x0004) thì cũng chẳng có lệnh nhảy đến địa chỉ đặt đoạn code của hàm main ở địa chỉ 0x0000.
Trong CCS thì đã có ví dụ BLD nhưng đoạn mã này nó không nằm ở cuối vùng nhớ chương trình và khi viết chương trình ứng dụng thì phải khai báo lại địa chỉ reset và ngắt. Điều này không hay vì nếu ta dùng một file hex có sẵn (được dịch từ trình biên dịch khác) thì nó không chạy được.
Các bác còn cao kiến nào khác không?
|
Tôi đã thử chương trình đơn giản như sau thì CCS C đã biên dịch tốt, đặt mã chương trình đúng vị trí mong muốn, và tại vị trí vector ngắt cũng xử lý thanh ghi PCLATH trước khi có lệnh nhảy đến main() . Vấn đề là code của bạn đã nêu ở post #3 có dòng 8 thừa, và có vùng nhớ trải qua nhiều hơn 1 trang bộ nhớ chương trình.
Code:
#include <16F77.h>
#fuses HS,NOWDT,NOPROTECT
#org 0x1F00, 0x1FFF
void main() {
set_tris_b(0);
output_b(0);
while(TRUE) {
}
}
Nếu bạn vẫn cứ muốn dùng các #org (một cách không cần thiết) để dành chỗ cho chương trình ứng dụng thì có thể thêm các dòng sau vào phía trước main():
Code:
#org 0x0004, 0x07FF
#org 0x0800, 0x0FFF
#org 0x1000, 0x17FF
Thân,