AVR——使用定時器必須弄清的幾個概念

2020-12-05 電子產品世界

定時器是獨立運行的,它不佔用CPU的時間,不需要指令,只有調用對應的寄存器的時候才需要參與。

AVR

mega16為例,它有三個寄存器,timer0,timer1和timer2,T0和T2是8位定時器,T1是16位寄存器,T2為異步定時器,三個定時器都可以用於產生PWM。

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

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為控制寄存器,用於控制定時器的工作模式細節;

TCNT0為T/C 寄存器,它的值在定時器的每個工作周期裡加一或減一,實現定時操作,CPU可以隨時讀寫TCNT0;

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

這裡說最簡單的模式,TCNT一直加一,到達最大值0xFF然後清零,進入下一次計數,在上面的程序中。

TCCR0=0x00;關閉T0的時鐘源,定時器停止工作。

TCNT0=0x83;設置T/C寄存器的初始值,及讓定時器從TCNT0從0x83開始定時或計數。

OCR0 = 0x7D;設定比較匹配寄存器的值,這個程序裡沒有使用。

TCCR0 = 0x02;選擇時鐘源,來自時鐘8分頻,設置後定時器就開始工作。

初始化後定時器開始工作,TCNT0在每一個定時器時鐘加一,當TCNT0等於OCR0的值時,T/C 中斷標誌寄存器- TIFR中的OCF0 置位,如果這時候TIMSK中OCIE0為1(即允許T0比較匹配中斷),並且全局中斷允許,比較匹配中斷即運行。中斷程序中可以對TCNT0和0CR0進行操作,對定時器進行調整。

TCNT0繼續加一,當達到0xFF時,T/C 中斷標誌寄存器- TIFR中的TOV0置位,如果這時候TIMSK中TOIE0為1(即允許T0溢出中斷),並且全局中斷允許,溢出中斷即運行。中斷程序中可以對TCNT0和0CR0進行操作,對定時器進行調整。

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

實際的過程中,定時器相關寄存器的操作非常靈活,可以在溢出中斷中修改TCNT0的值,也可以在中斷中修改OCR0的值,後面的實驗中會講到用定時器1修改OCR1A的方法實現1S精確定時。

師傅領進門,修行靠個人,定時器的基本原理說到這裡,要更深入的了解定時器,請看數據手冊。

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

本例程序中定時時間為:Time=8*(255-131+1)/1000000=0.001 S ,即為1ms,1Khz。可以看出,如果晶振選為8M,則定時時間變為0.000125S,也就是說晶振越大,定時時間越短,預分頻越大,定時越長。

在設置時如果你選擇1ms,會得到如下結果,和上面的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
}

[Copy to clipboard]

CODE:


//ICC-AVR application builder : 2007-6-9 0:33:58
// Target : M16
// Crystal: 1.0000Mhz
// 用途:演示定時器的工作原理
// 作者:古欣
// 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) //調整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 允許定時器零匹配和溢出中斷
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

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

相關焦點

  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?在avr中,沒有像51系列的數據指針DPTR,而是由X(由 R26、R27組成)、Y(由R28、R29組成)、Z(由R30、R31組成)三個16位的寄存器來完成數據指針的功能(相當於有三組DPTR),而且 還能作後增量或先減量等的運行,而在51系列中,所有的邏輯運算都必須在A中進行;而avr卻可以在任兩個寄存器之間進行,省去了在A中的來回折騰,這些 都比51系列出色些   2. avr
  • 淺談avr和arm的區別
    片內大容量的RAM不僅能滿足一般場合的使用,同時也更有效的支持使用高級語言開發系統程序,並可像MCS-51單片機那樣擴展外部 RAM。   AVR單片機的I/O線全部帶可設置的上拉電阻、可單獨設定為輸入/輸出、可設定(初始)高阻輸入、驅動能力強(可省去功率驅動器件)等特性,使的得I/O口資源靈活、功能強大、可充分利用。
  • 定時器
    ;手機中鬧鐘設定之類的;從電視上我們了解之前人類有使用過一炷香的燃燒時間來表示經過了幾個時辰;但是最早其實我們使用的是沙漏和水滴來計算時間的,後來發明了鐘錶,隨著鐘錶誕生發展成熟之後,人們開始嘗試使用這種全新的計時工具來改進定時器,達到準確控制時間的目的。
  • 單片機定時器/計數器基本原理
    圖1 T0和T1的基本構成 定時器/計數器的核心是一個加1計數器,在作定時器使用時,它對機器周期進行計數,每過一個機器周期計數器加1,直到計數器計滿溢出。 圖2 定時器/計數器的內部結構 一、定時/計數的基本概念 定時和計數是日常生活和生產中最常見和最普遍的問題。
  • 單片機中各種周期的關係與定時器原理
    有了以上的概念以後,就可以正確的理解定時器的工作原理了,在8051F310單片機中,有3個定時器,如果定時器1工作在模式1下,如工作模式1下,是16位的計時器,最大數值是65535,當再加1時(=65536),就會發生溢出,產生中斷,所以如果我們要它計1000個數, 那麼定時初值就是65536-1000,結果就是64536,這個值送給TH、TL,因為是16進位的,所以高位是64536
  • 51單片機---定時器 計數器
    ;二、定時器/計數器的結構8051單片機的兩個定時器T0和T1分別都由兩個特殊功能寄存器組成;T0由特殊功能寄存器TH0和TL0構成,而T1則是由TH1和TL1構成;作為定時器使用時,定時器計數8051單片機片內振蕩器輸出經過12分頻後的脈衝個數,即:每個機器周期使定時器T0/T1的寄存器值自動累加1,直到溢出,溢出後繼續從0開始循環計數;所以,定時器的解析度是時鐘振蕩頻率的
  • 51單片機計數器與定時器的區別
    在51單片機的學習過程中,我們經常會發現中斷、計數器/定時器、串口是學習單片機的難點,對於初學者來說,這幾部分的內容很難理解。
  • STM32 高級定時器-PWM簡單使用
    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。空閒狀態下的非工作狀態 不管TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //數初始化外設TIMx通道1這裡2.0庫為TIM_OCInit/* TIM1 counter enable開定時器
  • STM32F1通用定時器配置步驟(使用HAL庫)
    (1)使能定時器時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘(2)初始化定時器參數,包含自動重裝值,分頻係數,計數方式等voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct
  • 為什麼高速數據通道需要重定時器?
    轉接驅動器或重定時器晶片的典型應用包括:mykednc 到達大型PCB的最遠端 使用額外的連接器 支持子卡 連接擴展架 使用低端PCB材料 允許擁有較短距SerDes的晶片支持需要較長距離SerDes的應用 增強設備功能轉接驅動器和重定時器的比較典型的轉接驅動器數據通路包含連續時間線性均衡器(CTLE)、可變增益放大器(VGA)和線性驅動器。
  • 電工學習:三菱FX PLC定時器T的使用方法及常數K的使用
    1:定時器設定值的指定方法T10是100ms定時器,K100表示十進位數100,則T0的定時時間為100ms*100=10000ms=10s,所以T10的定時時間為10S。這裡是常數K指定設定值。上圖中是先將K100的數值存入D5中,T10的定時值與T10 K100定時時間相同。
  • 一個定時器生成多路PWM波形的原理和方法
    在很多工程應用中,需要使用到PWM波(脈寬調製),例如電機調速、溫度控制調整功率等。本文講述怎麼利用單片機的一個定時器生成多路PWM波形。一般的,PWM的周期t1是一個固定值,如1ms,10ms,100ms等,在一個周期中包含了高電平t2和低電平t3,它們的關係是t2+t3=t1。
  • AVR BootLoader應用範例
    )且開機即發送大量數據*/#include <avr/io.h>#include //時鐘定為外部晶體7.3728MHz,F_CPU=7372800 使用USART,115200bps#include /*boot_page_erase ( address )擦除FLASH 指定頁
  • C#如何使用定時器[Timer]
    生成exe文件進行測試輸入定時器間隔次數5;點擊【開始】按鈕;每次間隔5秒,會輸出標誌位。輸入循環次數20;點擊【停止】按鈕;停止timer。
  • 詳解定時器實用電路
    定時器電路是一種實用電路,包括固定時間定時器、時間可變定時器、倒計時定時器等。定時器啟動後即自動運行,定時時間結束時會發出聲、光提示,也可控制負載的動作。簡單定時電路圖1-56所示為最簡單的定時器電路,以單向晶閘管VS為核心組成, R 1 為定時電阻, C 1 為定時電容,HA為自帶音源的電磁訊響器,S為電源開關。
  • 手工製作一個智能定時器
    DIY&分享—GravityShare定時器現在在很多場合都有廣泛應用,比如電動車充電有定時充電保護之類、還有一些職能聯網定時控制器等。根據之前做的一個曝光燈閃光燈的需求,這次來做一個倒計時的定時器,能夠精確控制曝光時間,保證曝光效果的良好。
  • 舉幾個例子弄清復立葉變換的應用
    這兩道題使用 16-bit, 32-bit 的整數運算, 不使用浮點運算, 可以在 mcu 上實現。C)  完成一個 wav 聲音文件的變速不變調的程序。(1)複數的基礎知識在講解 fourier transform 前, 大家必須知道一點基本的複數知識。
  • 三菱PLC定時器(T)功能及實例
    作為設定值,可使用程序內存中的常數(K)、以及通過數據寄存器(D)的內容間接指定。(1)定時器的編號定時器(T)的編號如下表所示。(編號以10進位數分配)不作為定時器使用的定時器編號,也可以作為存儲數值用的數據寄存器使用。*1.
  • 單片機定時器周期計算公式
    定時器是單片機的重要功能模塊之一,在檢測、控制領域有廣泛應用。定時器常用作定時時鐘,以實現定時檢測,定時響應、定時控制,並且可以產生ms寬的脈衝信號,驅動步進電機。定時和計數的最終功能都是通過計數實現,若計數的事件源是周期固定的脈衝則可實現定時功能,否則只能實現計數功能。因此可以將定時和計數功能全由一個部件實現。
  • 自學單片機第五十三篇:設置定時器時間
    定時器的難點也就在這裡了。我們使用定時器時,通過手冊可以查詢到T0定時器是有4中工作方式的,每種工作方式是不一樣的,也就導致了設置的方法也稍有不同。先看下手冊中的四種方式。先不管如何設置的,我們先看下這四種模式,第一種是13位定時器,從學習到實踐,這麼久,我還沒有用過這種模式,想使用的可以試試,個人覺得也許就是為了兼容以前的設備,沒有其他左右,也許有,我不知道。