Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
版主
|
中斷是硬體的設計,所以位址是固定不變的。所以你要在 0x0008 及 0x0018 的地方坐一個中斷向量轉移的動作。所以要修改一下 Bootloader 0x0008 的地方直接放入 goto 0x1008 這樣才會執行你的中斷程式。
發表於: 2007/12/11 8:58
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
版主,您好!
我在程序中增加了中斷的轉移 #pragma code high_vector=0x1008 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr void high_isr(void) 用ICD2調試發現不能正常的進入中斷,就不知這是爲什麽了? 還有我的bootloader程序是用C語言寫的,可以用您說得方法修改嘛?謝謝版主能幫助我~^_^
發表於: 2007/12/11 8:19
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
版主
|
這樣改的方式是正確的,需再注意一下中斷 0x08 & 0x18 的轉移。你可以先檢驗一下起始位址改到 0x0100 後,將 lst 檔案打開看看編譯過後的位址是否正確並將原先的中斷作轉移後利用 ICD2 看看程式是否能正確執行,最後才做 bootload 的測試。這樣問題就比較容易找出來。
發表於: 2007/12/10 11:24
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
我明白版主的意思了,我將c018i.c另存爲一個.c文件,保存再source files中,將c018i.c文件改爲如下:
#pragma code _entry_scn=0x001000 void _entry (void) { _asm goto _startup _endasm } 在18f85j10i.lkr中改變如下: //FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x1029 PROTECTED CODEPAGE NAME=page START=0x102A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF 幷且將主程序的中斷地址也改變了,如下: #pragma code high_vector=0x1008 這樣改過以後,生成了hex文件,并在bootloader中加載了,但是程序不能正常運行。 所以這樣改過以後程序是否是正確的,我又試著通過這樣的方法將地址還是改爲0x0000,就是改變如下: #pragma code _entry_scn=0x000000 void _entry (void) { _asm goto _startup _endasm } 在18f85j10i.lkr中改變如下: //FILES c018i.o FILES clib.lib FILES p18f85j10.lib CODEPAGE NAME=vectors START=0x0 END=0x0029 PROTECTED CODEPAGE NAME=page START=0x002A END=0x7FF7 CODEPAGE NAME=config START=0x7FF8 END=0x7FFD PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF 幷且將主程序的中斷地址也改變了,如下: #pragma code high_vector=0x0008 下載了這個程序,還是不能正常運行,我想知道我這樣改是否正確?謝謝大家的幫助^_^
發表於: 2007/12/10 10:12
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
很感謝版主關注我的問題,這個問題我已經想了好久了。
我想問一下版主,我在source files中添加了C:\MCC18\src\traditional\startup中的c018i.c文件編譯后出現了以下錯誤Error - section '_entry_scn' type is non-overlay and absolute but occurs in more than one input file. 我怎麽在source files中添加c018i.c文件呢。 我的LKR檔裡只有18f85j10i.lkr,因爲我用的是ICD2調試,沒有您說得FILE c018i.o 的檔案,所以我不知道怎麽删除,您說得“前面加入 // File. c018i.0 的方式處理”,我也不是很明白。 請版主能够指點一下,非常感謝!
發表於: 2007/12/8 10:36
|
|||
|
Re: 用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
版主
|
注意一下,你所修改的是 c018i.c 的檔案,你必須將修改過的 c018i.c 加到 project 裡的 source code 把它當作程式來看。更重要的是你必須將 LKR 檔裡的 FILE c018i.o 的檔案從 LKR 檔裡暫時刪除。可以在前面加入 // File. c018i.0 的方式處理。
發表於: 2007/12/8 9:08
|
|||
|
用MCCP18怎樣使程序從0x100地址開始編譯,謝謝大家
|
||||
---|---|---|---|---|
新會員
|
之前用PICC寫bootloader函數時,可以通過設定Specify offset for ROM確定函數的起始地址,但用MCCP18后我不知道怎麽設定起始地址,我只知道可以在c018i.c中改變_entry_scn的起始地址來改變復位地址,但是改變以後從hex文件看,0x100地址之前還是編譯了程序,我迫切想知道怎麽能做到程序從0x0100地址開始,這個問題我已經研究了好久了也沒有結果。謝謝大家!
#pragma code _entry_scn=0x000100 void _entry (void) { _asm goto _startup _endasm } #pragma code _startup_scn
發表於: 2007/12/7 14:25
|
|||
|