AVR定時器中斷初值計算方法_第1頁
AVR定時器中斷初值計算方法_第2頁
AVR定時器中斷初值計算方法_第3頁
AVR定時器中斷初值計算方法_第4頁
AVR定時器中斷初值計算方法_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

./AVR

定時器中斷初值計算方法使用芯片

AT

Mega16

外部晶振4.00MHz定時器1

〔16位定時器寄存器TCCR1B

=

0x04

設定256預分頻要利用定時器定時1秒1,4000000

/

256

=

15625

說明定時器每當1/15625

秒就會觸發(fā)一次中斷2,65535

-

15625

=

49910

計算出要累加多少次才能在1秒后出發(fā)定時器1的溢出中斷3,49910

<==>

C2

F6

將計算后的值換算成16進制4,TCNT1H

=

0xC2

;

對寄存器賦值

TCNT1L

=

0xF6

;=================================================例如用16位定時器TIMER1,4MHZ晶振,256分頻,100ms定時,如何求得初值賦給TCNT1?65536-<4M/256>*0.1=63973.5其中,4M是晶體頻率,0.1是定時時長單位秒。對于8位的定時器T=<2^8-計數(shù)初值>*晶振周期*分頻數(shù)=<2^8-計數(shù)初值>/晶振頻率*分頻數(shù)計數(shù)初值=2^8-T/晶振周期/分頻數(shù)=2^8-T*晶振頻率/分頻數(shù)因為AVR一指令一周期IAR

For

AVR

精確延時C語言中,想使用精確的延時程序并不容易。IAR

中有這樣的一個函數(shù)__delay_cycles<>,該函數(shù)在頭文件intrinsics.h中定義,函數(shù)的作用就是延時N個指令周期。根據(jù)這個函數(shù)就可以實現(xiàn)精確的延時函數(shù)了〔但不能做到100%精確度。實現(xiàn)的方法:建立一個delay.h的頭文件:#ifndef

__IAR_DELAY_H#define

__IAR_DELAY_H#include

<intrinsics.h>#define

XTAL

8

//可定義為你所用的晶振頻率〔單位Mhz

#define

delay_us<x>

__delay_cycles

<

<unsigned

long><x

*

XTAL>

>

#define

delay_ms<x>

__delay_cycles

<

<unsigned

long><x

*

XTAL*1000>

>#define

delay_s<x>

__delay_cycles

<

<unsigned

long><x

*

XTAL*1000000>

>#endif

注意:

__delay_cycles<x>,x必須是常量或則是常量表達式,如果是變量則編譯報錯!關于溢出中斷不管是哪個單片機都是不斷累加,使其寄存器溢出觸發(fā)中斷,然后跳轉(zhuǎn)到中斷函數(shù)處執(zhí)行中斷服務程序。對于定時器初值的設定可以加深對定時器的工作原理的理解。

ATMega16

里面有8位和16位兩種定時器,他們何時會溢出這個是固定的,也就是到達他們的計數(shù)圍的最大值就會產(chǎn)生中斷,8位的定時器的最大計數(shù)圍是0~256〔2的8次方,就是累加到256后他就會產(chǎn)生中斷,16位的定時器最大計數(shù)圍是0~65536〔2的16次方,累加到65536時他就會產(chǎn)生中斷。而我們所謂的計數(shù)初值是就是要設定定時器在什么地方開始計數(shù),以8位定時器為例比如:初值為100,所以定時器從100開始累加,累加了156次,加到256后產(chǎn)生中斷,這就是中間消耗的時間和指令周期就是我們要去設定的時間;再比如:初值是200,所以定時器從200開始累加,累加了56次,加到256后產(chǎn)生中斷,可以看到第一定時要累加156次才會中斷而第二次只要累加56次就會產(chǎn)生中斷,顯然第一次設定的時間要比第二次的長。定時器不僅可以定時,而且我們用到定時器的時候往往是需要精確定時的時候。我們可以計算出我們設定的初值會在多長時間后進入中斷。實驗平臺:ATMega16

晶振:

11.0592

MHz對初值的計算:

1,11059200

/

1024

=

10800

設定為1024倍分頻,得到每1秒需要進行多少次累加

2,10800

/

100

=

108

得到10ms

的定時需要進行多少次累加。

3,256

-

108

=

148

計算圍最大值減去要累加的時間,得到初值,即從哪里開始累加才能在溢出時為10ms的時間。

4,148

<==>

0x94

得到十六進制值,賦值給TCNT0代碼:定時10ms#include

<iom16.h>unsigned

char

flag

=

0;void

timer_init<void>{TCCR0

=

0x05;

//進行1024分頻

TCNT0

=

0x94;

//賦計數(shù)初值

TIMSK_TOIE0

=

1;

//開使能

SREG_I

=

1;

//開總中斷

}#pragma

vector

=

TIMER0_OVF_vect__interrupt

void

time0_normal<void>{

TCNT0

=

0x94;

//重新賦初值

flag++;}void

main<void>{

timer_init<>;

DDRB_Bit0

=

1;

while<1>

{

if<flag

==

100>

//10ms

重復100次,即為1秒

{

PORTB_Bit0

=

~PORTB_Bit0;

//讓LED閃爍

flag

=

0;

}

}

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//實驗平臺:ATMega16晶振:11.059216位定時器初值設定:

1,11059200

/

256

=

43200

設定256倍分頻,得到每1秒需要進行多少次累加

2,65536

-

43200

=

22336

計算圍最大值減去要累加的時間,得到初值,即從哪里開始累加才能在溢出時為1s的時間。

3,22336

<==>

0x57

0x40

得到十六進制值,賦值給TCNT1H

,

TCNT1L:定時1s#include

<iom16.h>

unsigned

char

flag

=

0;

void

timer_init<void>

{

TCCR1B

=

0x04;

TCNT1H

=

0x57;

TCNT1L

=

0x40;

TIMSK_TOIE1

=

1;

SREG_I

=

1;

}

#pragma

vector

=

TIMER1_OVF_vect

__interrupt

void

time1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論