會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


near 指令使用(Access Bank)
中級會員
註冊日期:
2012/07/10 09:35
所屬群組:
註冊會員
文章: 56
等級: 6; EXP: 34
HP : 0 / 133
MP : 18 / 3082
離線
請問各位前輩:

我目前採用C18, P18F45K80

#pragma idata access My_RAM
near ....
....
....
(變數宣告)
....
#pragma idata

目前透過MPLAB Watch 監看Access Bank已使用到的位址為:
022h~ 041h, 當我需要再新增下一個存在Access Bank的變數,編譯後得知如以下錯誤,請問是否為程式內有其他地方已占用剩下的Access Bank的位置,麻煩請指點, 謝謝


相關圖片,資料如下 .zip

附加檔案:


zip question.zip 大小: 182.17 KB; 下載次數: 27

jpg  error.JPG (70.27 KB)
9632_5e3383a8042bd.jpg 1139X192 px

1月31日 09:33:19
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
在線上
udata RAM 位址的宣告有 near (只擺放到 Access Bank) 及 不指定及強制指定RAM 區域三種主要方式。( idata 的宣告是有初始值的,一般在寫組語時不太會用到) 建議下載教育訓練光碟下的 " RELOCASM Re-Locatable MPASM" 的教材來了解一下組譯器的虛指令的用法。


例一: 最簡單的使用方式(由MPLINK 自動安排到GPRn 的位址)
UDATA
Var1 RES 1
Double RES 2
例二: 自定位址方式( 由MPLINK 安排到0x20 的起始位址)
UDATA 0x20
Var1 RES 1
Double RES 2


至於組譯不過的是中斷位址有衝突,須將主程式的起點利用"CODE – 程式節區位址的宣告" 來宣告程式執行的為只。

1月31日 12:07:00
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
在線上
也請參考一下 MPASM 所提供各個元件組語的套用範例:

C:\Program Files (x86)\Microchip\MPASM Suite\Template\Object


;******************************************************************************
;                                                                             *
;   
This file is a basic code template for code generation on the             *
;   
PIC18F45K20. This file contains the basic code building blocks to build   *
;   
upon.                                                                     *
;                                                                             *
;   
Refer to the MPASM User's Guide for additional information on features    *
;   of the assembler.                                                         *
;                                                                             *
;   Refer to the respective data sheet for additional information on the      *
;   instruction set.                                                          *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Filename:         xxx.asm                                                *
;    Date:                                                                    *
;    File Version:                                                            *
;    Author:                                                                  *
;    Company:                                                                 *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Files Required:                                                          *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Notes:                                                                   *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Revision History:                                                        *
;                                                                             *
;******************************************************************************

;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------

     LIST      P=PIC18F45K20          ; list directive to define processor
     #INCLUDE <P18F45K20.INC>         ; processor specific variable definitions

;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The '
CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file.  See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------

     CONFIG FOSC = INTIO7, FCMEN = OFF, IESO = OFF, PWRT = OFF, BOREN = OFF
     CONFIG BORV = 18, WDTEN = OFF, WDTPS = 1, MCLRE = ON, HFOFST = ON
     CONFIG LPT1OSC = OFF, PBADEN = OFF, CCP2MX = PORTC, STVREN = OFF
     CONFIG LVP = OFF,  XINST = OFF, CP0 = OFF, CP1 = OFF, CP2 = OFF
     CONFIG CP3 = OFF, CPB = OFF, CPD = OFF, WRT0 = OFF, WRT1 = OFF
     CONFIG WRT2 = OFF, WRT3 = OFF, WRTB = OFF, WRTC = OFF, WRTD = OFF
     CONFIG EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
     CONFIG EBTRB = OFF

;------------------------------------------------------------------------------
;
; VARIABLE DEFINITIONS
;
;------------------------------------------------------------------------------

    CBLOCK 0x60 ; Sample GPR variable register allocations
        MYVAR1  ; user variable at address 0x60
        MYVAR2  ; user variable at address 0x61
        MYVAR3  ; user variable at address 0x62
    ENDC

W_TEMP         EQU        0x000  ; w register for context saving (ACCESS)
STATUS_TEMP    EQU        0x001  ; status used for context saving
BSR_TEMP       EQU        0x002  ; bank select used for ISR context saving

;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 18F45K20 has non-volatile EEPROM starting at 0xF00000
;
;------------------------------------------------------------------------------

DATAEE    ORG  0xF00000 ; Starting address for EEPROM for 18F45K20

    DE    "MCHP"        ; Place '
M' 'C' 'H' 'P' at address 0,1,2,3

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RES_VECT  ORG     0x0000            ; processor reset vector
          GOTO    START             ; go to beginning of program

;------------------------------------------------------------------------------
; HIGH PRIORITY INTERRUPT VECTOR
;------------------------------------------------------------------------------

ISRH      ORG     0x0008

          ; Run the High Priority Interrupt Service Routine
          GOTO    HIGH_ISR             

;------------------------------------------------------------------------------
; LOW PRIORITY INTERRUPT VECTOR
;------------------------------------------------------------------------------

ISRL      ORG     0x0018
          
          ; Run the High Priority Interrupt Service Routine
          GOTO    LOW_ISR             

;------------------------------------------------------------------------------
; HIGH PRIORITY INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

HIGH_ISR  

          ; Insert High Priority ISR Here

          RETFIE  FAST

;------------------------------------------------------------------------------
; LOW PRIORITY INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

LOW_ISR
          ; Context Saving for Low ISR
          MOVWF   W_TEMP              ; save W register
          MOVFF   STATUS, STATUS_TEMP ; save status register
          MOVFF   BSR, BSR_TEMP       ; save bankselect register

          ; Insert Low Priority ISR Here

          ; Context Saving for Low ISR
          MOVFF   BSR_TEMP, BSR       ; restore bankselect register
          MOVF    W_TEMP, W           ; restore W register
          MOVFF   STATUS_TEMP, STATUS ; restore status register
          RETFIE

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

START

          ; Insert User Program Here

          GOTO $                      ; loop program counter

          END

1月31日 12:14:27
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
中級會員
註冊日期:
2012/07/10 09:35
所屬群組:
註冊會員
文章: 56
等級: 6; EXP: 34
HP : 0 / 133
MP : 18 / 3082
離線
版主Ryang您好:

現在似乎因我所宣告在Access Bank的變數,與我的高優先權中斷位址(0x08)有所衝突,試問我將如何修改?

剛剛有嘗試將主程式,利用#pragma code 定義其主程式起始位址,但仍然沒有幫助,謝謝

1月31日 13:32:45
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
在線上
抱歉一時眼拙沒看清楚是使用 C18 的編譯器。

建議如果可以建議使用 XC8 來取代 C18。因為 C18 已停止更新取而代之的是 XC8。

使用 C18 的話,建議參考一下 "W401 v3 MPLAB C18 C Compiler Workshop" 教材的第二天課程。在第五章節裡有詳細說明 RAM 的資料擺放設定及中斷的使用設定。

如果改用 XC8 後,可以參考一下教育訓練 "XC8T v1.0 New!" 的教材,裡面有詳細的說明 XC8 的使用。
範例程式可以參考 "PIC101 X IDE & MCC & XC8 的綜合基礎課程 New!" 的教材,裡面有使用 MCC 的範例與一般的設定比較。

我的建議是改用 XC8 compiler, 如果還是使用 C18 且一直無法翻譯成功的話。將專案檔整個 zip 後貼上來幫你改一下。

1月31日 14:06:26
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
中級會員
註冊日期:
2012/07/10 09:35
所屬群組:
註冊會員
文章: 56
等級: 6; EXP: 34
HP : 0 / 133
MP : 18 / 3082
離線
版主Ryang您好:

您所建議參考的教材,我有仔細詳讀,當時也是按照新關內容撰寫。關於最早的問題,我把程式一一註解掉,最後發現是一段運算如:(A = B*a + C*b + D*(c-d)), 我將其修改後,有改善上述原先問題。但仍然發現000h~05Fh 的Access RAM 無法全部都能宣告, 約使用到000h~03Fh 的Access RAM 仍出現上述程式記憶體衝突的異常。

請問,組譯器是否會因為程式的撰寫內容,會先預置部分的Access RAM 的空間留給相關程式運算使用? 謝謝

1月31日 20:20:19
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
中級會員
註冊日期:
2012/07/10 09:35
所屬群組:
註冊會員
文章: 56
等級: 6; EXP: 34
HP : 0 / 133
MP : 18 / 3082
離線
版主Ryang您好:

我有將類似問題重現,以簡易的指令方式,如下附件給您確認,再麻煩您指導,謝謝

附加檔案:


zip test.zip 大小: 6.61 KB; 下載次數: 37

1月31日 21:33:40
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
在線上
剛下載你的程式並用 MPLAB v8.92 + C18 重新編議程式出現錯誤原因是在 Linker 那媢L不去。主要的問題是因為 C18 有用到 "Temp_Data" 作為乘法的暫存區,而這暫存區是要使用到 Access Bank 的 RAM。

因為你在程式裡的陣列宣告使用全部的 Access RAM,所以 Linker 無法安排 "Temp_Data" 在 Access RAM 的位址,所以出現了錯誤的訊息。

貼圖是修改過陣列大小後編譯成功的圖片。

Access RAM 一般建議使用在中斷函數所使用的變數及一些程式裡常常會用到或用來傳遞函數間所使用到的變數傳遞 (像參數)。一般陣列所使用到的陣列內容不會放在 Access RAM 裡,因為陣列的存取幾乎是用 FSR0 的指標做索引,放在哪一區的 RAM 其資料存取的速度都是一樣的。

附加檔案:



jpg  擷取.JPG (112.09 KB)
16_5e379de59cfd1.jpg 1102X706 px

2月03日 12:13:25
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
在線上
將陣列宣告起始位址從 0x100 開始,拿掉 near 的宣告後重新編譯。陣列會從 0x100 開始擺放資料。如貼圖所示。

附加檔案:



jpg  擷取.JPG (123.42 KB)
16_5e379f0c4fa50.jpg 1033X728 px

2月03日 12:18:20
轉換PDF檔 列印


Re: near 指令使用(Access Bank)
中級會員
註冊日期:
2012/07/10 09:35
所屬群組:
註冊會員
文章: 56
等級: 6; EXP: 34
HP : 0 / 133
MP : 18 / 3082
離線
版主Ryang您好:

我明白了,我宣告陣列為的是方便重現此相關異常問題。也謝謝您仔細的說明以及相關建議。

我能否再額外請問,有沒有方法可以預先,或判定到我程式中哪些部分,會使用到"Temp_Data" 作為暫存區,而佔用Access Bank 的 RAM。 謝謝指導

2月03日 18:21:40
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project