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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

./AVR

定時(shí)器中斷初值計(jì)算方法使用芯片

AT

Mega16

外部晶振4.00MHz定時(shí)器1

〔16位定時(shí)器寄存器TCCR1B

=

0x04

設(shè)定256預(yù)分頻要利用定時(shí)器定時(shí)1秒1,4000000

/

256

=

15625

說明定時(shí)器每當(dāng)1/15625

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

-

15625

=

49910

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

<==>

C2

F6

將計(jì)算后的值換算成16進(jìn)制4,TCNT1H

=

0xC2

;

對寄存器賦值

TCNT1L

=

0xF6

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

For

AVR

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

中有這樣的一個(gè)函數(shù)__delay_cycles<>,該函數(shù)在頭文件intrinsics.h中定義,函數(shù)的作用就是延時(shí)N個(gè)指令周期。根據(jù)這個(gè)函數(shù)就可以實(shí)現(xiàn)精確的延時(shí)函數(shù)了〔但不能做到100%精確度。實(shí)現(xiàn)的方法:建立一個(gè)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必須是常量或則是常量表達(dá)式,如果是變量則編譯報(bào)錯(cuò)!關(guān)于溢出中斷不管是哪個(gè)單片機(jī)都是不斷累加,使其寄存器溢出觸發(fā)中斷,然后跳轉(zhuǎn)到中斷函數(shù)處執(zhí)行中斷服務(wù)程序。對于定時(shí)器初值的設(shè)定可以加深對定時(shí)器的工作原理的理解。

ATMega16

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

晶振:

11.0592

MHz對初值的計(jì)算:

1,11059200

/

1024

=

10800

設(shè)定為1024倍分頻,得到每1秒需要進(jìn)行多少次累加

2,10800

/

100

=

108

得到10ms

的定時(shí)需要進(jìn)行多少次累加。

3,256

-

108

=

148

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

4,148

<==>

0x94

得到十六進(jìn)制值,賦值給TCNT0代碼:定時(shí)10ms#include

<iom16.h>unsigned

char

flag

=

0;void

timer_init<void>{TCCR0

=

0x05;

//進(jìn)行1024分頻

TCNT0

=

0x94;

//賦計(jì)數(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

重復(fù)100次,即為1秒

{

PORTB_Bit0

=

~PORTB_Bit0;

//讓LED閃爍

flag

=

0;

}

}

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//實(shí)驗(yàn)平臺:ATMega16晶振:11.059216位定時(shí)器初值設(shè)定:

1,11059200

/

256

=

43200

設(shè)定256倍分頻,得到每1秒需要進(jìn)行多少次累加

2,65536

-

43200

=

22336

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

3,22336

<==>

0x57

0x40

得到十六進(jìn)制值,賦值給TCNT1H

,

TCNT1L:定時(shí)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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論