0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用MAXQ系列微控制器中的定時器

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-03-02 13:56 ? 次閱讀

本應用筆記描述了如何針對不同的應用設置和使用MAXQ?系列微控制器中的Type 2定時器。它包括供參考的源代碼。

介紹

MAXQ系列微控制器有三種類型的定時器:定時器0、定時器1和定時器2。

MAXQ定時器0型是仿照許多0微型控制器上常見的定時器8051型。MAXQ定時器1類型仿照8051定時器2類型。大多數MAXQ產品都有一個新的定時器,稱為定時器2,這是MAXQ系列獨有的。本應用筆記詳細介紹了如何為不同目的設置和使用這款新的定時器2,并附有一些源代碼供參考。

概述

功能
定時器的三個主要用途是生成輸出波形、對輸入信號的轉換進行計數(包括對系統(tǒng)時鐘轉換進行計數,從而起到定時器的作用)以及對輸入信號進行計時。本節(jié)介紹使用計時器 2 的配置模式執(zhí)行這些計時器功能的方法。

比較
在此模式下,計數器由系統(tǒng)時鐘或備用時鐘(通常為 32,768 Hz RTC 時鐘)在內部提供,其中任何一個都可以選擇按 1、2、4、8、16、32、64 或 128 進行預分頻。然后,計數器用于控制初級和/或次級定時器引腳的輸出,以生成各種波形。

通過改變重載(T2R)和比較(T2C)寄存器中的值,可以修改輸出波形的頻率和占空比。這樣,MAXQ處理器就可以產生脈寬調制(PWM)波形。輸出可以有選擇地使能,起始極性可以反轉。頻率和占空比的限制由選擇作為源的時鐘的頻率(無論是系統(tǒng)時鐘還是備用時鐘)和所選的時鐘除數決定。最小脈沖寬度為預分頻源時鐘的一個時鐘周期(通過將比較值和重載值設置為相同值或將比較值設置為 FFFEh 來選擇)。最大脈沖寬度為預分頻源時鐘的 65,536 個周期。預標因數為 128 時,最大脈沖寬度為 8,388,608 個系統(tǒng)時鐘周期 - 對于 1 MHz 系統(tǒng)時鐘,超過 <> 秒。使用頻率較低的交替時鐘可以進一步增加此值。

比較模式還提供了通過使用單脈沖 (SS2) 功能生成單個脈沖的功能。單脈沖允許固件在觸發(fā)脈沖之前設置脈沖的長度,從而排除了固件對脈沖進行計時并確定何時結束的要求。門控允許初級引腳觸發(fā)次級輸出上的單個脈沖或打開和關閉計數器,從而允許輸入信號修改次級引腳上的PWM輸出。比較模式還可用于按特定計劃生成重復中斷。

捕獲
在這種模式下,計數器在內部供電,但用于計算或計時主定時器引腳上輸入信號的持續(xù)時間。計數器可以在輸入信號的任一或兩個邊緣進行選通和觸發(fā),從而可以靈活地定時脈沖、單個事件或遞歸波形。T2C寄存器中的值可用于計算測量事件的周期。

計數器 在此模式下,主定時器引腳為計數器
提供時鐘源。在這種模式下,計數器計算主引腳上的轉換,上升沿或下降沿,或兩者兼而有之。次級引腳可用于輸出波形,當計數溢出以及計數器與特定值匹配時,波形將切換。在這兩種情況下也可以生成中斷。

雙八位模式定時器2可以在十六位模式下運行(在這種情況下只有一個計數器可用)或八位模式,八位模式
將計數器視為兩個八位計數器,可以獨立使用。這允許定時器電路具有三個附加功能。在八位模式下,主計數器(高計數器)可用于比較、捕獲或計數器功能,而次級計數器(低計數器)可用于比較或PWM輸出。

雙比較
在這種模式下,每個八位計數器單獨計數,可用于輸出波形,但每個計數器都來自相同的內部時鐘源。通過使用每個八位計數器的不同重載和比較值,可以在兩個定時器引腳上輸出波形的不同頻率和占空比。

捕獲/PWM
在此模式下,一個八位計數器(高計數器)在捕獲模式下工作,以計時輸入信號的持續(xù)時間。另一個八位計數器(低計數器)在比較模式下工作,可用于輸出波形。

計數器/PWM
在這種模式下,一個八位計數器(高計數器)在計數器模式下工作,以計算輸入信號的轉換。另一個八位計數器(低計數器)在比較模式下工作,可用于輸出波形。

選項

單次 (SS2) 此選項允許計數器像運行位 (T2R)
已打開一樣運行,但僅在計數器下一次溢出之前運行。然后,計數器恢復為使用運行位來確定它是否將繼續(xù)計數。在八位模式下,此位僅適用于主八位計數器(高計數器)。

門控使能 (G2EN)
此選項允許在一段時間內關閉計數器(即門控),而無需固件手動切換運行位 (T2R)。在比較和計數器模式下,門控適用于源時鐘。在捕獲模式下,門控適用于重新加載事件。

門控由主引腳上的值控制。這要求主引腳是輸入(T2OE [0]=0),因此輸出波形(如果需要)必須輸出在次級(或B)引腳上。門控控制僅在主輸入端可用。

極性選擇 極性位
(T2POL [0] 和 T2POL [1])可用于反轉輸出波形。用于此功能時,必須在設置相應的輸出使能位(T2OE [0] 和 T2OE [1])之前設置它們。設置使能位后設置極性位不起作用。T2POL [0] 位還可用于在初級引腳不用作輸出時反相選通條件。T2POL [0] 位在捕獲模式下也具有額外的含義,當兩個邊沿都定義為捕獲時。在這種情況下,它定義哪個邊緣開始單次注射循環(huán),并在啟用門控時禁止在一個邊緣上重新加載。

輸出使能 輸出使能
位(T2OE [0] 和 T2OE [1])確定初級和次級引腳是否由定時器電路主動驅動。當輸出使能位關斷時,可以使用相應的端口輸入寄存器將這些引腳讀取為輸入。當輸出主引腳未使能時,可用于對計數器進行選通(關斷)。

時鐘選擇 T2CI 位(備用時鐘選擇
)和 T2DIV [2:0] 位(時鐘除數)用于設置計數器使用的時鐘源和預縮放因子。T2CI 用于在系統(tǒng)時鐘和備用時鐘之間進行選擇。然后,這些中的任何一個都可以按 2 倍進行預縮放n(n 是存儲在 T0DIV 中的 7 到 2 之間的值)。

使用計時器

計數器寄存器 計數器在 2 位模式下有三個與之關聯的寄存器,在 2 位模式下有三個附加寄存器
。這些寄存器可以在任一模式(2 位或 2 位)下讀取和寫入,但在 2 位模式下,低寄存器的行為不同。在 2 位模式下工作時,T2V、T2R 和 T2C 分別用作 <> 位計數器、重新加載和比較寄存器。在八位模式下工作時,這三個寄存器用作低階八位寄存器。高階寄存器由T<>H、T<>RH和T<>CH分別表示計數器、重載和比較寄存器。此外,這些寄存器充當主計數器的角色,T<>V、T<>R 和 T<>C 寄存器承擔輔助角色。

這意味著,當定時器處于 8 位模式與 16 位模式時,使用定時器寄存器的任何代碼的操作都將大不相同。因此,建議您對特定計時器使用八位模式或十六位模式。如果您需要在不同時間在兩種模式下使用它,則為每種模式使用單獨的函數將減少程序員的困惑。

在2位模式下,T2V寄存器包含電流計數。當運行位 (TR2) 或單脈沖位 (SS2) 導通且選通未激活 (G0EN=2) 時,此寄存器隨所選時鐘邊沿遞增。如果門控處于活動狀態(tài) (G1EN=2),則除了 TR2 或 SS2 導通外,初級引腳上的輸入必須與初級極性位 (T0POL [<>]) 的極性相反,計數器才能遞增。

T2R 寄存器保存計數器的重新加載值。每當此值溢出(已達到 FFFFh 并且由于再次遞增)時,該值都會自動插入計數器 (T2V) 中。

控制和配置寄存器

有三個控制和配置寄存器:T2CFG、T2CNA 和 T2CNB。 T2CFG 包含常規(guī)配置信息。

pYYBAGQAOqGAXJCoAAALVcRkESo511.gif

C/T2位(計數器/定時器選擇)選擇定時器是在計數器模式還是定時器模式下工作(捕獲、比較和捕獲與比較輸出是定時器模式的子模式)。在定時器模式下,CCF [1:0] 位(捕獲/比較選擇)確定定時器是處于比較模式 (CCF [1:0] = 00) 還是捕獲模式 (CCF [1:0] = 01、10 或 11)。在計數器模式下,CCF 位確定將計算哪些邊沿(下降、上升或兩者兼而有之)。在計數器模式下,不使用 CCF 位中的值 00,因為計數器沒有可計數的內容。 模式選擇位 (T2MD) 確定定時器是作為一個 <> 位定時器還是兩個獨立的 <> 位定時器運行。設置后,選擇兩個八位定時器。次級定時器始終是比較/PWM 定時器。

可以選擇系統(tǒng)時鐘或備用時鐘(在某些MAXQ實現中為32 kHz RTC時鐘)作為源時鐘,并且每個時鐘都可以根據需要進行預分頻。備用時鐘選擇位 (T2CI) 默認為 0,用于選擇系統(tǒng)時鐘。設置此位將選擇備用時鐘。

預分頻器位 (T2DIV [2:0]) 選擇時鐘除數,范圍從 1 到 128。預分頻器的公式為 2n,其中 n 是 T2DIV [2:0] 中的值。

T2CNA 包含選通使能、單次觸發(fā)、重載使能、運行使能、低運行使能、初級輸出極性、主輸出使能和中斷使能位。

poYBAGQAOqKAc1FPAAAIwxvtox8302.gif

選通使能位(G2EN)允許有選擇地禁用計數器。 單次觸發(fā)位 (SS2) 允許定時器運行,直到下一個溢出情況,此時定時器停止。

捕獲和重裝位 (CPRL2) 指示定時器將其值捕獲到其捕獲寄存器中,并從外部邊沿上的重載寄存器重新加載該值。CPRL2 不用于比較和計數器模式。

運行使能位 (TR2) 允許主計數器運行,低運行使能位 (TR2L) 允許輔助計數器在 <> 位模式下運行。

初級極性選擇位 (T2POL0) 選擇初級輸出的初始極性。通過 T2OE0 啟用輸出后更改此位不起作用。設置主輸出使能位 (T2OE0) 將打開初級引腳的輸出,并將其值設置為等于極性位 (T2POL0) 中的值。

設置主中斷使能 (ET2) 允許生成中斷,前提是定時器模塊已啟用中斷(在 IMR 寄存器中設置適當的位)并且已啟用全局中斷(IC 寄存器位 0 設置為 1)。當主計數器溢出(達到FFFFh)或與比較寄存器匹配時,將生成中斷。在這些情況下,將設置適當的位(TF2 用于溢出,TCC2 用于比較),并應由中斷處理程序中的固件重置。未能重置這些位將導致重復中斷,直到它們被重置或中斷被禁用。

T2CNB 包含比較和溢出標志、次級中斷使能以及次級輸出極性和使能位。

pYYBAGQAOqOAB_oxAAAJEnj8mOI469.gif

捕獲/比較標志 (TCC2) 是在主計數器值與比較值匹配時設置的。

低捕獲/比較標志 (TC2L) 類似于 TCC2,但僅在處于 <> 位模式且低計數器或次級計數器與低比較值匹配時才設置。

溢出標志 (TF2) 在主計數器溢出時設置。低溢出標志 (TF2L) 與 TF2 類似,但僅在處于 2 位模式且低計數器或次級計數器溢出時設置。 次級極性選擇位 (T1POL2) 選擇次級或 B 輸出引腳的初始極性。通過 T1OE2 啟用輸出后更改此位不起作用。設置次級輸出使能位 (T1OE2) 將打開次級引腳的輸出,并將其值設置為等于極性位 (T1POL<>) 中的值。次級輸出不直接鏈接到次級計數器,因為在 <> 位模式下,主計數器提供輸出,而在 <> 位模式下,低計數器源輸出。

設置次級中斷使能 (ET2L) 允許在 2 位模式下,當次級或低位 2 位計數器的溢出 (TF2L) 或比較 (TC2L) 設置 TF2L 或 TC<>L 位時生成中斷。ET<>L 位不用于 <> 位模式。

例子

比較示例 1 - 輸出帶門控
的波形 以下代碼將輸出頻率為 100 Hz、占空比為 1/3 的信號。該代碼是為 4.9152 MHz 的時鐘速度編寫的。4000h(16384 十進制)的重載值在重載和溢出以及隨后的重載之間提供 C000h(49152 十進制)時鐘周期,持續(xù)時間為 10 ms (100 Hz)。C000 的比較值為我們提供了 32768 個時鐘周期 (C000h - 4000h) 或重新加載后 6.7 毫秒,將進行比較(以及因此產生的脈沖邊沿)。

T2POL1 位設置初始值,因為我們使用的是次級輸出,主輸出用于選通。在這種情況下,T2POL0 位選擇門控電平。當 T2POL1 設置為 0 時,輸出的初始值為 0,因此輸出低電平持續(xù) 6.7 毫秒,然后高電平持續(xù) 3.3 毫秒。只要初級引腳保持高電平,就會輸出1/3占空比波形。當初級引腳被拉低時,計數器將停止計數,并將次級引腳保持在當前電平。通過將T2POL3設置為2,可以反轉波形(產生1/1占空比脈沖)。通過將 T2POL0 設置為 1,可以將門控電平更改為高電平有效。

move	T2V0, #04000h ; set to reload value to keep first pulse
  ; from being extra long
	move 	T2R0, #04000h ; reload value
	move 	T2C0, #0C000h ; compare value

	move 	T2CFG0, #000h ;
; 0000,0000 - use system clock (0), divide by 1 (000),
;	16 bit mode (0), compare mode (00), c/t2=timer (0)

move 	T2CNB0, #040h
; 0100,0000 - ET2L off - low interrupts not available in 16-bit mode (0),
;	secondary OE is on (1), POL1 = low starting value (0), reserved (0)
;	TF2 is not used (0), TF2L is not used (0), TCC2 is not used (0),
;	TC2L is not used (0)

move 	T2CNA0, #009h
; 0000,1001 - ET2 off - interrupts not needed (0),
;	primary OE off as primary pin is used for gating (0),
;	POL0 low, gated when primary pin is low (0), TR2L is not needed (0)
;	TR2 on, run enabled (1), CPRL2 is not needed (0),
;	SS2 is not needed (0), gating enabled (1)

比較示例2 - 單次脈沖
以下代碼是為MAXQ2000器件編寫的,該器件具有3個獨立的定時器2。它使用模塊 4 中的第三個計時器。它也是為4.9152 MHz的系統(tǒng)時鐘頻率編寫的,觸發(fā)時將輸出寬度為兩毫秒的低脈沖,輸出通常為高電平。在脈沖結束時,將生成一個中斷,以指示脈沖已完成。此代碼在八位模式下使用計時器,還演示了預分頻器的用法。

為了獲得所需的兩毫秒周期,使用預標度值 64 和定時器周期 154 個預分頻時鐘 (4915200 / 64 * 0.002 = 153.6)。選擇 66h (100h - 9Ah) 的比較值,在計數器從 FFh 溢出到 9 之前,會得到 154Ah(00 個十進制)的刻度。將重新加載值設置為 65h 會導致脈沖在我們設置 SS1(單次)位后開始 2 個刻度。

SetupPulse:
	; This code sets up the timer and should be run once
	; set up Int handler
	move    IV, #IntHandler	    ; Set interrupt vector.
    	move    IC.0, #1            ; Enable global interrupts.
    	move    IMR.4, #1           ; Enable interrupts for module 3.
	; timer 0 is in module 3, timer 1 & 2 are in module 4

	move 	T2CFG2, #068h ;
; 0110,1000 -- use system clock (0), divide by 64 (110),
;	8 bit mode (1), compare mode (00), c/t2=timer (0)

	move 	T2CNB2, #000h
; 0000,0000 -- ET2L off, low interrupts not needed (0), secondary OE off (0),
;	T2POL1 = not used (0), reserved(0)
;	TF2 is generated by the timer (0), TF2L is not used (0), TCC2 is not used (0),
;	TC2L is not used (0)

	move 	T2CNA2, #0E0h
; 1110,0000 -- ET2 on, interrupt will be generated (1), primary OE on (1),
;	T2POL0 is high (1), TR2L is not needed (0)
;	TR2 off, run not enabled (0), CPRL2 is not needed (0), SS2 is set later (0),
;	gating disabled (0)

	move	T2H2, #065h ; set to reload value
	move 	T2RH2, #065h ;
	move 	T2CH2, #066h ; 0x100 - 0x66(compare value) = 0x9A = 154 ticks

每當要觸發(fā)脈沖時,都應調用以下代碼。

TriggerPulse:
	move T2CNA2.1, #1 ; set the single shot bit to start the timer
ret
The following is a piece of the interrupt code.
IntHandler:
move c, T2CNB2.3
jump nc, NonTimerInt
move T2CNB2.3, #0 ; turn off overflow bit so interrupt is serviced
; code for end of pulse here...

NonTimerInt:
	; other interrupt code here.

reti

比較示例 3 - 定時中斷 以下代碼將生成兩個中斷
,每 125 微秒一個,第二個每毫秒一個。它使用一個分為兩個八位定時器的定時器。由于兩個八位定時器將在同一輸入時鐘上運行,因此我們希望選擇一個時鐘除數,允許兩個定時器的計數小于256(八位計數器的最大值)。使用備用時鐘作為源為我們提供了一種無需劃分系統(tǒng)時鐘即可獲得兩個時序的方法,但代價是一些精度:高計數器的實際時序接近 122 微秒,低計數器的實際時序接近 0.98 毫秒,因為備用時鐘以 32768 Hz 運行,并且沒有所需時間段的偶數除數可用。我們將從低計數器每秒獲得 1024 個中斷,從高計數器每秒獲得 8192 個中斷。高中斷和低中斷均使能,中斷類型由TF2和TF2L位標識,必須清除這些位才能為中斷提供服務。

; This code sets up the timer and should be run once
	; set up Int handler
	move    IV, #IntHandler	    ; Set interrupt vector.
    	move    IC.0, #1            ; Enable global interrupts.
    	move    IMR.3, #1           ; Enable interrupts for module 3.
	; timer 0 is in module 3

	move 	T2CFG0, #088h ;
; 1000,1000 -- use 32 kHz clock (1), divide by 1 (000),
;	8 bit mode (1), compare mode (00), c/t2=timer (0)

	move 	T2CNB0, #080h
; 1000,0000 -- ET2L on, low interrupt will be generated (1), secondary OE off (0),
;	T2POL1 = not used (0), reserved(0)
;	TF2 is generated by the timer (0), TF2L is generated by timer (0),
;   	TCC2 is not used (0), TC2L is not used (0)

	move 	T2CNA0, #080h
; 1000,0000 -- ET2 on, interrupt will be generated (1), primary OE off (0),
;	T2POL0 is not needed (0), TR2L off, will be set later (0)
;	TR2 off, will be set later (0), CPRL2 is not needed (0),
;   	SS2 is not needed (0), gating disabled (0)

	move	T2H0, #0FCh ; set to reload value to keep first pulse from being extra long
	move 	T2RH0, #0FCh ; reload value (0x100 - 0xFC = 4 ticks)
	move 	T2CH0, #000h ;

	move	T2V0, #0E0h ; set to reload value to keep first pulse from being extra long
	move 	T2R0, #0E0h ; reload value (0x100 - 0xE0 = 32 ticks)
	move 	T2C0, #000h ;

	move	ACC, T2CNA0 ; turn on high run and low run (TR2, TR2L)
	or	#018h ;
	move	T2CNA0, ACC

以下是中斷處理程序代碼的一部分:

IntHandler:
	move c, T2CNB0.3
	jump nc, No8KHz
	; code for 8KHz interrupt here
	move T2CNB0.3, #0


No8KHz:
	move c, T2CNB0.2
	jump nc, No1KHz
	; code for 1KHz interrupt here
	move T2CNB0.2, #0


No1KHz:
	; other interrupt code here

reti

捕獲示例 - 對輸入波形進行計時
此示例對輸入信號進行計時。此代碼使用第二個定時器(它們編號為 0、1 和 2),并設置為對高脈沖的持續(xù)時間進行計時。在看到上升沿之前,它不會開始計時。CPRL2位可在捕獲時重新加載,因此后續(xù)脈沖也可以定時。T2POL [0] 和 SS2 位在此模式下的含義略有不同。SS2位(單次)用于禁止計數,直到檢測到起始邊沿。這使得定時器可以隨時設置,即使輸入當前為高電平,因為定時器直到下一個上升沿才會啟動。T2POL [0] 位選擇門控電平,而不是前面示例中的輸出極性。門控電平為 0 可防止計數器在輸入為低電平時運行。此示例適用于更長的脈沖,并將系統(tǒng)時鐘除以 128。系統(tǒng)時鐘頻率為 4.9152 MHz,定時器的分辨率約為 26 微秒,溢出前可計數至 1.7 秒。

以下代碼設置捕獲。

; set up Int handler
	move    IV, #IntHandler         ; Set interrupt vector.
      move    IC.0, #1                ; Enable global interrupts.
      move    IMR.4, #1               ; Enable interrupts for module 3.
	; timer 0 is in module 3, timer 1 & 2 are in module 4

	; repeated capture of high pulse
	move T2CFG1, #074h ;
; 0111,0100 -- use system clock (0), divide by 128 (111),
;	16 bit mode (0), capture on falling edge (10), c/t2=timer (0)

	move T2CNA1, #08Fh ;
; 1000,1111 -- ET2 on, interrupt will be generated (1), primary OE off (0),
;	T2POL0 (gating) at low (0), TR2L off, will be set later (0)
;	TR2 on (1), CPRL2 (reload on capture) is on (1),
;   	SS2 on (1), gating enabled (1)

	move 	T2CNB1, #000h
; 0000,0000 -- ET2L off, low interrupt not used (0), secondary OE off (0),
;	T2POL1 = not used (0), reserved(0)
;	TF2 is generated by the timer (0), TF2L is not used (0),
;   	TCC2 is not used (0), TC2L is not used (0)

以下是中斷處理程序代碼的一部分:

IntHandler:
	; looking for Timer2 interrupt...

move c, T2CNB1.1 ; capture/reload flag
jump nc, NoCapture
move T2CNB1.1, #0
; put code for capture event here
move ACC, T2C1 ; capture value now in ACC

NoCapture:
move c, T2CNB1.3 ; overflow flag
jump nc, NoOverflow
	move T2CNB1.3, #0 ;
	; put code to deal with overflow here
	; pulse was too long to measure with current clock speed and divisor
	; can add 65536 to a 32-bit value to keep counting

NoOverflow:
	; put other interrupt code here

reti

計數器示例 - 使用中斷和輸出波形
計算傳入轉換 以下示例對初級引腳上的輸入脈沖進行計數,并在每八個脈沖后生成一個中斷。它還控制次級引腳上的輸出波形,該波形每 8 個輸入脈沖切換一次。

	; This code sets up the timer and should be run once
	; set up Int handler
	move    IV, #IntHandler	    ; Set interrupt vector.
      move    IC.0, #1            ; Enable global interrupts.
      move    IMR.3, #1           ; Enable interrupts for module 3.
	; timer 0 is in module 3

	move	T2V0, #0FFF8h ; set to reload value
	move 	T2R0, #0FFF8h ; reload value 0x10000 - 0x0ffff = 8 ticks
	move 	T2C0, #00000h ;

	move 	T2CFG0, #003h ;
; 0000,0011 -- use system clock (0), divide by 1 (000),
;	16-bit mode (0), rising edge (01), c/t2=counter (1)

	move 	T2CNB0, #060h
; 0110,0000 -- ET2L not used (0), secondary OE on (1),
;	T2POL1 start at high (1), reserved(0)
;	TF2 is generated by the timer (0), TF2L is not used (0),
;   	TCC2 is generated by the timer (0), TC2L is not used (0)

	move 	T2CNA0, #088h
; 1000,1000 -- ET2 on, interrupt will be generated (1), primary OE not used (0),
;	T2POL0 is not used (0), TR2L is not needed(0)
;	TR2 on (1), CPRL2 is not needed (0),
;   	SS2 is not needed (0), gating disabled (0)

以下是中斷處理程序的一部分

IntHandler:

	move c, T2CNB0.3
	jump nc, NoTimer
	move T2CNB0.3, #0 ; service interrupt
	; put code for every 8 pulses here

NoTimer:
	; other interrupt code here

reti

要避免的一些常見陷阱

在比較模式下,如果比較值和重載值相等,則在重載發(fā)生一個時鐘周期后,輸出上會發(fā)生第二次轉換。雖然當您想要一個時鐘周期的脈沖寬度時,這是一個有效的選項,但很容易讓這種情況發(fā)生而沒有打算,因為它們都默認為相同的值 0。如果不要使用比較值,則應將其設置在計時器使用的范圍之外。通常,將比較值設置為小于重新加載值的值將執(zhí)行此操作。如果無法做到這一點(由于使用重新加載值 0),則比較值應設置為 <> 位模式下的 FFFFh 或 <> 位模式下的 FFh。這會導致比較和溢出事件發(fā)生在同一計時器時鐘周期上,從而阻止輸出的第二次轉換。

輸出使能應在運行使能之前或同時打開。在輸出使能之前設置運行使能可能會導致輸出反轉,因為在計時器設置為運行和斷言輸出使能之間,中斷可能會導致代碼掛起(在中斷提供服務時)。這可能導致在使能輸出之前發(fā)生比較或溢出事件,從而導致輸出具有相反的極性。這通常發(fā)生在B或次級輸出上,因為輸出使能(T2OE1)位于T2CNB寄存器中,而運行位(TR2)和低運行位(TR2L)位于T2CNA寄存器中。在這種情況下,應首先設置 T2CNB 寄存器,或者應設置 T2CNA 寄存器,將運行位設置為零,然后在配置所有寄存器后設置運行位。

審核編輯:郭婷


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7394

    瀏覽量

    150624
  • 寄存器
    +關注

    關注

    31

    文章

    5268

    瀏覽量

    119640
  • 定時器
    +關注

    關注

    23

    文章

    3226

    瀏覽量

    114142
收藏 人收藏

    評論

    相關推薦

    16位微控制器MAXQ613電子資料

    概述:MAXQ613是一款低功耗、16位MAXQ 微控制器 ,設計用于通用 遙控 、消費類 電子 和白色家電等低功耗產品。器件結合了強大的16位RISC
    發(fā)表于 04-13 07:35

    MAXQ2000微控制器與MAX4397是如何連接的?

    MAX4397是什么?MAXQ2000微控制器與MAX4397是如何連接的?
    發(fā)表于 06-04 06:15

    用uIP堆棧實現MAXQ微控制器聯網-MAXQ2000的應用

    用uIP堆棧實現MAXQ微控制器聯網 摘要:本應用筆記描述了如何用uIP TCP/IP網絡協(xié)議棧實現MAXQ®微控制器聯網。本設計
    發(fā)表于 08-04 09:47 ?485次閱讀
    用uIP堆棧實現<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>聯網-<b class='flag-5'>MAXQ</b>2000的應用

    MAXQ微控制器JTAG接口引腳的復用

    摘要:通常在嵌入式應用微控制器的每個端口引腳都是必需的,沒有多余引腳。大部分MAXQ®微控制器帶有可重新進行寫操作的內部程序存儲
    發(fā)表于 04-23 16:28 ?927次閱讀

    在應用編程MAXQ微控制器可分區(qū)擦除的程序和數據閃存

    摘要:本應用筆記介紹了MAXQ微控制器的程序和數據閃存,以及如何使用內置的應用ROM對閃存進行擦/寫。本應用筆記適用于所有使用分區(qū)擦除閃存的MAXQ
    發(fā)表于 04-23 17:16 ?688次閱讀
    在應用編程<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b><b class='flag-5'>中</b>可分區(qū)擦除的程序和數據閃存

    MAXQ8913微控制器從RAM執(zhí)行應用程序

    MAXQ8913微控制器從RAM執(zhí)行應用程序 MAXQ8913及其它MAXQ®微控制器
    發(fā)表于 01-11 17:56 ?1114次閱讀
    在<b class='flag-5'>MAXQ</b>8913<b class='flag-5'>微控制器</b><b class='flag-5'>中</b>從RAM執(zhí)行應用程序

    MAXQ1103 高性能RISC安全微控制器

    MAXQ1103 高性能RISC安全微控制器 概述 MAXQ1103微控制器是一款低功耗32位R
    發(fā)表于 01-26 16:18 ?828次閱讀

    MAXQ61H 低功耗、16位MAXQ微控制器

      MAXQ61H是一款低功耗、16位MAXQ®微控制器,設計用于通用遙控、消費類電子和白色家電等低功耗產品。 MAXQ61H結合
    發(fā)表于 01-05 09:34 ?801次閱讀
    <b class='flag-5'>MAXQ</b>61H 低功耗、16位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    MAXQ618 低功耗6位MAXQ微控制器

    MAXQ618是一種低功耗,16位MAXQ微控制器的低功耗應用,包括通用遙控,消費電子和白色家電設計。該器件結合了強大的16位RISC微控制器
    發(fā)表于 03-14 11:02 ?1200次閱讀
    <b class='flag-5'>MAXQ</b>618 低功耗6位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    MAXQ612/MAXQ622低功耗、16位MAXQ微控制器

    MAXQ612/MAXQ622低功耗、16位MAXQ?微控制器設計用于通用遙控、消費類電子和白色家電等低功耗產品。兩款器件均采用低功耗、高
    發(fā)表于 05-28 11:47 ?1288次閱讀
    <b class='flag-5'>MAXQ</b>612/<b class='flag-5'>MAXQ</b>622低功耗、16位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    微控制器MAXQ1850文數據手冊

    本文提供的微控制器MAXQ1850文數據手冊,希望對你的學習有所幫助!
    發(fā)表于 06-07 15:39 ?175次下載
    <b class='flag-5'>微控制器</b><b class='flag-5'>MAXQ</b>1850<b class='flag-5'>中</b>文數據手冊

    使用uIP堆棧將MAXQ微控制器聯網

    本應用筆記介紹如何使用uIP TCP/IP網絡堆棧將MAXQ?微控制器聯網。常用的SPI?轉以太網IC用作此應用的MAC/PHY。MAXQ2000作為微控制器示例。
    的頭像 發(fā)表于 01-11 20:32 ?1118次閱讀
    使用uIP堆棧將<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>聯網

    如何使用MAXQ微控制器上的定時器B生成PWM波形

    MAXQ微控制器有三種類型的定時器定時器0、定時器1和定時器2。
    的頭像 發(fā)表于 02-20 13:44 ?731次閱讀
    如何使用<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>上的<b class='flag-5'>定時器</b>B生成PWM波形

    使用安全微控制器看門狗定時器

    微控制器通常用于電源瞬變、電磁干擾 (EMI) 和靜電放電 (ESD) 豐富的惡劣環(huán)境??偩€損壞和電磁放電引起的程序損壞可能導致微處理執(zhí)行錯誤的指令。在這些環(huán)境,看門狗
    的頭像 發(fā)表于 03-01 14:14 ?818次閱讀

    如何使用MAXQ微控制器上的定時器B生成PWM波形

    MAXQ微控制器定時器B可以提供不同的PWM波形,這取決于TBC和TBR寄存的相對值以及DCEN位的狀態(tài)。
    的頭像 發(fā)表于 06-13 16:30 ?686次閱讀
    如何使用<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>上的<b class='flag-5'>定時器</b>B生成PWM波形