Freescale 9S12 系列單片機(jī)應(yīng)用筆記(ECT 模塊) 2
實(shí)驗(yàn)2:輸出比較功能(OutputCompare)
所謂輸出比較功能就是根據(jù)需要設(shè)置輸出比較寄存器的值,自由運(yùn)行計(jì)數(shù)器的值與輸出比較寄存器的值每隔4個(gè)總線周期比較一次,當(dāng)兩者相等時(shí),會(huì)在規(guī)定的通道引腳上輸出預(yù)定的電平。如果允許中斷,會(huì)產(chǎn)生一次輸出比較中斷。
本文引用地址:http://www.ex-cimer.com/article/201611/318816.htm相應(yīng)需要操作的寄存器有如下幾個(gè):
TCx寄存器(TimerInputCapture/OutputCompare0-7)
總共8個(gè)16位寄存器,分別對(duì)應(yīng)8個(gè)輸出比較通道。當(dāng)TCx=TCNT時(shí)滿足輸出比較條件,這時(shí)根據(jù)程序設(shè)置在對(duì)應(yīng)輸出管腿輸出特定的電平(具體方法見(jiàn)TCTL1/TCTL2寄存器的功能設(shè)置)或者產(chǎn)生對(duì)應(yīng)的中斷事件。
TIOS寄存器(TimerInputCapture/OutputCompareSelect)
用來(lái)設(shè)定某一通道是輸入捕捉功能還是輸出比較功能。IOSx=1對(duì)應(yīng)位為輸出比較功能,IOSx=0對(duì)應(yīng)位為輸入捕捉功能。
圖7TIOS寄存器
TIE寄存器(TimerInterruptEnableRegister)
其中某一位置1后則使能相應(yīng)的通道的中斷,這里控制的中斷既包括輸出比較中斷也包括后面要介紹的輸入捕捉中斷。
圖8TIE寄存器
TCTL1/TCTL2寄存器(TimerControlRegister1/2)
用來(lái)決定輸出比較時(shí)的輸出模式和輸出電平。具體參見(jiàn)表格1。
表格1輸出比較動(dòng)作
OMx | OLx | 動(dòng)作 |
---|---|---|
0 | 0 | 不輸出 |
0 | 1 | 每次翻轉(zhuǎn)OCx的電平 |
1 | 0 | OCx=0 |
1 | 1 | OCx=1 |
圖9TCTL1/TCTL2寄存器
TFLG1寄存器(MainTimerInterruptFlag1)
用來(lái)標(biāo)識(shí)中斷條件發(fā)生了,對(duì)某一位寫(xiě)1則清除對(duì)應(yīng)位。
圖 10 TFLG1寄存器
有了這些就可以開(kāi)始第二個(gè)例子了。第二個(gè)例子利用通道0和通道1的輸出比較功能。在TCNT=TC0時(shí)將對(duì)應(yīng)的PT0管腿的輸出電平翻轉(zhuǎn),并且產(chǎn)生相應(yīng)中斷。在TCNT=TC1時(shí)將對(duì)應(yīng)的PT1管腿的輸出電平翻轉(zhuǎn),并且產(chǎn)生相應(yīng)中斷。這樣,PT0和PT1就會(huì)輸出兩個(gè)具有恒定相位差的同頻方波信號(hào)了。
- #include
/*commondefinesandmacros*/ - #include"derivative.h"/*derivative-specificdefinitions*/
- #include"sci.h"
- voidECTInit(void)
- {
- //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
- TSCR2_TOI=1;//timeroverflowinterruptenable
- TSCR1_TEN=1;//timerenable
- TIOS_IOS0=1;//channel0asoutputcompare
- TIOS_IOS1=1;//channel1asoutputcompare
- TC0=10000;
- TC1=20000;
- TIE_C0I=1;//使能channel0中斷
- TIE_C1I=1;//使能channel1中斷
- TCTL2_OL0=1;
- TCTL2_OM0=0;
- TCTL2_OL1=1;
- TCTL2_OM1=0;
- }
- voidmain(void)
- {
- SCIInit();
- SCISetBaudRate(SCI0,9600,8192000L);
- ECTInit();
- DDRM_DDRM0=1;
- DDRM_DDRM1=1;
- DDRM_DDRM2=1;
- EnableInterrupts;
- for(;;)
- {
- _FEED_COP();/*feedsthedog*/
- }/*loopforever*/
- }
- interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
- {
- TFLG2=TFLG2_TOF_MASK;//cleartimeroverflowinterruptflag
- PTM_PTM0=~PTM_PTM0;
- }
- interruptVectorNumber_Vtimch0voidECT_0_ISR(void)
- {
- unsignedintvalue;
- TFLG1=TFLG1_C0F_MASK;//clearchannel0interruptflag
- PTM_PTM1=~PTM_PTM1;
- }
- interruptVectorNumber_Vtimch1voidECT_1_ISR(void)
- {
- TFLG1=TFLG1_C1F_MASK;//clearchannel1interruptflag
- PTM_PTM2=~PTM_PTM2;
- }
- interruptVectorNumber_Vtimch7voidECT_7_ISR(void)
- {
- TFLG1=TFLG1_C7F_MASK;//clearchannel7interruptflag
- }
下面是用USBee抓下來(lái)的波形圖。PortM0是在溢出中斷中翻轉(zhuǎn)的。PT0、PT1分別對(duì)應(yīng)兩個(gè)輸出比較通道,兩個(gè)上升沿的時(shí)間間隔為1/8192=1.22ms,測(cè)量結(jié)果與理論值完全相同。
下面將程序做一個(gè)很小的修改。將TC0和TC1的值改成相同的。
- voidECTInit(void)
- {
- //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
- TSCR2_TOI=1;//timeroverflowinterruptenable
- TSCR1_TEN=1;//timerenable
- TIOS_IOS0=1;//channel0asoutputcompare
- TIOS_IOS1=1;//channel1asoutputcompare
- TC0=10000;
- TC1=10000;
- TIE_C0I=1;//使能channel0中斷
- TIE_C1I=1;//使能channel1中斷
- TCTL2_OL0=1;
- TCTL2_OM0=0;
- TCTL2_OL1=1;
- TCTL2_OM1=0;
- }
從波形圖中可以看出,輸出是正常的。但是有些低版本的ECT模塊有些問(wèn)題,在這種情況下只有通道0的中斷能夠響應(yīng),通道1的中斷無(wú)法響應(yīng)。
評(píng)論