试验2:输出比较功用(OutputCompare)
所谓输出比较功用便是依据需求设置输出比较寄存器的值,自在运转计数器的值与输出比较寄存器的值每隔4个总线周期比较一次,当两者持平时,会在规则的通道引脚上输出预订的电平。假如答应中止,会发生一次输出比较中止。
相应需求操作的寄存器有如下几个:
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 |
动作 |
---|---|---|
0 | 0 |
不输出 |
0 | 1 |
每次翻转OCx的电平 |
1 | 0 |
OCx=0 |
1 | 1 |
OCx=1 |
图9TCTL1/TCTL2寄存器
TFLG1寄存器(MainTimerInterruptFlag1)
用来标识中止条件发生了,对某一位写1则铲除对应位。
图 10 TFLG1寄存器
有了这些就可以开端第二个比如了。第二个比如使用通道0和通道1的输出比较功用。在TCNT=TC0时将对应的PT0管腿的输出电平翻转,而且发生相应中止。在TCNT=TC1时将对应的PT1管腿的输出电平翻转,而且发生相应中止。这样,PT0和PT1就会输出两个具有稳定相位差的同频方波信号了。
- #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抓下来的波形图。PortM0是在溢出中止中翻转的。PT0、PT1别离对应两个输出比较通道,两个上升沿的时刻距离为1/8192=1.22ms,丈量结果与理论值完全相同。
下面将程序做一个很小的修正。将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模块有些问题,在这种情况下只要通道0的中止可以呼应,通道1的中止无法呼应。