會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC16F1939 程式編譯問題
新會員
註冊日期:
2016/05/01 15:12
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 24
離線
各位先進大家好,

小弟我在使用 PIC16F1939撰寫程式時,其環境設定如下:

__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);

__CONFIG(WRT_OFF & VCAPEN_OFF & PLLEN_ON & STVREN_OFF & BORV_LO & LVP_OFF);

起初一切正常,但每當程式撰寫的長度大於一定行數時,在進行編譯時總是會產生以下錯誤,

Error [1347] ; 0. can't find 0x885 words (0x885 withtotal) for psect "text900" in class "CODE" (largest unused contiguous range 0x800)

想請問該如何解決上述問題

3月21日 19:42:34
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 13899
等級: 72; EXP: 11
HP : 1066 / 1777
MP : 4633 / 67499
離線
這顆元件有 28KB (16KW) 的容量,你的程式並沒有超過。

請問在程式裡是否有特別指定程式位址 (使用 @ 的功能) 或有指定程式的節區大小?

3月22日 14:14:18
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
新會員
註冊日期:
2016/05/01 15:12
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 24
離線
首先感謝版大的回覆
但在程式裡,我並沒有使用任何指定程式位址或設定指定程式區間的動作....

3月22日 18:35:55
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 911
等級: 26; EXP: 92
HP : 0 / 648
MP : 303 / 18741
離線
for psect "text900" in class "CODE" (largest unused contiguous range 0x800)
用這個去推敲...

3月22日 19:42:42
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
初級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 28
等級: 4; EXP: 3
HP : 0 / 75
MP : 9 / 425
離線
引用:

jason680 寫道:
for psect "text900" in class "CODE" (largest unused contiguous range 0x800)
用這個去推敲...


從16F1939的規格書來看,Figure3-1 Program memory map,每個page大小是0x800.
程式碼如果被compiler判定為必須連成一塊,而那塊程式碼編出來的size又比0x800還大,是否會發生這種錯誤訊息呢?

不知道版主的程式碼長怎樣,但這種錯誤訊息應該是compiler找不到空間放入編譯後的機械碼。
我好奇實驗看看,果然,程式碼寫太長,除了不容易閱讀,compiler出現的錯誤訊息是類似的。
=====
以下是我的實驗簡述:
我選用device=16F1939, XC8 v1.38
複製出一些巢狀的for-loop,
編譯OK的簡略程式碼.
switch (k)
{
case 1:
NOP();
code_block1;
break;
case 2:
NOP();NOP();
code_block2:
break;
default:
break;
}

編譯ng的流程如下(如果code_blockX兩個不放入不同的case,編譯都會失敗)
switch (k)
{
case 1:
NOP();
break;
case 2:
NOP();NOP();
break;
default:
break;
}
code_block1;
code_block2:

錯誤碼如下:。
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_15" in class "CODE" (largest unused contiguous range 0x2A4)
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_16" in class "CODE" (largest unused contiguous range 0x2A4)
(908) exit status = 1
nbproject/Makefile-default.mk:157: recipe for target 'dist/default/production/16F1939-compile-test.X.production.hex' failed

3月22日 23:45:20
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 911
等級: 26; EXP: 92
HP : 0 / 648
MP : 303 / 18741
離線
引用:

argogee 寫道:

從16F1939的規格書來看,Figure3-1 Program memory map,每個page大小是0x800.
程式碼如果被compiler判定為必須連成一塊,而那塊程式碼編出來的size又比0x800還大,是否會發生這種錯誤訊息呢?

不知道版主的程式碼長怎樣,但這種錯誤訊息應該是compiler找不到空間放入編譯後的機械碼。
我好奇實驗看看,果然,程式碼寫太長,除了不容易閱讀,compiler出現的錯誤訊息是類似的。
=====
以下是我的實驗簡述:
我選用device=16F1939, XC8 v1.38
複製出一些巢狀的for-loop,
編譯OK的簡略程式碼.
switch (k)
{
case 1:
NOP();
code_block1;
break;
case 2:
NOP();NOP();
code_block2:
break;
default:
break;
}

編譯ng的流程如下(如果code_blockX兩個不放入不同的case,編譯都會失敗)
switch (k)
{
case 1:
NOP();
break;
case 2:
NOP();NOP();
break;
default:
break;
}
code_block1;
code_block2:

錯誤碼如下:。
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_15" in class "CODE" (largest unused contiguous range 0x2A4)
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_16" in class "CODE" (largest unused contiguous range 0x2A4)
(908) exit status = 1
nbproject/Makefile-default.mk:157: recipe for target 'dist/default/production/16F1939-compile-test.X.production.hex' failed


如果是這樣(連續空間問題)...
程式結構化(拆成副程式)應該可以解決...

3月23日 08:12:30
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
資深會員
註冊日期:
2006/02/10 09:49
所屬群組:
註冊會員
文章: 275
等級: 15; EXP: 51
HP : 0 / 362
MP : 91 / 11887
離線
引用:

..

編譯ng的流程如下(如果code_blockX兩個不放入不同的case,編譯都會失敗)
switch (k)
{
case 1:
NOP();
break;
case 2:
NOP();NOP();
break;
default:
break;
}
code_block1;
code_block2:

錯誤碼如下:。
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_15" in class "CODE" (largest unused contiguous range 0x2A4)
:0: error: (1347) can't find 0x2AE words (0x2ae withtotal) for psect "maintext_split_16" in class "CODE" (largest unused contiguous range 0x2A4)
(908) exit status = 1
nbproject/Makefile-default.mk:157: recipe for target 'dist/default/production/16F1939-compile-test.X.production.hex' failed

code_block2: <--- 有冒號 ?
是這個原因嗎?

3月23日 08:50:45
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
初級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 28
等級: 4; EXP: 3
HP : 0 / 75
MP : 9 / 425
離線
引用:

dginlon 寫道:
code_block2: <--- 有冒號 ?
是這個原因嗎?

是我keyin 錯誤。實際上是指一大塊程式碼。
不只ROM本身能容納的連續空間的大小有限制,RAM也是有限制。
如果同時需要幾個不小的陣列,有時候讓compiler自動安排,也會出現編譯錯誤,
我試過加入 @ ram_address; 來避開編譯錯誤。

我認為jason大說的沒錯,
適當地用副程式來切開原本連成一大塊的程式碼,應該可以解決這種編譯錯誤。
版主可以先把一塊程式碼 註解掉,然後編譯看看,不需幾分鐘,就可以確認,是不是程式碼太長造成的編譯錯誤。

3月23日 20:22:29
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 13899
等級: 72; EXP: 11
HP : 1066 / 1777
MP : 4633 / 67499
離線
你在程式中是否有較大的常數查表資料且又剛好在一個 Page (2KW)的間隔位址。

可以使用 @ 的節對定址宣告將查表資料設定在其它的 Page 的起始位址。

3月24日 11:49:31
轉換PDF檔 列印


Re: PIC16F1939 程式編譯問題
新會員
註冊日期:
2016/05/01 15:12
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 24
離線
感謝 jason680 及 argogee 的測試及回覆
我後來依照各位的建議將程式改為副程式的方式來編碼,就解決了上述的問題,
謝謝大家的幫忙!!!

3月27日 19:18:03
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088221 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project