會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
const char * Dpp1;
const char * Dpp2;

char Data1;
char Data2;

const char Word_10[10] =
{
0x46, 0xC2, 0x7F, 0x01, 0x33, 0x44, 0x80, 0x81, 0x43, 0xBA
};
void main(void)
{
while (1)
{
Dpp1=Word_10;
Data1=*Dpp1;

Dpp2=Word_10[5];
Data2=*Dpp2;
}
}

理論上執行完 Data1=0X46 Data2=0x44 但我使用icd4 debug 看數據
Data1=0 Data2=0 ;

以下是program memory 內容
我取
Dpp1=Word_10;
Data1=*Dpp1;
部分

1,921 00F00 4600
1,922 00F02 7FC2
1,923 00F04 3301
1,924 00F06 8044
1,925 00F08 4381


2,002 00FA2 6E2E MOVWF Dpp1, ACCESS
2,003 00FA4 0E0F MOVLW 0xF
2,004 00FA6 6E2F MOVWF 0x2F, ACCESS
2,005 00FA8 502E MOVF Dpp1, W, ACCESS
2,006 00FAA 102F IORWF 0x2F, W, ACCESS
2,007 00FAC A4D8 BTFSS STATUS, 2, ACCESS
2,008 00FAE 0E00 MOVLW 0x0
2,009 00FB0 6E30 MOVWF 0x30, ACCESS
2,010 00FB2 C02E MOVFF Dpp1, TBLPTR
2,011 00FB4 FFF6 NOP
2,012 00FB6 C02F MOVFF 0x2F, TBLPTRH
2,013 00FB8 FFF7 NOP
2,014 00FBA C030 MOVFF 0x30, TBLPTRU
2,015 00FBC FFF8 NOP
2,016 00FBE 0008 TBLRD*
2,017 00FC0 CFF5 MOVFF TABLAT, Data1
2,018 00FC2 F032 NOP

看程序沒有甚麼問題
在執行TBLRD*前
TBLPTR =0x0F01
在執行完TBLRD*後 TABLAT 內的值 永遠是0x0

我已經想破頭了 用pic18f2320 測試這段程式讀出來的值是正常的
但是PIC48F47K40 卻不行
神奇的是 我用simulator 模擬去跑得到的值卻是對的
是不是我有甚麼東西沒設定到 導致無法讀取指標的值

我的configuration bit 如下
我有試過 更改EBTR0~7 沒用
誰能救救我


#pragma config FEXTOSC = OFF
#pragma config RSTOSC = HFINTOSC_64MHZ


#pragma config CLKOUTEN = OFF
#pragma config CSWEN = ON
#pragma config FCMEN = ON

// CONFIG2L
#pragma config MCLRE = EXTMCLR
#pragma config PWRTE = OFF
#pragma config LPBOREN = OFF
#pragma config BOREN = SBORDIS
// CONFIG2H
#pragma config BORV = VBOR_2P45
#pragma config ZCD = OFF
#pragma config PPS1WAY = ON
#pragma config STVREN = ON
#pragma config DEBUG = OFF
#pragma config XINST = OFF

// CONFIG3L
#pragma config WDTCPS = WDTCPS_31
#pragma config WDTE = OFF

// CONFIG3H
#pragma config WDTCWS = WDTCWS_7
#pragma config WDTCCS = SC

// CONFIG4L
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRT4 = OFF
#pragma config WRT5 = OFF
#pragma config WRT6 = OFF
#pragma config WRT7 = OFF

// CONFIG4H
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config SCANE = ON
#pragma config LVP = ON
// CONFIG5L
#pragma config CP = OFF
#pragma config CPD = OFF

// CONFIG5H

// CONFIG6L
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTR4 = OFF
#pragma config EBTR5 = OFF
#pragma config EBTR6 = OFF
#pragma config EBTR7 = OFF

// CONFIG6H
#pragma config EBTRB = OFF

2月02日 20:43:20
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 203
等級: 13; EXP: 28
HP : 0 / 307
MP : 67 / 5570
離線
Dpp1=Word_10;
Data1=*Dpp1;

Dpp2=Word_10[5];
Data2=*Dpp2;

上面你的指標使用應該有些問題,你指標指向陣列可以用Dpp1 = Word_10;或者Dpp1 = &Word_10[0],可是你Dpp2 = Word_10[5]的意思是將陣列的第5個元素儲存的內容指定給Dpp2,Dpp2存的不是位址而是常數,可以從這邊思考一下是否有問題!

2月05日 09:33:02
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
你好 感謝你的回答 其實主要的用途 用於讀取用於資料要寫入圖形式LCD
Dpp2 的部分是後來測試時加上的 這個寫法好像是有問題的
但Dpp1=Word_10; Data1=*Dpp1; 寫法因該是沒有問題(因為原來pic18f2320測試可以 因為程式空間太小 換成後PIC18F47K40 才出現這問題) 為什麼讀取出Data1來會是0呢?
還有甚麼可能性呢?

2月05日 17:36:06
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 203
等級: 13; EXP: 28
HP : 0 / 307
MP : 67 / 5570
離線
撇除MCU架構之外,你可以了解一下
http://xyz.cinc.biz/2013/08/c-const.html,
其他的我也不確定有甚麼問題,你何不用軟體模擬看看變數是否正確呢?

2月06日 13:14:11
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14388
等級: 72; EXP: 88
HP : 1078 / 1797
MP : 4796 / 74676
離線
善用一下 Watch 功能,只要將變數或陣列變數用拖曳的方式拉到 Watch Window 即可。用 single Step 的方式 + 斷點設定方式去分析一下。

Watch Window 可以監看所有的變數,Const Table,Union, struct ...等資料。

先選用軟體模擬的工具來除錯會比較簡單的。

2月06日 13:57:39
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
你好 圖片中是我測試3個不同零件的結果
18f2320 結果是正確的 18f27k40 18f47k40 解果都是錯誤的

使用 DEGUB 看Watches Data1 Data2 Data3 的值
18f2320 執行完(第一張圖)
data1=0X46
data2=0XC2
data3=0X7F 正確

但18f27k40 18f47k40 執行完(第2.3張圖)
data1=0X00
data2=0X00
data3=0X00 錯誤

有使用過18f27k40跑模擬軟體 跑出來是正確的值

想請問是不是 18f27k40 18f47k40 在使用 table read 功能時要先設定甚麼嗎?
不然 一模一樣的 程式18f2320 可以 ,18f27k40 18f47k40卻不行?
有人有用過 18f27k40 18f47k40 嗎 都沒有遇到這些問題嗎?
拜託各位高手給我解答

附加檔案:



jpg  2320.jpg (686.07 KB)
6412_5a7982df09a9d.jpg 2560X1440 px

jpg  27k40.jpg (730.49 KB)
6412_5a7982e65360b.jpg 2560X1440 px

jpg  47k40.jpg (679.04 KB)
6412_5a7982ec482bd.jpg 2560X1440 px

2月06日 18:32:33

benson7404 於 2018年02月06日 18:49:56
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
http://www.microchip.com.tw/modules/n ... ewtopic.php?post_id=73182
我發現有人的問題跟我一模一樣 這是此系列ic的bug嗎

有人手邊有18f k40系列ic可以幫我測試看看嗎?

2月07日 23:22:37
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 203
等級: 13; EXP: 28
HP : 0 / 307
MP : 67 / 5570
離線
試了一下,沒有發生你所說的問題喔!

附加檔案:



jpg  1.jpg (337.85 KB)
9227_5a7b99ae6d645.jpg 1920X1032 px

2月08日 08:28:56
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
你好感謝你的回覆 但用模擬的 我這也沒問題 要實際上IC測試DEBUG 才有問題 你有IC嗎可以幫我試看看嗎?

2月08日 10:07:14
轉換PDF檔 列印


Re: PIC48F47K40 指標取值問題
新會員
註冊日期:
2009/12/18 23:53
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 378
離線
找到問題了 真的是此系列IC 的BUG 勘誤表中提到

3. Module: PIC18 Core
3.1 TBLRD requires NVMREG value to point to
appropriate memory
The affected silicon revisions of the PIC18FXXK40
devices improperly require the NVMREG<1:0>
bits in the NVMCON register to be set for TBLRD
access of the various memory regions. The issue
is most apparent in compiled C programs when the
user defines a const type and the compiler uses
TBLRD instructions to retrieve the data from program
Flash memory (PFM). The issue is also
apparent when the user defines an array in RAM
for which the complier creates start-up code, executed
before main(), that uses TBLRD instructions
to initialize RAM from PFM.
Work around
Assembly code:
Set the NVMREG<1:0> bits to select the
appropriate memory region before executing
TBLRD instructions.
C code:
Create an assembly file named powerup.as and
include this file with the other files in the project.
This file will change the NVMREG<1:0> bits to
point to program Flash before any code is
executed.
Contents of the power-up.as file:

#include <xc.inc>
GLOBAL powerup, start
PSECT powerup, class=CODE, delta=1,
reloc=2
powerup:
BSF NVMCON1, 7
GOTO start
end

If there is a need to change the NVMREG<1:0>
value to anything other than ‘10’ and the Interrupt
Service Routine uses constants or literal strings,
then interrupts must be disabled before the
change and restored to ‘10’ before interrupts are
enabled.


加上power-up.as 檔案 解決

累人的東西 不知道下次還會遇到設麼BUG
為甚麼明知有這問題 也不改善 這就是MICROCHIP

2月08日 10:26:22
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


搜尋
Microchip連結

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