|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
省電模式被定時器中斷喚醒,中斷結束后返回何處? |
| 作者:sambie 欄目:單片機 |
keil的仿真結果是返回到斷點的下一句,但萬利的仿真器返回到別的地方。到底應該到哪里?請高手發(fā)表看法 |
| 2樓: | >>參與討論 |
| 作者: xwj 于 2006/1/2 19:00:00 發(fā)布:
返回到被中斷的主程序,就是設置省電模式語句的下一句 因此中斷喚醒的系統(tǒng)應該把“設置省電模式語句”設為無限循環(huán),退出中斷后就又會進入省電模式 |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2006/1/2 19:00:00 發(fā)布:
當然要返回到該回的地方了,不然程序不是出錯了。。。 從哪進的中斷,就應該要回到哪(上了操作系統(tǒng)的除外)。 |
|
| 4樓: | >>參與討論 |
| 作者: sambie 于 2006/1/2 19:52:00 發(fā)布:
好像不對。。。 請看下面的程序: org 0000h sjmp main org 000bh sjmp t0int main: mov sp,#3fh MOV TMOD,#11H setb ea loop: clr tf0 CLR TR0 SETB ET0 MOV TH0,#0H MOV TL0,#0H SETB TR0 psaving: orl pcon,#1b clr p1.3 setb p1.3 sjmp loop t0int: PUSH psw PUSH acc pop acc pop psw reti end 我用軟件仿真時,定時器中斷返回到 clr p1.3 這句(即使不發(fā)生中斷,當單步執(zhí)行下一步即clr p1.3時,仍然能執(zhí)行,不知道為什么--因為已經進入省電模式,按理CPU不應該執(zhí)行這一步。),可是如果接上目標板,當執(zhí)行到psaving 時就跳到t0int(即使中斷并未發(fā)生),并且pcon.0也不為1。根本不會執(zhí)行到下一句。我猜想定時器中斷不能用于喚醒CPU,只能在中斷服務程序里打轉。請高手們指正。 |
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/1/2 19:55:00 發(fā)布:
re:好好讀讀8951的datasheet吧。 在設置進入掉電模式的語句后面,不能用訪問端口的指令。 |
|
| 6樓: | >>參與討論 |
| 作者: sambie 于 2006/1/2 20:13:00 發(fā)布:
即使換成mov a, #1h,也還是一樣啊 感謝圈圈的提醒。 |
|
| 7樓: | >>參與討論 |
| 作者: sambie 于 2006/1/2 21:33:00 發(fā)布:
有沒有哪位高手解釋一下為什么省電模式被定時器中斷喚醒 后,不能返回到設置省電模式語句的下一句的原因?謝謝 |
|
| 8樓: | >>參與討論 |
| 作者: xwj 于 2006/1/2 22:39:00 發(fā)布:
不要全信仿真器,很多仿真器都不是(或不能)完全仿真單片機的 |
|
| 9樓: | >>參與討論 |
| 作者: descriptor 于 2006/1/2 22:53:00 發(fā)布:
re樓主 用軟件仿真時,執(zhí)行orl pcon,#1b后,仍然能執(zhí)行下一句clr p1.3,不知道為什么?已經進入省電模式,按理CPU不應該執(zhí)行這一步。 --因為仿真軟件沒有這么聰明。 如果接上目標板,當執(zhí)行到psaving 時就跳到t0int(即使中斷并未發(fā)生),并且pcon.0也不為1。根本不會執(zhí)行到下一句。 --執(zhí)行SETB TR0后,T0是硬件,T0立即運行,并不理會你單步與否,并且瞬間溢出引起中斷。退出中斷時,T0仍然會溢出,所以表現(xiàn)為在中斷里打轉,根本不會執(zhí)行到下一句。這是完全正確的結果。所以說不是在所有的地方都能設置斷點。 |
|
| 10樓: | >>參與討論 |
| 作者: sambie 于 2006/1/2 23:18:00 發(fā)布:
樓上言之有理。就是說,用定時器無法喚醒省電模式? |
|
| 11樓: | >>參與討論 |
| 作者: computer00 于 2006/1/2 23:59:00 發(fā)布:
省電模式?是不是idle模式?還是POWER down模式? idle模式是可以通過中斷來喚醒的;而POWER down模式則只有reset才能喚醒。 這個在51的datasheet上應該寫得很清楚。 |
|
| 12樓: | >>參與討論 |
| 作者: descriptor 于 2006/1/3 0:30:00 發(fā)布:
sambie,我都快被你氣死了 我覺得講得夠明白了。 不是用定時器無法喚醒idle模式,而是你不能在此設斷點。 |
|
| 13樓: | >>參與討論 |
| 作者: sambie 于 2006/1/3 10:22:00 發(fā)布:
樓上息怒。恕我愚頑不化。我還是不能從您的回復中 找到我需要的答案。我想用定時器中斷來喚醒idle,希望中斷返回到設置idle語句的下一句,可是如您所說,程序總在中斷服務程序中打轉,無法跳出。這樣idle不是永遠都喚不醒嗎?我在中斷程序中把pcon.0置0也不管用。還有,我把程序燒進89C2051試也沒有見到被喚醒。 各位高手都說可以喚醒,那一定是我那兒搞錯了,可問題出在哪里呢?謝謝 |
|
| 14樓: | >>參與討論 |
| 作者: noahwj 于 2006/1/3 11:15:00 發(fā)布:
肯定可以,我用過,orl pcon,#1b改為MOV PCON,#01H |
|
| 15樓: | >>參與討論 |
| 作者: fushaobing 于 2006/1/3 13:01:00 發(fā)布:
sambie 有關“中斷”和“定時器”的問題是很難用仿真器仿真的,因為仿真器永遠代替不了MCU。比如,你走單步時,即使你看到了定時器的計數(shù)器在變化,那也是不真實的。 descriptor說的已經很清楚了,你仔細體會一下。 如果你想得到你想要的結果,必須燒到MCU里面去。至于你說的燒了以后也看不到你要的結果,我想應該想想其他的辦法。因為“computer00”說了“在設置進入掉電模式的語句后面,不能用訪問端口的指令”。 |
|
| 16樓: | >>參與討論 |
| 作者: computer00 于 2006/1/3 13:18:00 發(fā)布:
我用keil軟仿真過了,可以進入中斷的。我用的是外部中斷0 設置進入idle模式后,就停在了下面的一條語句。然后中斷到來時,就進入中斷服務程序。 返回就返回到了idle下面的那條語句,繼續(xù)執(zhí)行。 |
|
| 17樓: | >>參與討論 |
| 作者: sambie 于 2006/1/3 14:33:00 發(fā)布:
看到這么多高手都回了帖子,真是感激。 computer00, 用外部中斷肯定沒問題?晌沂窍胗枚〞r器。我的本意是想讓MCU 執(zhí)行一些操作后 IDLE 一段時間如1小時后被定時器喚醒,再循環(huán)?沙绦蚶鲜遣恍。大俠論壇上有人說這很難實現(xiàn),需要用RTC。而這里的眾高手說可行,我用仿真器得不到結果,MCU也不行,還惹煩了幾位,真是罪過。要不你用定時器試試?謝謝了 |
|
| 18樓: | >>參與討論 |
| 作者: computer00 于 2006/1/3 14:57:00 發(fā)布:
用定時器也可以,我用了定時器2,10mS中斷一次,可以從idle喚醒 你的系統(tǒng)時鐘是多少?idle一小時?定時器可能弄不了那長時間啊,加軟件計數(shù)還差不多。 另外,我用你的程序仿真,運行結果也正確啊。 orl pcon,#1b clr p1.3 ;程序運行到這里暫停。一定時間后,進入中斷服務程序,運行完ISR后,繼續(xù)從這里往下運行。 |
|
| 19樓: | >>參與討論 |
| 作者: sambie 于 2006/1/3 15:04:00 發(fā)布:
我猜想你是用keil軟件仿真,對吧?軟件仿真是可以 硬件仿真和燒到mcu中去就不行了。 |
|
| 20樓: | >>參與討論 |
| 作者: computer00 于 2006/1/3 15:38:00 發(fā)布:
我硬件上也行啊, while(i) { LCD_printc(0xFF); PCON|=0x01;PCON|=0x01;PCON|=0x01;PCON|=0x01;PCON|=0x01; //我用LCD顯示的,加了幾個進來,顯示速度明顯變慢了。定時器2每隔10mS中斷一次 i--; } LCD_printc(1+TEMP%5); |
|
| 21樓: | >>參與討論 |
| 作者: javie 于 2006/1/3 15:42:00 發(fā)布:
問題的關鍵就在于你們太相信萬歷的仿真器了 尤其在中斷和定時的時候 我們只能相信MCU本身 而不能把希望寄托在萬歷身上 |
|
| 22樓: | >>參與討論 |
| 作者: descriptor 于 2006/1/3 17:49:00 發(fā)布:
sambie,我服了你了 不能在硬件仿真時在SETB TR0后加入斷點(或單步等)。 你加了斷點,程序暫時停止,可是T0并不會停止,所以在你盯著屏幕發(fā)呆的時候,T0已經溢出申請中斷。再執(zhí)行下一步時,就進了中斷。中斷返回時情況相同,所以表現(xiàn)為在中斷里打轉,永遠執(zhí)行不了psaving: orl pcon,#1b。 如果全速運行,或者燒成片子,執(zhí)行完SETB TR0后自然會執(zhí)行psaving: orl pcon,#1b,結果將完全正確。 還是那句話:不是用定時器無法喚醒idle模式,而是你不能在此設斷點。 |
|
| 23樓: | >>參與討論 |
| 作者: descriptor 于 2006/1/3 18:03:00 發(fā)布:
建議你把程序改成 中斷 點亮LED 中斷返回 主循環(huán) 延時約1S 關閉LED idle 這樣你燒成片子或者全速就能看到喚醒的效果了。T0決定LED熄滅的時間,如果太短,人眼將看不出來。 * - 本貼最后修改時間:2006-1-3 18:09:59 修改者:descriptor |
|
| 24樓: | >>參與討論 |
| 作者: jackf125 于 2006/1/4 21:25:00 發(fā)布:
看MCU的資料,多有交代 看MCU的資料,多有交代 |
|
| 25樓: | >>參與討論 |
| 作者: martial 于 2006/1/9 8:39:00 發(fā)布:
學習!ing |
|
| 26樓: | >>參與討論 |
| 作者: wolfererer 于 2006/1/9 10:21:00 發(fā)布:
樓上幾位真是熱心人啊,佩服,佩服 |
|
| 27樓: | >>參與討論 |
| 作者: sambie 于 2006/1/9 18:06:00 發(fā)布:
感謝各位指點,特別是descriptor, 出了趟差,沒有及時回復大家,sorry。我發(fā)現(xiàn)了原來程序中一個很可笑的錯誤:我在中斷程序中將中斷次數(shù)保存為某個變量,在主程序中用R0與它進行比較,如果相等,則引發(fā)IDLE?墒钱斨鞒绦驁(zhí)行到這里的時候,變量的值已經超過了R0,這就是為什么老不進入idle的原因。仿真時看到的卻是程序總在中斷程序中打轉。后來我改了程序,也看到了正確的結果。。。說實話,在此之前我還不知道怎么設置斷點呢,當然理解不了Descriptor的意思啦。不過也從幾位高人這里學到了東西,特別加深了對仿真的理解,謝謝。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |