<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > AVR使用范例--AVR軟件延時(shí)精確計算指導

AVR使用范例--AVR軟件延時(shí)精確計算指導

作者: 時(shí)間:2011-05-06 來(lái)源:網(wǎng)絡(luò ) 收藏

和軟件延時(shí)時(shí)間長(cháng)短有關(guān)的因素有,單片機,晶振,延時(shí)語(yǔ)句,此處以for循環(huán)語(yǔ)句為例。

首先,我們編寫(xiě)一個(gè)for循環(huán)的延時(shí)語(yǔ)句,如下:非關(guān)鍵代碼省略

void delay(unsigned char n){for(;n!=0;n--);}void main(void){init_devices();delay(254);/*計算結果,本條語(yǔ)句延時(shí)約138微秒,avr studio仿真結果延時(shí)141微妙
                                                       以仿真的為準。*/while(1);}

正常編譯,按照常規方法打開(kāi)JTAG下載并進(jìn)入調試。我們要想辦法獲取程序的運行指令個(gè)數。

按下圖操作調出匯編程序框:

調出匯編程序框后的樣子

打開(kāi)watch窗口,找到delay(254);,使用常規調試方法F10,F11,使當前光標指向delay(254);的下一行,如下圖:

程序情況

使用F11逐條語(yǔ)句執行,你會(huì )看到如下圖的運行規律,按照1234567的方向運動(dòng),最后循環(huán),這就是我們想要找的執行語(yǔ)句條數,同時(shí)注意觀(guān)察watch窗口的數值變化。通過(guò)更改watch窗口的數值,使循環(huán)結構快速結束。

程序運行方向

我們由此得到語(yǔ)句的條數是3+3*(n+1),這里是3+254*(3+1)=1020條。在普通的計算中,我們可以這樣認為,for循環(huán)的語(yǔ)句數量是n*4+4。

AVR多數指令的執行時(shí)間是晶振頻率分之一,也就是一個(gè)時(shí)鐘周期,部分指令的時(shí)鐘周期是2-4個(gè)時(shí)鐘周期,詳細內容請查看數據手冊。那么delay(254);的總運行時(shí)間1020個(gè)時(shí)鐘周期,即為1020/(7.3728×1000000)秒,約和1020/7.3728 =138微秒。在要求不高的延時(shí)中,就可以使用for循環(huán)來(lái)多次調用這個(gè)delay作為100微秒使用,而不用考慮外層for循環(huán)造成的時(shí)鐘周期延時(shí)。

結語(yǔ):這里只是給出了一個(gè)軟件延時(shí)的簡(jiǎn)單例子,并不具有很強的使用性,實(shí)際操作中可以定義delay100us,delay1ms,delay1s等函數直接使用。

/***************************************************************************延時(shí) M32 7.3728M 粗略計算*/void Delay100us(uint8 x){uint8 i;          //4clock                   for(i=147;x!=0;x--)	while(--i);      //5 * i clock}void Delay1ms(uint16 n){        for (;n!=0;n--){Delay100us(10);}}void Delay1s(uint16 m)         //  m = 6 ,when m==7, it is 1. {m=m*40;                for (;m!=0;m--){Delay100us(250);}}/***********************************************************************/

軟件準確仿真延時(shí)時(shí)間

使用AVRstudio軟件仿真可以看到準確的程序運行的時(shí)間,設置中斷的方式就可以了解到。

調入AVR Studio,為觀(guān)察延時(shí)時(shí)間,點(diǎn)擊左側Workspace中的Processer,注意看其中的幾個(gè)參數:Cycle Counter和Stop Watch,前一個(gè)是執行周期數,即從復位開(kāi)始到目前為止共執行了多少個(gè)周期,而Stop Watch則表示從復位開(kāi)始到目前為止共用去的時(shí)間數,如果Frenance中的頻率值正確,那么這個(gè)時(shí)間就是正確的。這樣,我們可以通過(guò)觀(guān)察這個(gè)時(shí)間來(lái)調循環(huán)次數,將時(shí)間基本精確地調整到延時(shí)1ms。

AVR使用范例--AVR軟件延時(shí)精確計算指導

在運行到第一個(gè)中斷的時(shí)候stop watch的值是6.68,當運行到第二個(gè)中斷的時(shí)候,stop watch的值為148.11,可以得到delay(254)這條語(yǔ)句的執行時(shí)間約為148.11—6.86=141.25us。我們看到軟件仿真的時(shí)鐘周期是1028個(gè),與上面計算的1020個(gè)有一定差距,因為上面的計算我們忽略了調用程序所花的時(shí)間。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>