會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


18f47k40 陣列宣告問題
新會員
註冊日期:
2016/05/16 15:03
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 52
離線
我在使用18F47K40時,遇到一些陣列的問題。
使用直接宣告的方式,燒錄至IC後,迴圈不會執行,
而使用分開宣告的方式,燒錄至IC就可以正常運作,
軟體版本是IDEv3.45,Compiler是XC8 v1.38,
這是我測試之後發現有這問題,實際上的陣列非常大,
所以沒辦法一個一個KEY IN,
想請問各位先進是否有辦法解決這個問題,謝謝。

void main(void)
{
// Initialize the device
SYSTEM_Initialize();

while (1)
{

/*
//這方式可以正常運作
uint8_t test[4];

test[0] = 5;
test[1] = 10;
test[2] = 15;
test[3] = 20;*/

uint8_t test[4] = {5, 10, 15, 20};//這方式燒錄後會錯誤
for (int i = 0; i < test[0]; i++)
{
E_SetHigh();
E_SetLow();

}
}
}

6月26日 16:11:19
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
高級會員
註冊日期:
2014/12/02 11:55
所屬群組:
註冊會員
文章: 82
等級: 8; EXP: 0
HP : 0 / 175
MP : 27 / 1521
離線
有使用到中斷或者是和你陣列的相關函數在中斷內執行嗎?

6月27日 08:05:50
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
新會員
註冊日期:
2016/05/16 15:03
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 52
離線
我沒有使用中斷,目前的狀況是,單純只有這一小段就有問題了。

6月27日 08:33:45
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1547
等級: 33; EXP: 44
HP : 162 / 811
MP : 515 / 17527
離線
推敲了一下程式, 架構上可行,
但有可能是最佳化搞的鬼,
如果您有開啟最佳化設定,
建議先嘗試加上volatile
再測試看看

volatile uint8_t test[4] = {5, 10, 15, 20};


另外, 友善體醒,
區域變數是用堆疊傳遞的,
所以宣告大陣列會造成函式的響應時間變慢喔!

6月27日 10:36:13
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
新會員
註冊日期:
2016/05/16 15:03
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 52
離線
非常感謝您的幫忙,
不過經測試後,還是沒辦法正常運行,
想請問最佳化可已關閉嗎?
是選擇FREE和PRO那邊調整嗎,
如果是的話我測試後沒有用,
附檔是我目前所使用的測試程式,
只有用MCC將頻率設定為64MHZ,
第21隻腳設定為E腳而已。

我把現在的狀況說明詳細一點,希望有點幫助,
我先前是用18F46K22寫了一個LCD的程式,
LCD的字形是用 const uint8_t 的方式儲存的,
因為空間不夠的原故,因此我換成47K40這IC,
換了之後發現LCD沒反應,查了許久後發現是陣列宣告問題,
只要用那種方式宣告陣列,陣列中的數值都是0。

附加檔案:


rar test.X.rar 大小: 317.57 KB; 下載次數: 35

6月27日 11:14:10

a0135600 於 2017年06月27日 11:36:58
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
高級會員
註冊日期:
2014/12/02 11:55
所屬群組:
註冊會員
文章: 82
等級: 8; EXP: 0
HP : 0 / 175
MP : 27 / 1521
離線
引用:

a0135600 寫道:
非常感謝您的幫忙,
不過經測試後,還是沒辦法正常運行,
想請問最佳化可已關閉嗎?
是選擇FREE和PRO那邊調整嗎,
如果是的話我測試後沒有用,
附檔是我目前所使用的測試程式,
只有用MCC將頻率設定為64MHZ,
第21隻腳設定為E腳而已。

我把現在的狀況說明詳細一點,希望有點幫助,
我先前是用18F46K22寫了一個LCD的程式,
LCD的字形是用 const uint8_t 的方式儲存的,
因為空間不夠的原故,因此我換成47K40這IC,
換了之後發現LCD沒反應,查了許久後發現是陣列宣告問題,
只要用那種方式宣告陣列,陣列中的數值都是0。


檔案我解壓縮失敗,不過你要不要試試看把你LCD字形的那串陣列強制定址從Flash某個地方開始存放,然後編譯程式後直接去看hex檔案,看看是不是真的有被放進去

6月27日 12:34:09
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
新會員
註冊日期:
2016/05/16 15:03
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 52
離線
謝謝您的提醒,我先將新上傳的RAR放這裡,
測試結果等等我再試驗看看。

上傳後檔案好像一樣無法解壓,
下面是google雲端的網址:
https://drive.google.com/open?id=0B__nkspzCHfIQnFKd0FIVF9HRDg

6月27日 13:14:50

a0135600 於 2017年06月27日 13:54:35
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1547
等級: 33; EXP: 44
HP : 162 / 811
MP : 515 / 17527
離線
測試了您的程式, 發現了幾個可疑的點, 加上您有提到const.
我大概猜測了問題點..

先比較以下宣告

//ex1
void main(void)
{
    
unsigned char buf[4]={1,2,3,4};
    while(
1);
}

//ex2
unsigned char buf[4]={1,2,3,4};
void main(void)
{
    while(
1);
}

ex1跟ex2的差異在於區域變數與全域變數的差異,
兩者賦值的時機也不同, 但都不會有賦值不正確的問題.


但如果是const, 狀況就不一樣了

//ex3
void main(void)
{
    const
unsigned char buf[4]={1,2,3,4};
    while(
1);
}

//ex4
const unsigned char buf[4]={1,2,3,4};
void main(void)
{
    while(
1);
}


MCU的特有屬性, 宣告const的變數會放入flash中,
這樣一來, 將const定義成區域變數, 就會變成災難.....

6月27日 14:12:04
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
新會員
註冊日期:
2016/05/16 15:03
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 52
離線
不好意思讓您誤會了,
我CONST是使用於全域變數中,
而上面那範例,是指因為我發現陣列都沒數值,
想說用示波器去量PING腳來看他是否有動作,
方便才會這樣打,如果把它變為全域變數,
目前測試過還是數值為0,

更正一下,
使用const uint8_t test[4] = {5, 10, 15, 20};
這種寫法,在Program Memory看到有數值,
但就是不會運作。

6月27日 14:17:56

a0135600 於 2017年06月27日 14:39:07
轉換PDF檔 列印


Re: 18f47k40 陣列宣告問題
高級會員
註冊日期:
2014/12/02 11:55
所屬群組:
註冊會員
文章: 82
等級: 8; EXP: 0
HP : 0 / 175
MP : 27 / 1521
離線
引用:

a0135600 寫道:
不好意思讓您誤會了,
我CONST是使用於全域變數中,
而上面那範例,是指因為我發現陣列都沒數值,
想說用示波器去量PING腳來看他是否有動作,
方便才會這樣打,如果把它變為全域變數,
目前測試過還是數值為0,

更正一下,
使用const uint8_t test[4] = {5, 10, 15, 20};
這種寫法,在Program Memory看到有數值,
但就是不會運作。


原本有寫站內信給你,想說直接聊看看可能的問題

會不會是for迴圈的i值發生異常,被更改了導致迴圈進不去?
有試過debug模式設斷點嗎

6月27日 14:43:28
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


搜尋
Microchip連結

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