|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
為什么運行結(jié)果會是如此? |
| 作者:ihafd 欄目:單片機 |
MPLAB IDE(v7.50)里,用如下語句作延時,單步運行一步i的值是增加8或者9而不是1,為什么啦? for(i = 0; i < 0x3FFF; i++) i = i; 這樣做延時,單步運行一步i的值就是增加1. while(i <= 0x3fff) { i++; } 在菜單的Debugger -- setting---Osc/Trace里把Processor Frequency 的頻率值改變后,在Trace -- Scycles里看程序運行所用的時間,發(fā)現(xiàn)不管Processor Frequency 的頻率值怎樣改變,程序運的時間是不會變的. 為什么啦? |
| 2樓: | >>參與討論 |
| 作者: yewuyi 于 2006/12/4 22:16:00 發(fā)布:
你看的機器周期數(shù)把? 不管換什么OSC,周期數(shù)是確定的 |
|
| 3樓: | >>參與討論 |
| 作者: ihafd 于 2006/12/4 22:39:00 發(fā)布:
不是啊. 是在WATCH里的VALUE看到的啊. |
|
| 4樓: | >>參與討論 |
| 作者: yewuyi 于 2006/12/5 8:57:00 發(fā)布:
看這
|
|
| 5樓: | >>參與討論 |
| 作者: zhf0964 于 2006/12/5 17:02:00 發(fā)布:
寫法錯了。 在C語言里,不允許對for循環(huán)中的循環(huán)變量賦值。 所以應(yīng)該修改成: for(i = 0; i < 0x3FFF; i++) { nop; } |
|
| 6樓: | >>參與討論 |
| 作者: ihafd 于 2006/12/5 20:36:00 發(fā)布:
改成為樣還是一樣啊。 我改成這樣,運行一步i的值還是增加8或者9啊。 for(i = 0; i < 0x3FFF; i++); * - 本貼最后修改時間:2006-12-5 20:40:05 修改者:ihafd |
|
| 7樓: | >>參與討論 |
| 作者: xieyuanbin 于 2006/12/6 14:03:00 發(fā)布:
我試過,兩種都可以的。 以上方法都是只加一,估計你在什么地方又修改了這個變量值。 |
|
| 8樓: | >>參與討論 |
| 作者: 蘭天白云 于 2006/12/7 19:16:00 發(fā)布:
你看的是秒表, 應(yīng)該在View菜單下看 |
|
| 9樓: | >>參與討論 |
| 作者: ihafd 于 2006/12/7 23:51:00 發(fā)布:
就是這他程序. 就是一個那么簡單的程序,調(diào)試出的的結(jié)果卻是如如此. 每運行一步i的值還是增加8或者9 .編譯后調(diào)試看看. #include<p18f452.h> unsigned int i = 0; int LED; void main(void) { TRISD = 0x00; PORTD = 0xff; LED = 0x80; while(1) { PORTD =~LED; for(i = 0; i < 0x3FFF; i++); LED = LED>>1; if(LED == 0x00) LED = 0x80; } } |
|
| 10樓: | >>參與討論 |
| 作者: wyh820826 于 2006/12/10 9:44:00 發(fā)布:
軟件仿真有一定的局限。 特別是運行周期,和電腦的運行狀況有很大關(guān)系,最好是用硬件仿真或試驗板試驗。 |
|
| 11樓: | >>參與討論 |
| 作者: su_mj000 于 2006/12/10 10:43:00 發(fā)布:
此問題與晶振頻率無關(guān) 但與編譯及MPLAB-IDE有關(guān).看看匯編清單就應(yīng)該清楚了. 另外,此處的i變量是否是全局變量(按理不應(yīng)設(shè)成全局變量)? 盡管大多數(shù)人不會在循環(huán)體內(nèi)隨意改變循環(huán)變量,但C語言并不禁止 這么做.不過"i=i;"可能會被優(yōu)化掉. |
|
| 12樓: | >>參與討論 |
| 作者: mikesullen 于 2006/12/12 2:11:00 發(fā)布:
同意7樓 簡化程序試下,我剛才也試了,沒有問題。。。 |
|
| 13樓: | >>參與討論 |
| 作者: xieyuanbin 于 2006/12/12 14:10:00 發(fā)布:
程序本身沒問題?赡苁荢IM的一個功能。 調(diào)試了樓主的程序,確實如樓主所說一次變化I不止加1,而是加8.5或12.5,但從匯編代碼來看是正常的,也沒有別的程序在改變這個變量,可能是程序的編寫者覺得在這個上面死等浪費太多,所以多走了幾步,但時間是準的。不過我不知道那個開關(guān)在哪里。你若要看實際的單步,可以看PROGRAM MEMORY中實際的匯編代碼,或者也可這樣寫: for(i = 0; i < 0x3FFF; i++) { CLRWDT(); } 在里面加一個空的操作即可。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |