试验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为自在计数器时才有用,这点需求特别注意。