Freescale 9S12 系列单片机应用笔记(ECT 模块) 3
实验3:输出比较7通道的特殊功能
输出比较通道OC7具有特殊的权限,可以废止其他输出比较通道的动作,直接决定各个输出通道的状态。这种特权功能是通过配置两个额外的寄存器OC7M和OC7D来实现的。
OC7M寄存器(OutputCompare7MaskRegister)
使OC7Mx=1,OC7强行参与管理通道x的输出,但通道OC7对通道OC0~OC6的管理仅限于使其引脚PT0~PT6清0或置1,不能将引脚电平翻转,引脚的动作来自于输出比较7数据寄存器OC7D中的对应位OC7Dx定义的电平状态,必须事先通过程序设置。
图11OC7M寄存器
OC7D寄存器(OutputCompare7DataRegister)
OC7Dx=0,则对应事件发生时相应PTx位将被输出为低电平,OC7Dx=1,则对应事件发生时相应PTx位将被输出为高电平。
图12OC7D寄存器
可以开始我们的实验了。这个实验将在PT0管腿上输出一个占空比位1/4的方波。实现方法为在TCNT=10000时将PT0置为高电平,TCNT=26384时将PT0置为低电平。下面是程序片段。
#include
/*commondefinesandmacros*/ - #include"derivative.h"/*derivative-specificdefinitions*/
- #include"sci.h"
voidECTInit(void)
- {
- //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
- TIOS_IOS0=1;//channel0asoutputcompare
- TC0=10000;
TCTL2_OL0=1;
- TCTL2_OM0=1;//使channel0输出高电平
- TIOS_IOS7=1;//channel7asoutputcompare
- TC7=26384;
- //TIE_C7I=1;//使能channel7中断
- OC7M_OC7M0=1;
- OC7D=0;//使channel0输出低电平
- TCTL1_OL7=0;
- TCTL1_OM7=0;
- TSCR2_TOI=1;//timeroverflowinterruptenable
- TSCR1_TEN=1;//timerenable
- }
- voidmain(void)
- {
- SCIInit();
- SCISetBaudRate(SCI0,9600,8192000L);
- ECTInit();
- DDRM_DDRM0=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)
- {
- TFLG1=TFLG1_C0F_MASK;//clearchannel0interruptflag
- }
- interruptVectorNumber_Vtimch1voidECT_1_ISR(void)
- {
- TFLG1=TFLG1_C1F_MASK;//clearchannel1interruptflag
- }
利用这种方式可以模拟个PWM功能出来。不过模拟出来的PWM周期只有8种选择。
在第一篇应用笔记中,我提到过TCSR2寄存器有一位叫TCRE。TCRE位是TimerCounterResetEnable的简写。TCRE位为0表示TCNT自由运行,TCRE位为1表示当TCNT=OC7时复位。
下面将给出一个利用TCRE的例子。同样是占空比25%,但是同时还调整了波形的周期。这个例子中,TC0=1000,TC7=4000。PT0在1000时翻转一下,在4000时再翻转一下。同时4000时将TCNT值复位到0重新计数。这样波形的频率就成了4000/8192000=4.88ms。
- voidECTInit(void)
- {
- TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
- TIOS_IOS0=1;//channel0asoutputcompare
- TC0=1000;
- TIE_C0I=1;//使能channel0中断
- TCTL2_OL0=1;
- TCTL2_OM0=1;//使channel0输出高电平
- TIOS_IOS7=1;//channel7asoutputcompare
- TC7=4000;
- TIE_C7I=1;//使能channel7中断
- TCTL1=0x40;
- OC7M_OC7M0=1;
- OC7D=0;//使channel0输出低电平
- TCTL1_OL7=0;
- TCTL1_OM7=0;
- TSCR1_TEN=1;//timerenable
- }
上面是实际波形,这里出现了个有意思的现象。PM0一直为低电平,这表明TCNT的Overflow中断没有进去。说明这个中断只有在TCNT为自由计数器时才有用,这点需要特别注意。
Freescale9S12系列单片机ECT模 相关文章: