飛思卡爾單片機(jī) ECT學(xué)習(xí)資料.docx_第1頁
飛思卡爾單片機(jī) ECT學(xué)習(xí)資料.docx_第2頁
飛思卡爾單片機(jī) ECT學(xué)習(xí)資料.docx_第3頁
飛思卡爾單片機(jī) ECT學(xué)習(xí)資料.docx_第4頁
飛思卡爾單片機(jī) ECT學(xué)習(xí)資料.docx_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

9S12系列單片機(jī)的ECT(EnhancedCaptureTimerModule)模塊是在原68HC12的StandardTimermodule基礎(chǔ)上加以增強(qiáng)功能形成的。ECT模塊主要由以下幾部分組成,參看圖1: 一個(gè)帶可編程預(yù)分頻的16位向上計(jì)數(shù)的自由運(yùn)行計(jì)數(shù)器 8個(gè)獨(dú)立的定時(shí)器通道,每個(gè)通道具備輸入捕捉/輸出比較功能 4個(gè)8位脈沖累加器,也可設(shè)置成2個(gè)16位脈沖累加器 一個(gè)帶可編程預(yù)分頻的16位的向下計(jì)數(shù)的計(jì)數(shù)器從上面示意圖中可以就看出,ECT模塊相當(dāng)?shù)膹?fù)雜,不是簡單的幾句話就能說明白的。我也是通過很長時(shí)間的學(xué)習(xí)實(shí)踐,才逐步掌握了ECT模塊的使用。本文將通過一系列的實(shí)例,從最簡單的功能開始,逐步展開。一步一步的展示ECT模塊的強(qiáng)大功能。實(shí)驗(yàn)1:自由運(yùn)行計(jì)數(shù)器(TCNT)與溢出中斷自由運(yùn)行計(jì)數(shù)器(TCNT)也稱為自由運(yùn)行主定時(shí)器,是一個(gè)16位的計(jì)數(shù)器,可以說是ECT的核心。在系統(tǒng)復(fù)位時(shí),這個(gè)自由運(yùn)行計(jì)數(shù)器的初值為$0000。當(dāng)ECT模塊運(yùn)行時(shí),自由運(yùn)行計(jì)數(shù)器從$0000$FFFF循環(huán)遞增計(jì)數(shù)。當(dāng)計(jì)數(shù)器溢出復(fù)零時(shí),會(huì)置位中斷標(biāo)志。利用這個(gè)計(jì)數(shù)器,可以產(chǎn)生一個(gè)周期的中斷信號。TCNT的輸入時(shí)鐘也是可以選擇的,圖2給出了TCNT的時(shí)鐘源的示意圖??梢钥闯觯琓CNT的輸入時(shí)鐘可以來源于總線時(shí)鐘、總線時(shí)鐘經(jīng)過預(yù)分頻、外部引腳輸入的脈沖、外部引腳輸入脈沖經(jīng)過脈沖累加器分頻這四種選擇。當(dāng)然,選擇哪個(gè)時(shí)鐘源其實(shí)就是在程序中設(shè)置一下相應(yīng)的寄存器這么簡單。了解了上面的介紹,就可以開始本文的第一個(gè)例子了,這個(gè)例子非常簡單,將BUSCLOCK分頻后作為TCNT的輸入時(shí)鐘,使能TCNT溢出中斷。在開始代碼之前,還需要介紹幾個(gè)程序中用到的寄存器。TCNT寄存器(TimerCountRegister)這個(gè)寄存器其實(shí)已經(jīng)介紹過了,它是一個(gè)16位的只讀寄存器。在每個(gè)時(shí)鐘輸入下計(jì)數(shù)值會(huì)自動(dòng)加1,當(dāng)計(jì)數(shù)值為0xFFFF后下一個(gè)時(shí)鐘脈沖會(huì)使計(jì)數(shù)器溢出為0x0000。程序中可以隨時(shí)讀取TCNT的值,唯一需要注意的是TCNT是個(gè)16位的寄存器,讀取時(shí)要一次將其讀出,如果分為高低兩個(gè)字節(jié)讀取,讀到的數(shù)據(jù)不一定能拼接成一個(gè)有效的計(jì)數(shù)值。圖3TCNT寄存器TFLG2寄存器(MainTimerInterruptFlag2)這個(gè)寄存器只有最高位TOF是有意義的。當(dāng)TCNT溢出時(shí)會(huì)置位TOF位,程序中可以輪詢這一位來判斷TCNT是否溢出了。當(dāng)然這種輪詢的方法效率很低,更實(shí)用的方法是利用TCNT溢出中斷。向TOF位寫1會(huì)清除TOF,在TCNT溢出中斷中就必須清除TOF,否則就不會(huì)響應(yīng)下一次溢出中斷。圖4TFLG2寄存器TSCR2寄存器(TimerSystemControlRegister2)這個(gè)寄存器由三部分功能組成。TOI位是TimerOverflowInterruptEnable的簡寫。TOI位為0時(shí)表示禁止TCNT溢出中斷,這時(shí)只能通過輪詢TOF位來判斷是TCNT計(jì)數(shù)器是否溢出了。TOI位為1表示使能TCNT溢出中斷。TCRE位是TimerCounterResetEnable的簡寫。TCRE位為0表示TCNT自由運(yùn)行,TCRE位為1表示當(dāng)TCNT=OC7時(shí)復(fù)位。PR2、PR1、PR0是總線時(shí)鐘的預(yù)分頻因子。當(dāng)PR2-0組成的三位2進(jìn)制數(shù)為N時(shí),表示將BUSCLOCK分頻2N。圖5TSCR2寄存器TSCR1寄存器(TimerSystemControlRegister1)TEN位為0時(shí)ECT模塊被禁用。TEN位為1時(shí)ECT模塊被使能。TSWAI(TimerModuleStopsWhileinWait)位為0時(shí),ECT模塊在STOP模式下仍舊運(yùn)行。TSWAI位為1時(shí),ECT模塊在STOP模式停止運(yùn)行。TSFRZ(TimerandModulusCounterStopWhileinFreezeMode),這一位與TSWAI位類似。TFFCA(TimerFastFlagClearAll)我還沒仔細(xì)研究,作用不明。圖6TSCR1寄存器有了上面這些介紹,就可以很容易的看懂下面的代碼了。在我的實(shí)驗(yàn)板上,晶振頻率為16.384MHz,因?yàn)闆]有開啟PLL,BUSCLOCK為8.192MHz,內(nèi)核頻率為16.384MHz。8.192MHz被128預(yù)分頻后為64KHz,16位計(jì)數(shù)器溢出頻率為0.98Hz(64000/65536)cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.h4. 5. voidECTInit(void)6. 7. 8. TSCR2_PR=7;/prescalefactoris8,busclock/128=8MHz/128=64KHz9. TSCR2_TOI=1;/timeroverflowinterruptenable10. TSCR1_TEN=1;/timerenable11. 12. 13. voidmain(void)14. 15. SCIInit();16. SCISetBaudRate(SCI0,9600,8192000L);17. ECTInit();18. EnableInterrupts;19. for(;)20. 21. _FEED_COP();/*feedsthedog*/22. /*loopforever*/23. 24. 25. 26. 27. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)28. 29. TFLG2_TOF=1;/cleartimeroverflowflag30. SCIPutChar(SCI0,x);31. 實(shí)驗(yàn)2:輸出比較功能(OutputCompare)所謂輸出比較功能就是根據(jù)需要設(shè)置輸出比較寄存器的值,自由運(yùn)行計(jì)數(shù)器的值與輸出比較寄存器的值每隔4個(gè)總線周期比較一次,當(dāng)兩者相等時(shí),會(huì)在規(guī)定的通道引腳上輸出預(yù)定的電平。如果允許中斷,會(huì)產(chǎn)生一次輸出比較中斷。相應(yīng)需要操作的寄存器有如下幾個(gè):TCx寄存器(TimerInputCapture/OutputCompare0-7)總共8個(gè)16位寄存器,分別對應(yīng)8個(gè)輸出比較通道。當(dāng)TCx=TCNT時(shí)滿足輸出比較條件,這時(shí)根據(jù)程序設(shè)置在對應(yīng)輸出管腿輸出特定的電平(具體方法見TCTL1/TCTL2寄存器的功能設(shè)置)或者產(chǎn)生對應(yīng)的中斷事件。TIOS寄存器(TimerInputCapture/OutputCompareSelect)用來設(shè)定某一通道是輸入捕捉功能還是輸出比較功能。IOSx=1對應(yīng)位為輸出比較功能,IOSx=0對應(yīng)位為輸入捕捉功能。圖7TIOS寄存器TIE寄存器(TimerInterruptEnableRegister)其中某一位置1后則使能相應(yīng)的通道的中斷,這里控制的中斷既包括輸出比較中斷也包括后面要介紹的輸入捕捉中斷。圖8TIE寄存器TCTL1/TCTL2寄存器(TimerControlRegister1/2)用來決定輸出比較時(shí)的輸出模式和輸出電平。具體參見表格1。表格1輸出比較動(dòng)作OMxOLx動(dòng)作00不輸出01每次翻轉(zhuǎn)OCx的電平10OCx=011OCx=1圖9TCTL1/TCTL2寄存器TFLG1寄存器(MainTimerInterruptFlag1)用來標(biāo)識中斷條件發(fā)生了,對某一位寫1則清除對應(yīng)位。圖 10 TFLG1寄存器有了這些就可以開始第二個(gè)例子了。第二個(gè)例子利用通道0和通道1的輸出比較功能。在TCNT=TC0時(shí)將對應(yīng)的PT0管腿的輸出電平翻轉(zhuǎn),并且產(chǎn)生相應(yīng)中斷。在TCNT=TC1時(shí)將對應(yīng)的PT1管腿的輸出電平翻轉(zhuǎn),并且產(chǎn)生相應(yīng)中斷。這樣,PT0和PT1就會(huì)輸出兩個(gè)具有恒定相位差的同頻方波信號了。cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.h4. 5. voidECTInit(void)6. 7. /TSCR2_PR=7;/prescalefactoris8,busclock/128=8Mhz/88. TSCR2_TOI=1;/timeroverflowinterruptenable9. TSCR1_TEN=1;/timerenable10. 11. TIOS_IOS0=1;/channel0asoutputcompare12. TIOS_IOS1=1;/channel1asoutputcompare13. TC0=10000;14. TC1=20000;15. TIE_C0I=1;/使能channel0中斷16. TIE_C1I=1;/使能channel1中斷17. 18. TCTL2_OL0=1;19. TCTL2_OM0=0;20. 21. TCTL2_OL1=1;22. TCTL2_OM1=0;23. 24. voidmain(void)25. 26. SCIInit();27. SCISetBaudRate(SCI0,9600,8192000L);28. ECTInit();29. DDRM_DDRM0=1;30. DDRM_DDRM1=1;31. DDRM_DDRM2=1;32. EnableInterrupts;33. 34. for(;)35. 36. _FEED_COP();/*feedsthedog*/37. /*loopforever*/38. 39. 40. 41. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)42. 43. TFLG2=TFLG2_TOF_MASK;/cleartimeroverflowinterruptflag44. PTM_PTM0=PTM_PTM0;45. 46. 47. interruptVectorNumber_Vtimch0voidECT_0_ISR(void)48. 49. unsignedintvalue;50. 51. TFLG1=TFLG1_C0F_MASK;/clearchannel0interruptflag52. PTM_PTM1=PTM_PTM1;53. 54. interruptVectorNumber_Vtimch1voidECT_1_ISR(void)55. 56. TFLG1=TFLG1_C1F_MASK;/clearchannel1interruptflag57. PTM_PTM2=PTM_PTM2;58. 59. interruptVectorNumber_Vtimch7voidECT_7_ISR(void)60. 61. TFLG1=TFLG1_C7F_MASK;/clearchannel7interruptflag62. 下面是用USBee抓下來的波形圖。PortM0是在溢出中斷中翻轉(zhuǎn)的。PT0、PT1分別對應(yīng)兩個(gè)輸出比較通道,兩個(gè)上升沿的時(shí)間間隔為1/8192=1.22ms,測量結(jié)果與理論值完全相同。下面將程序做一個(gè)很小的修改。將TC0和TC1的值改成相同的。cppview plaincopy1. voidECTInit(void)2. 3. /TSCR2_PR=7;/prescalefactoris8,busclock/128=8Mhz/84. TSCR2_TOI=1;/timeroverflowinterruptenable5. TSCR1_TEN=1;/timerenable6. 7. TIOS_IOS0=1;/channel0asoutputcompare8. TIOS_IOS1=1;/channel1asoutputcompare9. TC0=10000;10. TC1=10000;11. TIE_C0I=1;/使能channel0中斷12. TIE_C1I=1;/使能channel1中斷13. 14. TCTL2_OL0=1;15. TCTL2_OM0=0;16. 17. TCTL2_OL1=1;18. TCTL2_OM1=0;19. 從波形圖中可以看出,輸出是正常的。但是有些低版本的ECT模塊有些問題,在這種情況下只有通道0的中斷能夠響應(yīng),通道1的中斷無法響應(yīng)。實(shí)驗(yàn)3:輸出比較7通道的特殊功能輸出比較通道OC7具有特殊的權(quán)限,可以廢止其他輸出比較通道的動(dòng)作,直接決定各個(gè)輸出通道的狀態(tài)。這種特權(quán)功能是通過配置兩個(gè)額外的寄存器OC7M和OC7D來實(shí)現(xiàn)的。OC7M寄存器(OutputCompare7MaskRegister)使OC7Mx=1,OC7強(qiáng)行參與管理通道x的輸出,但通道OC7對通道OC0OC6的管理僅限于使其引腳PT0PT6清0或置1,不能將引腳電平翻轉(zhuǎn),引腳的動(dòng)作來自于輸出比較7數(shù)據(jù)寄存器OC7D中的對應(yīng)位OC7Dx定義的電平狀態(tài),必須事先通過程序設(shè)置。圖11OC7M寄存器OC7D寄存器(OutputCompare7DataRegister)OC7Dx=0,則對應(yīng)事件發(fā)生時(shí)相應(yīng)PTx位將被輸出為低電平,OC7Dx=1,則對應(yīng)事件發(fā)生時(shí)相應(yīng)PTx位將被輸出為高電平。圖12OC7D寄存器可以開始我們的實(shí)驗(yàn)了。這個(gè)實(shí)驗(yàn)將在PT0管腿上輸出一個(gè)占空比位1/4的方波。實(shí)現(xiàn)方法為在TCNT=10000時(shí)將PT0置為高電平,TCNT=26384時(shí)將PT0置為低電平。下面是程序片段。cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.hvoidECTInit(void)4. 5. /TSCR2_PR=7;/prescalefactoris8,busclock/128=8Mhz/86. 7. TIOS_IOS0=1;/channel0asoutputcompare8. TC0=10000;TCTL2_OL0=1;9. TCTL2_OM0=1;/使channel0輸出高電平10. 11. TIOS_IOS7=1;/channel7asoutputcompare12. TC7=26384;13. /TIE_C7I=1;/使能channel7中斷14. 15. OC7M_OC7M0=1;16. OC7D=0;/使channel0輸出低電平17. 18. TCTL1_OL7=0;19. TCTL1_OM7=0;20. 21. TSCR2_TOI=1;/timeroverflowinterruptenable22. TSCR1_TEN=1;/timerenable23. 24. voidmain(void)25. 26. SCIInit();27. SCISetBaudRate(SCI0,9600,8192000L);28. ECTInit();29. DDRM_DDRM0=1;30. EnableInterrupts;31. 32. for(;)33. 34. _FEED_COP();/*feedsthedog*/35. /*loopforever*/36. 37. 38. 39. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)40. 41. TFLG2=TFLG2_TOF_MASK;/cleartimeroverflowinterruptflag42. PTM_PTM0=PTM_PTM0;43. interruptVectorNumber_Vtimch0voidECT_0_ISR(void)44. 45. 46. TFLG1=TFLG1_C0F_MASK;/clearchannel0interruptflag47. 48. interruptVectorNumber_Vtimch1voidECT_1_ISR(void)49. 50. TFLG1=TFLG1_C1F_MASK;/clearchannel1interruptflag51. 52. 利用這種方式可以模擬個(gè)PWM功能出來。不過模擬出來的PWM周期只有8種選擇。在第一篇應(yīng)用筆記中,我提到過TCSR2寄存器有一位叫TCRE。TCRE位是TimerCounterResetEnable的簡寫。TCRE位為0表示TCNT自由運(yùn)行,TCRE位為1表示當(dāng)TCNT=OC7時(shí)復(fù)位。下面將給出一個(gè)利用TCRE的例子。同樣是占空比25%,但是同時(shí)還調(diào)整了波形的周期。這個(gè)例子中,TC0=1000,TC7=4000。PT0在1000時(shí)翻轉(zhuǎn)一下,在4000時(shí)再翻轉(zhuǎn)一下。同時(shí)4000時(shí)將TCNT值復(fù)位到0重新計(jì)數(shù)。這樣波形的頻率就成了4000/8192000=4.88ms。cppview plaincopy1. voidECTInit(void)2. 3. TSCR2_PR=7;/prescalefactoris8,busclock/128=8Mhz/84. 5. TIOS_IOS0=1;/channel0asoutputcompare6. TC0=1000;7. TIE_C0I=1;/使能channel0中斷8. TCTL2_OL0=1;9. TCTL2_OM0=1;/使channel0輸出高電平10. 11. TIOS_IOS7=1;/channel7asoutputcompare12. TC7=4000;13. TIE_C7I=1;/使能channel7中斷14. TCTL1=0x40;15. 16. OC7M_OC7M0=1;17. OC7D=0;/使channel0輸出低電平18. 19. TCTL1_OL7=0;20. TCTL1_OM7=0;21. 22. TSCR1_TEN=1;/timerenable23. 上面是實(shí)際波形,這里出現(xiàn)了個(gè)有意思的現(xiàn)象。PM0一直為低電平,這表明TCNT的Overflow中斷沒有進(jìn)去。說明這個(gè)中斷只有在TCNT為自由計(jì)數(shù)器時(shí)才有用,這點(diǎn)需要特別注意。實(shí)驗(yàn)4:定時(shí)器溢出翻轉(zhuǎn)功能所謂定時(shí)器溢出翻轉(zhuǎn)就是在TCNT溢出時(shí)將某個(gè)通道的輸出管腿PTx電平翻轉(zhuǎn)一下。這個(gè)功能很實(shí)用,可以實(shí)現(xiàn)PWM功能。首先,還是要介紹個(gè)相關(guān)的寄存器TTOV。TTOV寄存器(TimerToggleOnOverflowRegister1)定時(shí)器溢出觸發(fā)寄存器TTOV很簡單,8位寄存器每一位對應(yīng)一個(gè)輸出比較通道,相應(yīng)位置1后表示允許根據(jù)溢出特性翻轉(zhuǎn)對應(yīng)輸出比較引腳。置0則禁止這一功能。圖13TTOV寄存器有這些知識就足夠了,下面開始我們的實(shí)驗(yàn)。這個(gè)實(shí)驗(yàn)的輸出和上一個(gè)實(shí)驗(yàn)相同,將在PT0管腿上輸出一個(gè)占空比位1/4的方波,不同的是實(shí)現(xiàn)方法。在TCNT=TC0=49152時(shí)將PT0管腿置1,然后在TCNT溢出時(shí)翻轉(zhuǎn)PT0。程序片段如下。cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.h4. 5. voidECTInit(void)6. 7. /TSCR2_PR=7;/prescalefactoris8,busclock/128=8Mhz/88. 9. TSCR2_TOI=1;/timeroverflowinterruptenable10. 11. TIOS_IOS0=1;/channel0asoutputcompare12. TC0=49152;13. TCTL2_OL0=1;14. TCTL2_OM0=1;/使channel0輸出高電平15. 16. TTOV_TOV0=1;/TCNT計(jì)數(shù)溢出時(shí)翻轉(zhuǎn)PT017. TSCR1_TEN=1;/timerenable18. 19. voidmain(void)20. 21. SCIInit();22. SCISetBaudRate(SCI0,9600,8192000L);23. ECTInit();24. DDRM_DDRM0=1;25. EnableInterrupts;26. 27. for(;)28. 29. _FEED_COP();/*feedsthedog*/30. /*loopforever*/31. 32. 33. 34. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)35. 36. TFLG2=TFLG2_TOF_MASK;/cleartimeroverflowinterruptflag37. PTM_PTM0=PTM_PTM0;38. 程序運(yùn)行后就能在PT0管腿上觀測到1/4占空比的方波了。這里需要特別說明的是TTOV不能與TCRE同時(shí)使用,比如下面這個(gè)例子。這個(gè)例子本意是在TCNT=10000時(shí)翻轉(zhuǎn)PT0通道,然后當(dāng)TCNT=20000時(shí)利用TTOV功能再次翻轉(zhuǎn)PT0的輸出,同時(shí)由于開啟了TCRE,讓TCNT直接回到0。cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.h4. 5. voidECTInit(void)6. 7. TSCR2_TOI=1;/timeroverflowinterruptenable8. 9. TIOS_IOS0=1;/channel0asoutputcompare10. TC0=15000;11. TCTL2_OL0=1;12. TCTL2_OM0=0;/使channel0輸出高電平13. 14. TIOS_IOS7=1;/channel7asoutputcompare15. TC7=20000;16. 17. TCTL1_OL7=1;18. TCTL1_OM7=0;/使channel0輸出高電平19. 20. TSCR2_TCRE=1;/TCNToverflowwhenTCNT=TC7=2000021. TTOV_TOV0=1;/TCNT計(jì)數(shù)溢出時(shí)翻轉(zhuǎn)PT022. TSCR1_TEN=1;/timerenable23. 24. voidmain(void)25. 26. SCIInit();27. SCISetBaudRate(SCI0,9600,8192000L);28. ECTInit();29. DDRM_DDRM0=1;30. EnableInterrupts;31. 32. for(;)33. 34. _FEED_COP();/*feedsthedog*/35. /*loopforever*/36. 這里說明TCRE功能開啟后,TTOV就不起作用了。其實(shí)這也不難理解,TTOV發(fā)生的條件和TCNT的Overflow中斷產(chǎn)生的條件是相同的,都是在TCNT從65536向0溢出時(shí)才會(huì)發(fā)生。其他條件下都沒有作用。實(shí)驗(yàn)5:初識輸入捕捉功能所謂輸入捕捉,簡單的說就是感應(yīng)輸入引腳PTx上的電平的變化,如果發(fā)現(xiàn)電平變化,則:lTCNT計(jì)數(shù)器的值被保存到到輸入捕捉寄存器TCx中,狀態(tài)標(biāo)志位被置1l如果中斷允許,則向CPU發(fā)出中斷請求ECT模塊可以捕捉到的電平變化包括上升沿、下降沿或任意沿。簡單的說就是可以捕捉任意一種變化,功能還是很強(qiáng)悍的。TCx寄存器(TimerInputCapture/OutputCompare0-7)在介紹輸出比較功能時(shí)已經(jīng)提到過。在這里,用來記錄外部事件發(fā)生時(shí)TCNT的值。通過讀取兩次相鄰事件TCx的值就可以計(jì)算出兩次事件的間隔時(shí)間了。TCTL3/TCTL4寄存器(TimerControlRegister3/4)定時(shí)器控制寄存器TCTL3和TCTL4中的EDGxB和EDGxA位決定通道x有效跳變邊沿是上升沿、下降沿或任意跳變。具體如何設(shè)置參見表格2的說明。表格2輸入捕捉跳變邊沿類型EDGxBEDGxA類型00禁止01上升沿10下降沿11任意跳變圖14TCTL3/TCTL4寄存器TCxH寄存器(TimerInputCaptureHoldingRegisters0-3)當(dāng)開啟輸入捕捉功能時(shí),對應(yīng)事件發(fā)生時(shí)TCNT的值會(huì)被拷貝到TCx寄存器中。對于輸入捕捉的前4個(gè)通道,在這個(gè)拷貝發(fā)生之前還要完成一件事情,就是將TCx的值拷貝到TCxH中。因此,當(dāng)輸入捕捉中斷發(fā)生時(shí),TCx中存儲的是發(fā)生當(dāng)前事件時(shí)的TCNT的值,TCxH中存放的則是上一次事件發(fā)生時(shí)TCNT的值。這兩個(gè)值的差可以計(jì)算出兩次事件間隔的時(shí)間。程序中還要使用到的寄存器包括TIOS寄存器(TimerInputCapture/OutputCompareSelect)、TSCR1寄存器(TimerSystemControlRegister1)、TFLG1寄存器(MainTimerInterruptFlag1)和TIE寄存器(TimerInterruptEnableRegister)。在前面的介紹中已經(jīng)提到過這些寄存器了,這里就不重復(fù)了。下面是例子程序的部分代碼,功能很簡單。連續(xù)捕捉十次上升沿對應(yīng)的TCNT,然后計(jì)算周期。cppview plaincopy1. #include/*commondefinesandmacros*/2. #includederivative.h/*derivative-specificdefinitions*/3. #includesci.h4. voidECTInit(void)5. 6. TIOS_IOS0=0;/channel0asoutputcompare7. TIE_C0I=1;/使能channel0中斷8. 9. TCTL4_EDG0A=1;10. TCTL4_EDG0B=0;/檢測上升沿11. 12. TSCR1_TEN=1;/timerenable13. 14. unsignedshortbuf11;15. charflag;16. voidmain(void)17. 18. longinterval=0;19. chari;20. SCIInit();21. SCISetBaudRate(SCI0,9600,8192000L);22. ECTInit();23. 24. EnableInterrupts;25. 26. flag=0;27. for(;)28. 29. if(flag=1)30. 31. for(i=0;i16);36. SCIPutShort(SCI0,interval&0xffff);37. 38. _FEED_COP();/*feedsthedog*/39. /*loopforever*/40. 41. 42. 43. interruptVectorNumber_Vtimch0voidECT_0_ISR(void)44. 45. staticinti=0;46. TFLG1=TFLG1_C0F_MASK;/clearchannel0interruptflag47. bufi+=TC0;48. if(i=11)49. 50. flag=1;51. i=0;52. TIE_C0I=0;/關(guān)閉中斷53. 54. 信號源還是采用 USBee AX,利用通道7 輸出的 7.8125KHz 方波。串口傳上來的數(shù)據(jù)為:10486簡單計(jì)算一下:T = 10486*1/8192.0/10 = 0.128 msf : 1/T = 7.815 KHz說明測量的結(jié)果還是很準(zhǔn)確的。實(shí)驗(yàn)6:模數(shù)遞減計(jì)數(shù)器MCCNT和定時(shí)中斷ECT模塊包含一個(gè)16位的模數(shù)遞減計(jì)數(shù)器計(jì)數(shù)寄存器MCCNT。MCCNT的輸入時(shí)鐘信號由BUSCLOCK分頻得到,分頻系數(shù)有四種選擇。每次時(shí)鐘到來后MCCNT自動(dòng)減1。當(dāng)MDC計(jì)數(shù)值減到0后,立即置位模數(shù)遞減計(jì)數(shù)器標(biāo)志寄存器MCFLG中的中斷標(biāo)志MCZF,若MCCTL中的中斷允許位MCZI=1,則向CPU發(fā)出中斷請求,向MCFLG的MCZF位寫1將清除該標(biāo)志。MCCNT有兩種工作方式:單次計(jì)數(shù)方式和循環(huán)(連續(xù))工作方式。由模數(shù)遞減計(jì)數(shù)器控制寄存器MCCTL中的模數(shù)模式允許位MODMC決定當(dāng)前工作方式。l當(dāng)MODMC=0時(shí)為單次計(jì)數(shù)方式,計(jì)數(shù)值減到$0000后便停止計(jì)數(shù)。如果再次將定時(shí)常數(shù)直接寫入計(jì)數(shù)寄存器MCCNT,MDC便又開始一次遞減計(jì)數(shù),減到0后停止。l當(dāng)MODMC=1時(shí)為循環(huán)(連續(xù))工作方式,計(jì)數(shù)值減到$0000后,自動(dòng)從加載寄存器加載定時(shí)常數(shù),并開始新一輪遞減計(jì)數(shù)。MCC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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

提交評論