本應(yīng)用筆記描述了如何針對(duì)不同的應(yīng)用設(shè)置和使用MAXQ?系列微控制器中的Type 2定時(shí)器。它包括供參考的源代碼。
介紹
MAXQ系列微控制器有三種類型的定時(shí)器:定時(shí)器0、定時(shí)器1和定時(shí)器2。
MAXQ定時(shí)器0型是仿照許多0微型控制器上常見的定時(shí)器8051型。MAXQ定時(shí)器1類型仿照8051定時(shí)器2類型。大多數(shù)MAXQ產(chǎn)品都有一個(gè)新的定時(shí)器,稱為定時(shí)器2,這是MAXQ系列獨(dú)有的。本應(yīng)用筆記詳細(xì)介紹了如何為不同目的設(shè)置和使用這款新的定時(shí)器2,并附有一些源代碼供參考。
概述
功能
定時(shí)器的三個(gè)主要用途是生成輸出波形、對(duì)輸入信號(hào)的轉(zhuǎn)換進(jìn)行計(jì)數(shù)(包括對(duì)系統(tǒng)時(shí)鐘轉(zhuǎn)換進(jìn)行計(jì)數(shù),從而起到定時(shí)器的作用)以及對(duì)輸入信號(hào)進(jìn)行計(jì)時(shí)。本節(jié)介紹使用計(jì)時(shí)器 2 的配置模式執(zhí)行這些計(jì)時(shí)器功能的方法。
比較
在此模式下,計(jì)數(shù)器由系統(tǒng)時(shí)鐘或備用時(shí)鐘(通常為 32,768 Hz RTC 時(shí)鐘)在內(nèi)部提供,其中任何一個(gè)都可以選擇按 1、2、4、8、16、32、64 或 128 進(jìn)行預(yù)分頻。然后,計(jì)數(shù)器用于控制初級(jí)和/或次級(jí)定時(shí)器引腳的輸出,以生成各種波形。
通過改變重載(T2R)和比較(T2C)寄存器中的值,可以修改輸出波形的頻率和占空比。這樣,MAXQ處理器就可以產(chǎn)生脈寬調(diào)制(PWM)波形。輸出可以有選擇地使能,起始極性可以反轉(zhuǎn)。頻率和占空比的限制由選擇作為源的時(shí)鐘的頻率(無論是系統(tǒng)時(shí)鐘還是備用時(shí)鐘)和所選的時(shí)鐘除數(shù)決定。最小脈沖寬度為預(yù)分頻源時(shí)鐘的一個(gè)時(shí)鐘周期(通過將比較值和重載值設(shè)置為相同值或?qū)⒈容^值設(shè)置為 FFFEh 來選擇)。最大脈沖寬度為預(yù)分頻源時(shí)鐘的 65,536 個(gè)周期。預(yù)標(biāo)因數(shù)為 128 時(shí),最大脈沖寬度為 8,388,608 個(gè)系統(tǒng)時(shí)鐘周期 - 對(duì)于 1 MHz 系統(tǒng)時(shí)鐘,超過 <> 秒。使用頻率較低的交替時(shí)鐘可以進(jìn)一步增加此值。
比較模式還提供了通過使用單脈沖 (SS2) 功能生成單個(gè)脈沖的功能。單脈沖允許固件在觸發(fā)脈沖之前設(shè)置脈沖的長(zhǎng)度,從而排除了固件對(duì)脈沖進(jìn)行計(jì)時(shí)并確定何時(shí)結(jié)束的要求。門控允許初級(jí)引腳觸發(fā)次級(jí)輸出上的單個(gè)脈沖或打開和關(guān)閉計(jì)數(shù)器,從而允許輸入信號(hào)修改次級(jí)引腳上的PWM輸出。比較模式還可用于按特定計(jì)劃生成重復(fù)中斷。
捕獲
在這種模式下,計(jì)數(shù)器在內(nèi)部供電,但用于計(jì)算或計(jì)時(shí)主定時(shí)器引腳上輸入信號(hào)的持續(xù)時(shí)間。計(jì)數(shù)器可以在輸入信號(hào)的任一或兩個(gè)邊緣進(jìn)行選通和觸發(fā),從而可以靈活地定時(shí)脈沖、單個(gè)事件或遞歸波形。T2C寄存器中的值可用于計(jì)算測(cè)量事件的周期。
計(jì)數(shù)器 在此模式下,主定時(shí)器引腳為計(jì)數(shù)器
提供時(shí)鐘源。在這種模式下,計(jì)數(shù)器計(jì)算主引腳上的轉(zhuǎn)換,上升沿或下降沿,或兩者兼而有之。次級(jí)引腳可用于輸出波形,當(dāng)計(jì)數(shù)溢出以及計(jì)數(shù)器與特定值匹配時(shí),波形將切換。在這兩種情況下也可以生成中斷。
雙八位模式定時(shí)器2可以在十六位模式下運(yùn)行(在這種情況下只有一個(gè)計(jì)數(shù)器可用)或八位模式,八位模式
將計(jì)數(shù)器視為兩個(gè)八位計(jì)數(shù)器,可以獨(dú)立使用。這允許定時(shí)器電路具有三個(gè)附加功能。在八位模式下,主計(jì)數(shù)器(高計(jì)數(shù)器)可用于比較、捕獲或計(jì)數(shù)器功能,而次級(jí)計(jì)數(shù)器(低計(jì)數(shù)器)可用于比較或PWM輸出。
雙比較
在這種模式下,每個(gè)八位計(jì)數(shù)器單獨(dú)計(jì)數(shù),可用于輸出波形,但每個(gè)計(jì)數(shù)器都來自相同的內(nèi)部時(shí)鐘源。通過使用每個(gè)八位計(jì)數(shù)器的不同重載和比較值,可以在兩個(gè)定時(shí)器引腳上輸出波形的不同頻率和占空比。
捕獲/PWM
在此模式下,一個(gè)八位計(jì)數(shù)器(高計(jì)數(shù)器)在捕獲模式下工作,以計(jì)時(shí)輸入信號(hào)的持續(xù)時(shí)間。另一個(gè)八位計(jì)數(shù)器(低計(jì)數(shù)器)在比較模式下工作,可用于輸出波形。
計(jì)數(shù)器/PWM
在這種模式下,一個(gè)八位計(jì)數(shù)器(高計(jì)數(shù)器)在計(jì)數(shù)器模式下工作,以計(jì)算輸入信號(hào)的轉(zhuǎn)換。另一個(gè)八位計(jì)數(shù)器(低計(jì)數(shù)器)在比較模式下工作,可用于輸出波形。
選項(xiàng)
單次 (SS2) 此選項(xiàng)允許計(jì)數(shù)器像運(yùn)行位 (T2R)
已打開一樣運(yùn)行,但僅在計(jì)數(shù)器下一次溢出之前運(yùn)行。然后,計(jì)數(shù)器恢復(fù)為使用運(yùn)行位來確定它是否將繼續(xù)計(jì)數(shù)。在八位模式下,此位僅適用于主八位計(jì)數(shù)器(高計(jì)數(shù)器)。
門控使能 (G2EN)
此選項(xiàng)允許在一段時(shí)間內(nèi)關(guān)閉計(jì)數(shù)器(即門控),而無需固件手動(dòng)切換運(yùn)行位 (T2R)。在比較和計(jì)數(shù)器模式下,門控適用于源時(shí)鐘。在捕獲模式下,門控適用于重新加載事件。
門控由主引腳上的值控制。這要求主引腳是輸入(T2OE [0]=0),因此輸出波形(如果需要)必須輸出在次級(jí)(或B)引腳上。門控控制僅在主輸入端可用。
極性選擇 極性位
(T2POL [0] 和 T2POL [1])可用于反轉(zhuǎn)輸出波形。用于此功能時(shí),必須在設(shè)置相應(yīng)的輸出使能位(T2OE [0] 和 T2OE [1])之前設(shè)置它們。設(shè)置使能位后設(shè)置極性位不起作用。T2POL [0] 位還可用于在初級(jí)引腳不用作輸出時(shí)反相選通條件。T2POL [0] 位在捕獲模式下也具有額外的含義,當(dāng)兩個(gè)邊沿都定義為捕獲時(shí)。在這種情況下,它定義哪個(gè)邊緣開始單次注射循環(huán),并在啟用門控時(shí)禁止在一個(gè)邊緣上重新加載。
輸出使能 輸出使能
位(T2OE [0] 和 T2OE [1])確定初級(jí)和次級(jí)引腳是否由定時(shí)器電路主動(dòng)驅(qū)動(dòng)。當(dāng)輸出使能位關(guān)斷時(shí),可以使用相應(yīng)的端口輸入寄存器將這些引腳讀取為輸入。當(dāng)輸出主引腳未使能時(shí),可用于對(duì)計(jì)數(shù)器進(jìn)行選通(關(guān)斷)。
時(shí)鐘選擇 T2CI 位(備用時(shí)鐘選擇
)和 T2DIV [2:0] 位(時(shí)鐘除數(shù))用于設(shè)置計(jì)數(shù)器使用的時(shí)鐘源和預(yù)縮放因子。T2CI 用于在系統(tǒng)時(shí)鐘和備用時(shí)鐘之間進(jìn)行選擇。然后,這些中的任何一個(gè)都可以按 2 倍進(jìn)行預(yù)縮放n(n 是存儲(chǔ)在 T0DIV 中的 7 到 2 之間的值)。
使用計(jì)時(shí)器
計(jì)數(shù)器寄存器 計(jì)數(shù)器在 2 位模式下有三個(gè)與之關(guān)聯(lián)的寄存器,在 2 位模式下有三個(gè)附加寄存器
。這些寄存器可以在任一模式(2 位或 2 位)下讀取和寫入,但在 2 位模式下,低寄存器的行為不同。在 2 位模式下工作時(shí),T2V、T2R 和 T2C 分別用作 <> 位計(jì)數(shù)器、重新加載和比較寄存器。在八位模式下工作時(shí),這三個(gè)寄存器用作低階八位寄存器。高階寄存器由T<>H、T<>RH和T<>CH分別表示計(jì)數(shù)器、重載和比較寄存器。此外,這些寄存器充當(dāng)主計(jì)數(shù)器的角色,T<>V、T<>R 和 T<>C 寄存器承擔(dān)輔助角色。
這意味著,當(dāng)定時(shí)器處于 8 位模式與 16 位模式時(shí),使用定時(shí)器寄存器的任何代碼的操作都將大不相同。因此,建議您對(duì)特定計(jì)時(shí)器使用八位模式或十六位模式。如果您需要在不同時(shí)間在兩種模式下使用它,則為每種模式使用單獨(dú)的函數(shù)將減少程序員的困惑。
在2位模式下,T2V寄存器包含電流計(jì)數(shù)。當(dāng)運(yùn)行位 (TR2) 或單脈沖位 (SS2) 導(dǎo)通且選通未激活 (G0EN=2) 時(shí),此寄存器隨所選時(shí)鐘邊沿遞增。如果門控處于活動(dòng)狀態(tài) (G1EN=2),則除了 TR2 或 SS2 導(dǎo)通外,初級(jí)引腳上的輸入必須與初級(jí)極性位 (T0POL [<>]) 的極性相反,計(jì)數(shù)器才能遞增。
T2R 寄存器保存計(jì)數(shù)器的重新加載值。每當(dāng)此值溢出(已達(dá)到 FFFFh 并且由于再次遞增)時(shí),該值都會(huì)自動(dòng)插入計(jì)數(shù)器 (T2V) 中。
控制和配置寄存器
有三個(gè)控制和配置寄存器:T2CFG、T2CNA 和 T2CNB。 T2CFG 包含常規(guī)配置信息。
C/T2位(計(jì)數(shù)器/定時(shí)器選擇)選擇定時(shí)器是在計(jì)數(shù)器模式還是定時(shí)器模式下工作(捕獲、比較和捕獲與比較輸出是定時(shí)器模式的子模式)。在定時(shí)器模式下,CCF [1:0] 位(捕獲/比較選擇)確定定時(shí)器是處于比較模式 (CCF [1:0] = 00) 還是捕獲模式 (CCF [1:0] = 01、10 或 11)。在計(jì)數(shù)器模式下,CCF 位確定將計(jì)算哪些邊沿(下降、上升或兩者兼而有之)。在計(jì)數(shù)器模式下,不使用 CCF 位中的值 00,因?yàn)橛?jì)數(shù)器沒有可計(jì)數(shù)的內(nèi)容。 模式選擇位 (T2MD) 確定定時(shí)器是作為一個(gè) <> 位定時(shí)器還是兩個(gè)獨(dú)立的 <> 位定時(shí)器運(yùn)行。設(shè)置后,選擇兩個(gè)八位定時(shí)器。次級(jí)定時(shí)器始終是比較/PWM 定時(shí)器。
可以選擇系統(tǒng)時(shí)鐘或備用時(shí)鐘(在某些MAXQ實(shí)現(xiàn)中為32 kHz RTC時(shí)鐘)作為源時(shí)鐘,并且每個(gè)時(shí)鐘都可以根據(jù)需要進(jìn)行預(yù)分頻。備用時(shí)鐘選擇位 (T2CI) 默認(rèn)為 0,用于選擇系統(tǒng)時(shí)鐘。設(shè)置此位將選擇備用時(shí)鐘。
預(yù)分頻器位 (T2DIV [2:0]) 選擇時(shí)鐘除數(shù),范圍從 1 到 128。預(yù)分頻器的公式為 2n,其中 n 是 T2DIV [2:0] 中的值。
T2CNA 包含選通使能、單次觸發(fā)、重載使能、運(yùn)行使能、低運(yùn)行使能、初級(jí)輸出極性、主輸出使能和中斷使能位。
選通使能位(G2EN)允許有選擇地禁用計(jì)數(shù)器。 單次觸發(fā)位 (SS2) 允許定時(shí)器運(yùn)行,直到下一個(gè)溢出情況,此時(shí)定時(shí)器停止。
捕獲和重裝位 (CPRL2) 指示定時(shí)器將其值捕獲到其捕獲寄存器中,并從外部邊沿上的重載寄存器重新加載該值。CPRL2 不用于比較和計(jì)數(shù)器模式。
運(yùn)行使能位 (TR2) 允許主計(jì)數(shù)器運(yùn)行,低運(yùn)行使能位 (TR2L) 允許輔助計(jì)數(shù)器在 <> 位模式下運(yùn)行。
初級(jí)極性選擇位 (T2POL0) 選擇初級(jí)輸出的初始極性。通過 T2OE0 啟用輸出后更改此位不起作用。設(shè)置主輸出使能位 (T2OE0) 將打開初級(jí)引腳的輸出,并將其值設(shè)置為等于極性位 (T2POL0) 中的值。
設(shè)置主中斷使能 (ET2) 允許生成中斷,前提是定時(shí)器模塊已啟用中斷(在 IMR 寄存器中設(shè)置適當(dāng)?shù)奈唬┎⑶乙褑⒂萌种袛啵?a target="_blank">IC 寄存器位 0 設(shè)置為 1)。當(dāng)主計(jì)數(shù)器溢出(達(dá)到FFFFh)或與比較寄存器匹配時(shí),將生成中斷。在這些情況下,將設(shè)置適當(dāng)?shù)奈唬?a target="_blank">TF2 用于溢出,TCC2 用于比較),并應(yīng)由中斷處理程序中的固件重置。未能重置這些位將導(dǎo)致重復(fù)中斷,直到它們被重置或中斷被禁用。
T2CNB 包含比較和溢出標(biāo)志、次級(jí)中斷使能以及次級(jí)輸出極性和使能位。
捕獲/比較標(biāo)志 (TCC2) 是在主計(jì)數(shù)器值與比較值匹配時(shí)設(shè)置的。
低捕獲/比較標(biāo)志 (TC2L) 類似于 TCC2,但僅在處于 <> 位模式且低計(jì)數(shù)器或次級(jí)計(jì)數(shù)器與低比較值匹配時(shí)才設(shè)置。
溢出標(biāo)志 (TF2) 在主計(jì)數(shù)器溢出時(shí)設(shè)置。低溢出標(biāo)志 (TF2L) 與 TF2 類似,但僅在處于 2 位模式且低計(jì)數(shù)器或次級(jí)計(jì)數(shù)器溢出時(shí)設(shè)置。 次級(jí)極性選擇位 (T1POL2) 選擇次級(jí)或 B 輸出引腳的初始極性。通過 T1OE2 啟用輸出后更改此位不起作用。設(shè)置次級(jí)輸出使能位 (T1OE2) 將打開次級(jí)引腳的輸出,并將其值設(shè)置為等于極性位 (T1POL<>) 中的值。次級(jí)輸出不直接鏈接到次級(jí)計(jì)數(shù)器,因?yàn)樵?<> 位模式下,主計(jì)數(shù)器提供輸出,而在 <> 位模式下,低計(jì)數(shù)器源輸出。
設(shè)置次級(jí)中斷使能 (ET2L) 允許在 2 位模式下,當(dāng)次級(jí)或低位 2 位計(jì)數(shù)器的溢出 (TF2L) 或比較 (TC2L) 設(shè)置 TF2L 或 TC<>L 位時(shí)生成中斷。ET<>L 位不用于 <> 位模式。
例子
比較示例 1 - 輸出帶門控
的波形 以下代碼將輸出頻率為 100 Hz、占空比為 1/3 的信號(hào)。該代碼是為 4.9152 MHz 的時(shí)鐘速度編寫的。4000h(16384 十進(jìn)制)的重載值在重載和溢出以及隨后的重載之間提供 C000h(49152 十進(jìn)制)時(shí)鐘周期,持續(xù)時(shí)間為 10 ms (100 Hz)。C000 的比較值為我們提供了 32768 個(gè)時(shí)鐘周期 (C000h - 4000h) 或重新加載后 6.7 毫秒,將進(jìn)行比較(以及因此產(chǎn)生的脈沖邊沿)。
T2POL1 位設(shè)置初始值,因?yàn)槲覀兪褂玫氖谴渭?jí)輸出,主輸出用于選通。在這種情況下,T2POL0 位選擇門控電平。當(dāng) T2POL1 設(shè)置為 0 時(shí),輸出的初始值為 0,因此輸出低電平持續(xù) 6.7 毫秒,然后高電平持續(xù) 3.3 毫秒。只要初級(jí)引腳保持高電平,就會(huì)輸出1/3占空比波形。當(dāng)初級(jí)引腳被拉低時(shí),計(jì)數(shù)器將停止計(jì)數(shù),并將次級(jí)引腳保持在當(dāng)前電平。通過將T2POL3設(shè)置為2,可以反轉(zhuǎn)波形(產(chǎn)生1/1占空比脈沖)。通過將 T2POL0 設(shè)置為 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個(gè)獨(dú)立的定時(shí)器2。它使用模塊 4 中的第三個(gè)計(jì)時(shí)器。它也是為4.9152 MHz的系統(tǒng)時(shí)鐘頻率編寫的,觸發(fā)時(shí)將輸出寬度為兩毫秒的低脈沖,輸出通常為高電平。在脈沖結(jié)束時(shí),將生成一個(gè)中斷,以指示脈沖已完成。此代碼在八位模式下使用計(jì)時(shí)器,還演示了預(yù)分頻器的用法。
為了獲得所需的兩毫秒周期,使用預(yù)標(biāo)度值 64 和定時(shí)器周期 154 個(gè)預(yù)分頻時(shí)鐘 (4915200 / 64 * 0.002 = 153.6)。選擇 66h (100h - 9Ah) 的比較值,在計(jì)數(shù)器從 FFh 溢出到 9 之前,會(huì)得到 154Ah(00 個(gè)十進(jìn)制)的刻度。將重新加載值設(shè)置為 65h 會(huì)導(dǎo)致脈沖在我們?cè)O(shè)置 SS1(單次)位后開始 2 個(gè)刻度。
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
每當(dāng)要觸發(fā)脈沖時(shí),都應(yīng)調(diào)用以下代碼。
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 - 定時(shí)中斷 以下代碼將生成兩個(gè)中斷
,每 125 微秒一個(gè),第二個(gè)每毫秒一個(gè)。它使用一個(gè)分為兩個(gè)八位定時(shí)器的定時(shí)器。由于兩個(gè)八位定時(shí)器將在同一輸入時(shí)鐘上運(yùn)行,因此我們希望選擇一個(gè)時(shí)鐘除數(shù),允許兩個(gè)定時(shí)器的計(jì)數(shù)小于256(八位計(jì)數(shù)器的最大值)。使用備用時(shí)鐘作為源為我們提供了一種無需劃分系統(tǒng)時(shí)鐘即可獲得兩個(gè)時(shí)序的方法,但代價(jià)是一些精度:高計(jì)數(shù)器的實(shí)際時(shí)序接近 122 微秒,低計(jì)數(shù)器的實(shí)際時(shí)序接近 0.98 毫秒,因?yàn)閭溆脮r(shí)鐘以 32768 Hz 運(yùn)行,并且沒有所需時(shí)間段的偶數(shù)除數(shù)可用。我們將從低計(jì)數(shù)器每秒獲得 1024 個(gè)中斷,從高計(jì)數(shù)器每秒獲得 8192 個(gè)中斷。高中斷和低中斷均使能,中斷類型由TF2和TF2L位標(biāo)識(shí),必須清除這些位才能為中斷提供服務(wù)。
; 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
捕獲示例 - 對(duì)輸入波形進(jìn)行計(jì)時(shí)
此示例對(duì)輸入信號(hào)進(jìn)行計(jì)時(shí)。此代碼使用第二個(gè)定時(shí)器(它們編號(hào)為 0、1 和 2),并設(shè)置為對(duì)高脈沖的持續(xù)時(shí)間進(jìn)行計(jì)時(shí)。在看到上升沿之前,它不會(huì)開始計(jì)時(shí)。CPRL2位可在捕獲時(shí)重新加載,因此后續(xù)脈沖也可以定時(shí)。T2POL [0] 和 SS2 位在此模式下的含義略有不同。SS2位(單次)用于禁止計(jì)數(shù),直到檢測(cè)到起始邊沿。這使得定時(shí)器可以隨時(shí)設(shè)置,即使輸入當(dāng)前為高電平,因?yàn)槎〞r(shí)器直到下一個(gè)上升沿才會(huì)啟動(dòng)。T2POL [0] 位選擇門控電平,而不是前面示例中的輸出極性。門控電平為 0 可防止計(jì)數(shù)器在輸入為低電平時(shí)運(yùn)行。此示例適用于更長(zhǎng)的脈沖,并將系統(tǒng)時(shí)鐘除以 128。系統(tǒng)時(shí)鐘頻率為 4.9152 MHz,定時(shí)器的分辨率約為 26 微秒,溢出前可計(jì)數(shù)至 1.7 秒。
以下代碼設(shè)置捕獲。
; 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
計(jì)數(shù)器示例 - 使用中斷和輸出波形
計(jì)算傳入轉(zhuǎn)換 以下示例對(duì)初級(jí)引腳上的輸入脈沖進(jìn)行計(jì)數(shù),并在每八個(gè)脈沖后生成一個(gè)中斷。它還控制次級(jí)引腳上的輸出波形,該波形每 8 個(gè)輸入脈沖切換一次。
; 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ā)生一個(gè)時(shí)鐘周期后,輸出上會(huì)發(fā)生第二次轉(zhuǎn)換。雖然當(dāng)您想要一個(gè)時(shí)鐘周期的脈沖寬度時(shí),這是一個(gè)有效的選項(xiàng),但很容易讓這種情況發(fā)生而沒有打算,因?yàn)樗鼈兌寄J(rèn)為相同的值 0。如果不要使用比較值,則應(yīng)將其設(shè)置在計(jì)時(shí)器使用的范圍之外。通常,將比較值設(shè)置為小于重新加載值的值將執(zhí)行此操作。如果無法做到這一點(diǎn)(由于使用重新加載值 0),則比較值應(yīng)設(shè)置為 <> 位模式下的 FFFFh 或 <> 位模式下的 FFh。這會(huì)導(dǎo)致比較和溢出事件發(fā)生在同一計(jì)時(shí)器時(shí)鐘周期上,從而阻止輸出的第二次轉(zhuǎn)換。
輸出使能應(yīng)在運(yùn)行使能之前或同時(shí)打開。在輸出使能之前設(shè)置運(yùn)行使能可能會(huì)導(dǎo)致輸出反轉(zhuǎn),因?yàn)樵谟?jì)時(shí)器設(shè)置為運(yùn)行和斷言輸出使能之間,中斷可能會(huì)導(dǎo)致代碼掛起(在中斷提供服務(wù)時(shí))。這可能導(dǎo)致在使能輸出之前發(fā)生比較或溢出事件,從而導(dǎo)致輸出具有相反的極性。這通常發(fā)生在B或次級(jí)輸出上,因?yàn)檩敵鍪鼓埽═2OE1)位于T2CNB寄存器中,而運(yùn)行位(TR2)和低運(yùn)行位(TR2L)位于T2CNA寄存器中。在這種情況下,應(yīng)首先設(shè)置 T2CNB 寄存器,或者應(yīng)設(shè)置 T2CNA 寄存器,將運(yùn)行位設(shè)置為零,然后在配置所有寄存器后設(shè)置運(yùn)行位。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7649瀏覽量
152107 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121158 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115369
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論