• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users






Re: 進中斷後,其它變數值竟遭修改問題
#8
中級會員
中級會員


查看用戶資訊
沒錯,
因為小弟的主程式中有處理大量的四則運算式,而在中斷
內也有四則運算要處理且又無法避免進中斷設flag等出中
斷再處理的原則,因此一直會出現主程式中的某些 RAM值
被偷偷也地修改,這情況小弟是從關閉TIMER4的中斷及拉
長TIMER4的中斷時間,發現只要關閉就正常,若是拉長進
中斷的時間及減少進中斷的次數,這問題就比較不會發生
(但最後還是發生),因此才來請教高手,目前的處理方式
就是在 LOW_ISR 加入版主的建議如下:
#pragma interruptlow isr_low nosave=section(".tmpdata")
void isr_low(void)
{
W_temp1 = WREG;
BSR_temp1 = BSR;
ST_temp1 = STATUS;
INTCONbits.GIE = 1;
//.......................//
// TIMER 4 功能程式
//.......................//
STATUS = ST_temp1;
BSR = BSR_temp1;
WREG = W_temp1;
INTCONbits.PEIE = 1;
}

其它不變,這樣就解決了這個問題了~~


發表於: 2008/4/21 15:37
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#7
版主
版主


查看用戶資訊
恭喜! 問題解決了。
寢問是 Temp Data context Saving 的問題導致的錯誤嗎? 分享一下你的心得。

發表於: 2008/4/21 15:22
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#6
中級會員
中級會員


查看用戶資訊
哈哈,搞定了

感謝版主提供資訊!!

雖然知道版主的意思,但卻一直用不上來(一直出現error訊息)

之後去找了 "C18 C compiler User's Guide" 終於知道它的用法

,經過測驗後之前的問題不再出現了~爽

這樣小弟負責的部份一定可以在working sample階段前給客戶

終於把這個問題解決了,再次感謝版主~感恩~


發表於: 2008/4/21 15:17
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#5
版主
版主


查看用戶資訊
加在 #pragma interrupu 中斷服務程式的函數宣告。

發表於: 2008/4/21 14:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#4
中級會員
中級會員


查看用戶資訊
感謝版主的回應:

首先先回應版主的問題"

// 與其它 MCU 通訊程式
不知道這段程式要花多久時間?
A:大概40us

可不可以在中斷裡只要設個 Time Out 的旗號,要要花較多時間執行的能刻意在主程式看到此 Time Out 旗號後交由主程式執行。
A:這個方式小弟有想過,但不可行,主要原因是與其它 MCU 通訊優先權是最大的不可LOSE,而TIMER4 200us中斷也是必要的,因為一定要在每200us內完成填值工作,若移至主程式的話處理速度變為10ms處理一次會來不及....

另外對於版主上方所提供的方式,小弟有點不解:
是否只要將上方紅色文字描述加入程式中即可?
還是加在*.LKR 中?

感謝!!



發表於: 2008/4/21 11:36
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#3
版主
版主


查看用戶資訊
// 與其它 MCU 通訊程式
不知道這段程式要花多久時間?
可不可以在中斷裡只要設個 Time Out 的旗號,要要花較多時間執行的能刻意在主程式看到此 Time Out 旗號後交由主程式執行。

發表於: 2008/4/21 10:40
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 進中斷後,其它變數值竟遭修改問題
#2
版主
版主


查看用戶資訊
其實這個問題已經很多客戶都有反應過,因為 Temp Data 的關係。因為在主程式下因 C 在叫用一些運算式時會使用到一些暫時儲存的 RAM ( temp data) 如果這時發生中斷,且中斷程式又做這些數學的計算時也會使用到相同的 Temp data 區域,所以原先的資料就被壞了。
所以中斷程式裡有用用到計算時就要特別小心,C18 裡有提供此 temp data 的 context saving 的功能 (紅色部分)。

User 自行定義的變數 :
#pragma interrupt high_interrupt_service_routine save=myint 儲存自訂的 myint 變數
pragma interrupt high_interrupt_service_routine save=section("mydata") 儲存自訂變數節區 mydata 的變數

#pragma interrupt high_interrupt_service_routine nosave=section(".tmpdata") 儲存 temp data 區的資料


發表於: 2008/4/21 10:30
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


進中斷後,其它變數值竟遭修改問題
#1
中級會員
中級會員


查看用戶資訊
小弟目前遇到一個很難 Debug 的問題 ,想請教大家
因為程式太龐大故無法將程式貼上來... 只能以基本
的做法來與各位高手討論;先說明小弟的平台如下:

1.使用MCU為18F87J10
2.使用ICD2做DEBUG
3.程式使用C語言撰寫
4.使用MPLAB V8.0
5.使用C18的COMPILER V3.16; LINKER V4.16
6.編譯參數為:-Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
(無使用最佳化處理)


小弟的程式架構大概是這樣子的 :

Main loop為10ms一直重覆在執行一個Array1[256]的
填值工作,當然這些值是有經過加、減、乘、除的處
理,而在這main loop的 10ms中會有50次的TIMER4中
斷 (目前規劃在LOW ISR),每次間隔 200us,每次進
中斷後在中斷內執行另一個Array2[64]填值工作, 執行
時間大約 120us,剩餘80us 的時間給main loop做...
另外HIGH ISR的部份也有使用到外部中斷與其它 MCU
做通訊....

現在問題來了:

只要這個LOW ISR (TIMER4) 200us的中斷有被執行,
且程式跑了一段時間(每次時間都不同)在 Main LOOP
中的 Array1[256]:0~255的位址有時就會被干擾,也
就是有時 Array1[256]其中某幾個不固定的位址內容
值會被 "偷偷地" 修改;如果我把TIMER4關閉的話,
這個Array1[256]內容值就會正常...

在中斷裡HIGH ISR 及 LOW ISR小弟已有將
WREG
BSR
STATUS
甚至處理四則運算的暫存器:
AARGB0~3,BARGB0~3,REMB0~4
這幾個都有做了PUSH及POP的temp動作;
如下程式概述:

void isr_high(void)
{
W_temp0 = WREG;
BSR_temp0 = BSR;
ST_temp0 = STATUS;
hPW0 = __AARGB0;
hPW1 = __AARGB1;
hPW2 = __AARGB2;
hPW3 = __AARGB3;
hPX0 = __BARGB0;
hPX1 = __BARGB1;
hPX2 = __BARGB2;
hPX3 = __BARGB3;
hPY0 = __REMB0;
hPY1 = __REMB1;
hPY2 = __REMB2;
hPY3 = __REMB3;
//.......................//
// 與其它 MCU 通訊程式
//.......................//
INTCONbits.GIE = 1;
__REMB3 = hPY3;
__REMB2 = hPY2;
__REMB1 = hPY1;
__REMB0 = hPY0;
__BARGB3 = hPX3;
__BARGB2 = hPX2;
__BARGB1 = hPX1;
__BARGB0 = hPX0;
__AARGB3 = hPW3;
__AARGB2 = hPW2;
__AARGB1 = hPW1;
__AARGB0 = hPW0;
STATUS = ST_temp0;
BSR = BSR_temp0;
WREG = W_temp0;
}


void isr_low(void)
{
W_temp1 = WREG;
BSR_temp1 = BSR;
ST_temp1 = STATUS;
lPW0 = __AARGB0;
lPW1 = __AARGB1;
lPW2 = __AARGB2;
lPW3 = __AARGB3;
lPX0 = __BARGB0;
lPX1 = __BARGB1;
lPX2 = __BARGB2;
lPX3 = __BARGB3;
lPY0 = __REMB0;
lPY1 = __REMB1;
lPY2 = __REMB2;
lPY3 = __REMB3;
INTCONbits.GIE = 1;
//.......................//
// TIMER 4 功能程式
//.......................//
__REMB3 = lPY3;
__REMB2 = lPY2;
__REMB1 = lPY1;
__REMB0 = lPY0;
__BARGB3 = lPX3;
__BARGB2 = lPX2;
__BARGB1 = lPX1;
__BARGB0 = lPX0;
__AARGB3 = lPW3;
__AARGB2 = lPW2;
__AARGB1 = lPW1;
__AARGB0 = lPW0;
STATUS = ST_temp1;
BSR = BSR_temp1;
WREG = W_temp1;
INTCONbits.PEIE = 1;
}

但結果還是無法避免 Array1[256]遭到修改的命運,
嚴格說來小弟認為不只是Array1[256]在其它RAM的部
份應該也有遭到修改...

Array1[256]的位址使用強制定址在BANK 8上,如下
宣告:
#pragma udata gpr8 = 0x800
volatile uchar Array1[256];
#pragma udata

即使變更到其它的 BANK 也是沒用...

而在 *.LKR FILE 中也把該BANK宣告成 PROTECTED

DATABANK NAME=gpr8 START=0x800 END=0x8FF PROTECTED

還是無法克服該問題...


由於這問題並非一下子就呈現,但大約間隔個幾秒就出
現所以難DEBUG....基本上 MCU只要在進中斷前TEMP之前
正在處理的暫存器後,等執行完中斷再POP回來應該就不
會錯了才對...但很明顯地在小弟的程式中會有這樣的問
題;有那位高手能夠指導小弟一下,感激不盡!!



發表於: 2008/4/21 9:20
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------