新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Freescale 9S12 系列單片機應用筆記(ECT 模塊) 2

        Freescale 9S12 系列單片機應用筆記(ECT 模塊) 2

        作者: 時間:2016-11-20 來源:網絡 收藏

        實驗2:輸出比較功能(OutputCompare)

        所謂輸出比較功能就是根據需要設置輸出比較寄存器的值,自由運行計數器的值與輸出比較寄存器的值每隔4個總線周期比較一次,當兩者相等時,會在規定的通道引腳上輸出預定的電平。如果允許中斷,會產生一次輸出比較中斷。

        本文引用地址:http://www.104case.com/article/201611/318816.htm

        相應需要操作的寄存器有如下幾個:

        TCx寄存器(TimerInputCapture/OutputCompare0-7)

        總共8個16位寄存器,分別對應8個輸出比較通道。當TCx=TCNT時滿足輸出比較條件,這時根據程序設置在對應輸出管腿輸出特定的電平(具體方法見TCTL1/TCTL2寄存器的功能設置)或者產生對應的中斷事件。

        TIOS寄存器(TimerInputCapture/OutputCompareSelect)

        用來設定某一通道是輸入捕捉功能還是輸出比較功能。IOSx=1對應位為輸出比較功能,IOSx=0對應位為輸入捕捉功能。

        圖7TIOS寄存器

        TIE寄存器(TimerInterruptEnableRegister)

        其中某一位置1后則使能相應的通道的中斷,這里控制的中斷既包括輸出比較中斷也包括后面要介紹的輸入捕捉中斷。

        圖8TIE寄存器

        TCTL1/TCTL2寄存器(TimerControlRegister1/2)

        用來決定輸出比較時的輸出模式和輸出電平。具體參見表格1。

        表格1輸出比較動作

        OMx

        OLx

        動作

        00

        不輸出

        01

        每次翻轉OCx的電平

        10

        OCx=0

        11

        OCx=1

        圖9TCTL1/TCTL2寄存器

        TFLG1寄存器(MainTimerInterruptFlag1)

        用來標識中斷條件發生了,對某一位寫1則清除對應位。

        圖 10 TFLG1寄存器

        有了這些就可以開始第二個例子了。第二個例子利用通道0和通道1的輸出比較功能。在TCNT=TC0時將對應的PT0管腿的輸出電平翻轉,并且產生相應中斷。在TCNT=TC1時將對應的PT1管腿的輸出電平翻轉,并且產生相應中斷。這樣,PT0和PT1就會輸出兩個具有恒定相位差的同頻方波信號了。


        1. #include/*commondefinesandmacros*/
        2. #include"derivative.h"/*derivative-specificdefinitions*/
        3. #include"sci.h"
        4. voidECTInit(void)
        5. {
        6. //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
        7. TSCR2_TOI=1;//timeroverflowinterruptenable
        8. TSCR1_TEN=1;//timerenable
        9. TIOS_IOS0=1;//channel0asoutputcompare
        10. TIOS_IOS1=1;//channel1asoutputcompare
        11. TC0=10000;
        12. TC1=20000;
        13. TIE_C0I=1;//使能channel0中斷
        14. TIE_C1I=1;//使能channel1中斷
        15. TCTL2_OL0=1;
        16. TCTL2_OM0=0;
        17. TCTL2_OL1=1;
        18. TCTL2_OM1=0;
        19. }
        20. voidmain(void)
        21. {
        22. SCIInit();
        23. SCISetBaudRate(SCI0,9600,8192000L);
        24. ECTInit();
        25. DDRM_DDRM0=1;
        26. DDRM_DDRM1=1;
        27. DDRM_DDRM2=1;
        28. EnableInterrupts;
        29. for(;;)
        30. {
        31. _FEED_COP();/*feedsthedog*/
        32. }/*loopforever*/
        33. }
        34. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
        35. {
        36. TFLG2=TFLG2_TOF_MASK;//cleartimeroverflowinterruptflag
        37. PTM_PTM0=~PTM_PTM0;
        38. }
        39. interruptVectorNumber_Vtimch0voidECT_0_ISR(void)
        40. {
        41. unsignedintvalue;
        42. TFLG1=TFLG1_C0F_MASK;//clearchannel0interruptflag
        43. PTM_PTM1=~PTM_PTM1;
        44. }
        45. interruptVectorNumber_Vtimch1voidECT_1_ISR(void)
        46. {
        47. TFLG1=TFLG1_C1F_MASK;//clearchannel1interruptflag
        48. PTM_PTM2=~PTM_PTM2;
        49. }
        50. interruptVectorNumber_Vtimch7voidECT_7_ISR(void)
        51. {
        52. TFLG1=TFLG1_C7F_MASK;//clearchannel7interruptflag
        53. }

        下面是用USBee抓下來的波形圖。PortM0是在溢出中斷中翻轉的。PT0、PT1分別對應兩個輸出比較通道,兩個上升沿的時間間隔為1/8192=1.22ms,測量結果與理論值完全相同。

        下面將程序做一個很小的修改。將TC0和TC1的值改成相同的。

        1. voidECTInit(void)
        2. {
        3. //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
        4. TSCR2_TOI=1;//timeroverflowinterruptenable
        5. TSCR1_TEN=1;//timerenable
        6. TIOS_IOS0=1;//channel0asoutputcompare
        7. TIOS_IOS1=1;//channel1asoutputcompare
        8. TC0=10000;
        9. TC1=10000;
        10. TIE_C0I=1;//使能channel0中斷
        11. TIE_C1I=1;//使能channel1中斷
        12. TCTL2_OL0=1;
        13. TCTL2_OM0=0;
        14. TCTL2_OL1=1;
        15. TCTL2_OM1=0;
        16. }



        從波形圖中可以看出,輸出是正常的。但是有些低版本的ECT模塊有些問題,在這種情況下只有通道0的中斷能夠響應,通道1的中斷無法響應。




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 广饶县| 乌审旗| 隆回县| 高碑店市| 宁国市| 二连浩特市| 特克斯县| 衢州市| 渝北区| 罗城| 元氏县| 治县。| 莱州市| 灵武市| 定日县| 玉山县| 陈巴尔虎旗| 元江| 高要市| 扎兰屯市| 延寿县| 大理市| 二连浩特市| 巴林右旗| 湛江市| 子长县| 七台河市| 丹寨县| 广安市| 麦盖提县| 霸州市| 太湖县| 松滋市| 繁昌县| 封开县| 当涂县| 石柱| 连州市| 临江市| 渭源县| 益阳市|