在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<s id="cmphk"><label id="cmphk"></label></s>
    <span id="cmphk"><var id="cmphk"></var></span>
    <dfn id="cmphk"><var id="cmphk"></var></dfn>
    <menu id="cmphk"><thead id="cmphk"></thead></menu>

    <address id="cmphk"></address>

      <dfn id="cmphk"></dfn>
      
      
      <span id="cmphk"></span>

      <object id="cmphk"><tt id="cmphk"></tt></object>
      1. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Avr單片機(jī)編程---延遲函數(shù)

        Avr單片機(jī)編程---延遲函數(shù)

        作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        avr-gcc提供了兩個延遲函數(shù),可以在用戶的程序中使用,前提--加入avr/delay.h這個頭文件:

        _delay_us(double __us)
        _delay_ms(double __ms)
        而這兩個延遲函數(shù)在實際工作的時候,調(diào)用了另兩個函數(shù),位于delay_basic.h中:
        a, _delay_loop_1(uint8_t __count)
        b,_delay_loop_2(uint16_t __count)
        a 函數(shù)可以看出,_count的最大值是256,b 函數(shù)中_count的最大值是65536。在delay_basic.h中有說明,也可以結(jié)合a,b兩個函數(shù)的具體定義看,a 函數(shù)執(zhí)行一次的時間是3個指令周期,b 執(zhí)行一次的時間是4個指令周期,一個指令周期 T = 1 / F_CPU。
        (測試:可以試著計算下當(dāng)F_CPU取值1M時,_count取1,_delay_loop_1和_delay_loop_2分別延遲時間
        是多 少,如果F_CPU取2M呢,延遲又是多少?)
        *********************************************
        F_CPU在avr-gcc中有定義,這個值是在編譯的時候傳遞給編譯器的,說明用戶程序的晶振頻率,編譯器為了保證編譯過程中防止因用戶為定義這個 F_CPU的值,設(shè)定一個初值F_CPU=100 0000UL,即默認(rèn)用戶使用的是1M的晶振。當(dāng)然,在實際程序設(shè)計時一定要根據(jù)實際用到的晶振設(shè)定這個值,否則,延遲肯定不準(zhǔn)??梢栽诙x加載頭文件前這樣:如
        #include
        #define F_CPU 1000000UL
        #include
        #include
        ***********************************************
        _delay_us(double __us), _delay_ms(double __ms)中又有這樣的定義:
        double __tmp = ((F_CPU) / 4e3) * __ms
        __ticks = (uint16_t)__tmp;
        _delay_loop_2(__ticks);
        --------------------------------------------
        double __tmp = ((F_CPU) / 3e6) * __us;
        __ticks = (uint8_t)__tmp;
        _delay_loop_1(__ticks);
        ---------------------------------------------
        所以根據(jù)a,b兩個函數(shù)中_count(實際參數(shù))的最大值描述就應(yīng)該是:
        ((F_CPU) / 3e6) * __us最大值是256
        ((F_CPU) / 4e3) * __ms的最大值是65536
        即我們在自己程序中調(diào)用 _delay_us(double __us),_delay_ms(double __ms)這兩個函數(shù)時參數(shù)的選擇與所取的F_CPU(也就是實際用到的晶振頻率)是有關(guān)系的。
        當(dāng)F_CPU取值為1M時,__us的最大取值是768,__ms的最大取值是65536*4
        當(dāng)F_CPU取值為2M時,__us的最大取值是768/2,__ms的最大取值是65536*4/2
        ......
        當(dāng)F_CPU取值為8M時,__us的最大取值是768/8,__ms的最大取值是65536*4/8
        所以,延遲函數(shù)的參數(shù)取值是不能一概而論的。
        //*************************************************************************************************************************
        現(xiàn)在再來看究竟延遲了多久?
        _delay_us(double __us)的延遲時間因為調(diào)用了_delay_loop_1(),而_delay_loop_1()是執(zhí)行3個指令周期,所以延遲時間就是:
        ((F_CPU) / 3e6) * __us*3*T (T = 1 / F_CPU 單位MHz)
        _delay_ms(double __ms)的延遲時間因為調(diào)用了_delay_loop_2(),而_delay_loop_2()是執(zhí)行4個指令周期,所以延遲時間就是:
        ((F_CPU) / 4e3) * __ms*4*T (T = 1 / F_CPU 單位MHz)
        可以試著計算下,當(dāng)F_CPU取值為1M時,_delay_us(X)就是延遲X us,_delay_ms(X)就是延遲X ms
        補(bǔ)充:
        其實,如果自己查看新的源代碼可以發(fā)現(xiàn),現(xiàn)在的定時的時間并不像有的舊的文章上說的那樣,限制在一定的范圍內(nèi)。因為代碼更新過了,嘎嘎。

        本文引用地址:http://www.biyoush.com/article/201611/320341.htm


        評論


        技術(shù)專區(qū)

        關(guān)閉
        ×

        “芯”朋友见面大会
        珠海|11.14|泰克“芯”朋友见面大会珠海站|泰克带您从测试角度看半导体的整条产业链,快来报名抢位吧>>