AVR使用范例--AVR軟件延時(shí)精確計(jì)算指導(dǎo)
和軟件延時(shí)時(shí)間長(zhǎng)短有關(guān)的因素有,單片機(jī),晶振,延時(shí)語(yǔ)句,此處以for循環(huán)語(yǔ)句為例。
首先,我們編寫一個(gè)for循環(huán)的延時(shí)語(yǔ)句,如下:非關(guān)鍵代碼省略
void delay(unsigned char n){for(;n!=0;n--);}void main(void){init_devices();delay(254);/*計(jì)算結(jié)果,本條語(yǔ)句延時(shí)約138微秒,avr studio仿真結(jié)果延時(shí)141微妙
以仿真的為準(zhǔn)。*/while(1);}
正常編譯,按照常規(guī)方法打開JTAG下載并進(jìn)入調(diào)試。我們要想辦法獲取程序的運(yùn)行指令個(gè)數(shù)。
按下圖操作調(diào)出匯編程序框:
打開watch窗口,找到delay(254);,使用常規(guī)調(diào)試方法F10,F(xiàn)11,使當(dāng)前光標(biāo)指向delay(254);的下一行,如下圖:
使用F11逐條語(yǔ)句執(zhí)行,你會(huì)看到如下圖的運(yùn)行規(guī)律,按照1234567的方向運(yùn)動(dòng),最后循環(huán),這就是我們想要找的執(zhí)行語(yǔ)句條數(shù),同時(shí)注意觀察watch窗口的數(shù)值變化。通過(guò)更改watch窗口的數(shù)值,使循環(huán)結(jié)構(gòu)快速結(jié)束。
我們由此得到語(yǔ)句的條數(shù)是3+3*(n+1),這里是3+254*(3+1)=1020條。在普通的計(jì)算中,我們可以這樣認(rèn)為,for循環(huán)的語(yǔ)句數(shù)量是n*4+4。
AVR多數(shù)指令的執(zhí)行時(shí)間是晶振頻率分之一,也就是一個(gè)時(shí)鐘周期,部分指令的時(shí)鐘周期是2-4個(gè)時(shí)鐘周期,詳細(xì)內(nèi)容請(qǐng)查看數(shù)據(jù)手冊(cè)。那么delay(254);的總運(yùn)行時(shí)間1020個(gè)時(shí)鐘周期,即為1020/(7.3728×1000000)秒,約和1020/7.3728 =138微秒。在要求不高的延時(shí)中,就可以使用for循環(huán)來(lái)多次調(diào)用這個(gè)delay作為100微秒使用,而不用考慮外層for循環(huán)造成的時(shí)鐘周期延時(shí)。
結(jié)語(yǔ):這里只是給出了一個(gè)軟件延時(shí)的簡(jiǎn)單例子,并不具有很強(qiáng)的使用性,實(shí)際操作中可以定義delay100us,delay1ms,delay1s等函數(shù)直接使用。
/***************************************************************************延時(shí) M32 7.3728M 粗略計(jì)算*/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);}}/***********************************************************************/
軟件準(zhǔn)確仿真延時(shí)時(shí)間
使用AVRstudio軟件仿真可以看到準(zhǔn)確的程序運(yùn)行的時(shí)間,設(shè)置中斷的方式就可以了解到。
調(diào)入AVR Studio,為觀察延時(shí)時(shí)間,點(diǎn)擊左側(cè)Workspace中的Processer,注意看其中的幾個(gè)參數(shù):Cycle Counter和Stop Watch,前一個(gè)是執(zhí)行周期數(shù),即從復(fù)位開始到目前為止共執(zhí)行了多少個(gè)周期,而Stop Watch則表示從復(fù)位開始到目前為止共用去的時(shí)間數(shù),如果Frenance中的頻率值正確,那么這個(gè)時(shí)間就是正確的。這樣,我們可以通過(guò)觀察這個(gè)時(shí)間來(lái)調(diào)循環(huán)次數(shù),將時(shí)間基本精確地調(diào)整到延時(shí)1ms。
在運(yùn)行到第一個(gè)中斷的時(shí)候stop watch的值是6.68,當(dāng)運(yùn)行到第二個(gè)中斷的時(shí)候,stop watch的值為148.11,可以得到delay(254)這條語(yǔ)句的執(zhí)行時(shí)間約為148.11—6.86=141.25us。我們看到軟件仿真的時(shí)鐘周期是1028個(gè),與上面計(jì)算的1020個(gè)有一定差距,因?yàn)樯厦娴挠?jì)算我們忽略了調(diào)用程序所花的時(shí)間。
評(píng)論