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

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            AVR定時(shí)器工作原理

            作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
            定時(shí)器是獨(dú)立運(yùn)行的,它不占用CPU的時(shí)間,不需要指令,只有調(diào)用對(duì)應(yīng)的寄存器的時(shí)候才需要參與。

            AVR mega16為例,它有三個(gè)寄存器,timer0,timer1和timer2,T0和T2是8位定時(shí)器,T1是16位寄存器,T2為異步定時(shí)器,三個(gè)定時(shí)器都可以用于產(chǎn)生PWM。

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

            以定時(shí)器T0來簡(jiǎn)單介紹定時(shí)器的操作方法,T0有三個(gè)寄存器可以被CPU訪問,TCCR0,TCNT0,OCR0,下面看一段ICC生成的定時(shí)器初始化程序。

            CODE:

            //TIMER0 initialize - prescale:8

            // WGM: Normal

            // desired value: 1KHz

            // actual value: 1.000KHz (0.0%)

            void timer0_init(void)

            {

            TCCR0 = 0x00; //stop

            TCNT0 = 0x83; //set count

            OCR0 = 0x7D; //set compare

            TCCR0 = 0x02; //start timer

            }

            [Copy to clipboard]

            TCCR0為控制寄存器,用于控制定時(shí)器的工作模式細(xì)節(jié);

            TCNT0為T/C 寄存器,它的值在定時(shí)器的每個(gè)工作周期里加一或減一,實(shí)現(xiàn)定時(shí)操作,CPU可以隨時(shí)讀寫TCNT0;

            OCR0:輸出比較寄存器,它包含一個(gè)8 位的數(shù)據(jù),不間斷地與計(jì)數(shù)器數(shù)值TCNT0 進(jìn)行比較。匹配事件可以用來產(chǎn)生輸出比較中斷,或者用來在OC0 引腳上產(chǎn)生波形。

            這里說最簡(jiǎn)單的模式,TCNT一直加一,到達(dá)最大值0xFF然后清零,進(jìn)入下一次計(jì)數(shù),在上面的程序中。

            TCCR0=0x00;關(guān)閉T0的時(shí)鐘源,定時(shí)器停止工作。

            TCNT0=0x83;設(shè)置T/C寄存器的初始值,及讓定時(shí)器從TCNT0從0x83開始定時(shí)或計(jì)數(shù)。

            OCR0 = 0x7D;設(shè)定比較匹配寄存器的值,這個(gè)程序里沒有使用。

            TCCR0 = 0x02;選擇時(shí)鐘源,來自時(shí)鐘8分頻,設(shè)置后定時(shí)器就開始工作。

            初始化后定時(shí)器開始工作,TCNT0在每一個(gè)定時(shí)器時(shí)鐘加一,當(dāng)TCNT0等于OCR0的值時(shí),T/C 中斷標(biāo)志寄存器- TIFR中的OCF0 置位,如果這時(shí)候TIMSK中OCIE0為1(即允許T0比較匹配中斷),并且全局中斷允許,比較匹配中斷即運(yùn)行。中斷程序中可以對(duì)TCNT0和0CR0進(jìn)行操作,對(duì)定時(shí)器進(jìn)行調(diào)整。

            TCNT0繼續(xù)加一,當(dāng)達(dá)到0xFF時(shí),T/C 中斷標(biāo)志寄存器- TIFR中的TOV0置位,如果這時(shí)候TIMSK中TOIE0為1(即允許T0溢出中斷),并且全局中斷允許,溢出中斷即運(yùn)行。中斷程序中可以對(duì)TCNT0和0CR0進(jìn)行操作,對(duì)定時(shí)器進(jìn)行調(diào)整。

            和定時(shí)器相關(guān)的寄存器還有SREG和TIMSK,前者位1控制全局中段允許,后者位1(OCIE0)和位0(TOIE0)分別控制比較匹配中斷和溢出比較匹配中斷允許。

            實(shí)際的過程中,定時(shí)器相關(guān)寄存器的操作非常靈活,可以在溢出中斷中修改TCNT0的值,也可以在中斷中修改OCR0的值,后面的實(shí)驗(yàn)中會(huì)講到用定時(shí)器1修改OCR1A的方法實(shí)現(xiàn)1S精確定時(shí)。

            師傅領(lǐng)進(jìn)門,修行靠個(gè)人,定時(shí)器的基本原理說到這里,要更深入的了解定時(shí)器,請(qǐng)看數(shù)據(jù)手冊(cè)。

            定時(shí)公式:Time=PRE*(MAX-TCNT0+1) /F_cpu單位S ,其中,PRE為與分頻數(shù),本例中為8,MAX即為最大值255,TCNT0為初始化時(shí)的值,本例中為0x83(十進(jìn)制的131),T_cpu,系統(tǒng)時(shí)鐘頻率,本例中為1000000。

            本例程序中定時(shí)時(shí)間為:Time=8*(255-131+1)/1000000=0.001 S ,即為1ms,1Khz??梢钥闯?,如果晶振選為8M,則定時(shí)時(shí)間變?yōu)?.000125S,也就是說晶振越大,定時(shí)時(shí)間越短,預(yù)分頻越大,定時(shí)越長(zhǎng)。

            在設(shè)置時(shí)如果你選擇1ms,會(huì)得到如下結(jié)果,和上面的1Khz相同。

            CODE:

            //TIMER0 initialize - prescale:8

            // WGM: Normal

            // desired value: 1mSec

            // actual value: 1.000mSec (0.0%)

            void timer0_init(void)

            {

            TCCR0 = 0x00; //stop

            TCNT0 = 0x83; //set count

            OCR0 = 0x7D; //set compare

            TCCR0 = 0x02; //start timer

            }

            //ICC-AVR application builder : 2007-6-9 0:33:58
            // Target : M16
            // Crystal: 1.0000Mhz
            // 用途:演示定時(shí)器的工作原理
            // 作者:古欣
            // AVR與虛擬儀器 [url]http://www.avrvi.com[/url]
            #include
            #include

            void port_init(void)
            {
            PORTA = 0x00;
            DDRA = 0x03; //PA0 PA1 輸出
            PORTB = 0x00;
            DDRB = 0xFF; //PB 輸出
            PORTC = 0x00; //m103 output only
            DDRC = 0x00;
            PORTD = 0x00;
            DDRD = 0x00;
            }

            //TIMER0 initialize - prescale:8
            // WGM: Normal
            // desired value: 1KHz
            // actual value: 1.000KHz (0.0%)
            void timer0_init(void)
            {
            TCCR0 = 0x00; //stop
            TCNT0 = 0x83; //set count
            OCR0 = 0x7D; //set compare
            TCCR0 = 0x02; //start timer
            }

            //比較匹配中斷
            #pragma interrupt_handler timer0_comp_isr:20
            void timer0_comp_isr(void)
            {
            //compare occured TCNT0=OCR0
            if(OCR0==0x7D) //調(diào)整0x7D
            {
            OCR0=0x7F;
            }
            else
            {
            OCR0=0x7D;
            }
            PORTA ^= 0x01; //PA0取反
            }

            //溢出中斷中斷
            #pragma interrupt_handler timer0_ovf_isr:10
            void timer0_ovf_isr(void)
            {
            TCNT0 = 0x83; //reload counter value
            PORTA ^= 0x01; //PA0取反
            }

            //call this routine to initialize all peripherals
            void init_devices(void)
            {
            //stop errant interrupts until set up
            CLI(); //disable all interrupts
            port_init();
            timer0_init();

            MCUCR = 0x00;
            GICR = 0x00;
            TIMSK = 0x03; //timer interrupt sources 允許定時(shí)器零匹配和溢出中斷
            SEI(); //re-enable interrupts
            //all peripherals are now initialized
            }

            void main(void)
            {
            init_devices();
            PORTA=0x00;
            while(1)
            {
            PORTB = TCNT0; //任何時(shí)候都可以讀TCNT0
            }
            }



            關(guān)鍵詞: AVR定時(shí)器工作原

            評(píng)論


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

            關(guān)閉