新聞中心

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

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

        作者: 時間:2011-05-06 來源:網絡 收藏

        和軟件延時時間長短有關的因素有,單片機,晶振,延時語句,此處以for循環語句為例。

        首先,我們編寫一個for循環的延時語句,如下:非關鍵代碼省略

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

        正常編譯,按照常規方法打開JTAG下載并進入調試。我們要想辦法獲取程序的運行指令個數。

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

        調出匯編程序框后的樣子

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

        程序情況

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

        程序運行方向

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

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

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

        /***************************************************************************延時 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);}}/***********************************************************************/

        軟件準確仿真延時時間

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宣威市| 彰武县| 镇宁| 达尔| 乳山市| 河东区| 临漳县| 珲春市| 菏泽市| 即墨市| 开平市| 平阳县| 余江县| 锡林浩特市| 含山县| 静海县| 新宁县| 克什克腾旗| 山阳县| 珲春市| 岳阳市| 金塔县| 大连市| 北流市| 游戏| 阜城县| 谷城县| 花垣县| 兴仁县| 岳池县| 九龙坡区| 永平县| 什邡市| 黄石市| 垫江县| 沅陵县| 东阿县| 顺昌县| 化德县| 南部县| 诸城市|