MC9S12XS128之时间模块TIM(2)输出比较XS128的定时器模块中的输入捕捉和输出比较共用同一组管脚。可以通过设置TIOS寄存器来选择。我觉得输出比较的原理和PWM波的产生原理差不多,都是通过计数器的数值和某一寄存器里的值比较产生输出的高低电平变化。在输出比较中,当计数器的值与某一输出比较通道的TCx(TC0~TC7)的值相等时,该通道上引脚会输出高电平、低电平,或是对引脚上的电平进行翻转。这时标志位CxF会置位,如果开通中断的话(TIE中的CxI=1),系统还会产生一个中断。输出比较用到的寄存器好多都是和输入捕捉的一样,现在按照输出比较的程序需要再过一遍。定时器系统控制寄存器TSCR1:设置定时器正常工作定时器系统控制寄存器TSCR2:设置定时器溢出中断允许,和定时器时钟分频设置定时器计数寄存器TCNT:这是个16位寄存器,在一般情况下是不可以写的。输入捕捉时,就是这个寄存器的值存入TCx中,输出比较时,也是这个寄存器的值与TCx的值比较。它的时钟由TSCR2设置的分频决定。程序中这个寄存器一般情况下不用理会。主定时器国断标志寄存器TFLG2:在这个寄存器中只有最高位TOF有效,是定时器溢出标志位。当TCNT运行产生溢出时,该位就置位了。如果允许定时器溢出中断的话,则系统会产生一个中断。输入捕捉和输出比较选择寄存器TIOS:设置相应的通道为输入捕捉或是输出比较。主定时器中断标志寄存器TFLG1:输入捕捉或输出比较的各通道的中断标志位。对相应的通道写1,可以清除标志位。定时器中断允许寄存器TIE:里面有8位,对应输入捕捉或输出比较的8个通道,设置是否允许相应通道的中断。通道寄存器TC0~TC7:在输出比较中随时可以写入,它的作用是,当TCx=TCNT时,相应的x通道就会发生输出比较。此时相应的引脚就可以输出高电平、低电平,或是翻转引脚的电平。上面的寄存器都是和输入捕捉共用的,在输入捕捉中讲过。接下来就具体说明输出比较特别有的寄存器设置。TCTL1~TCTL2:这个两个寄存器中每个OMx和OLx组合在一起,来设置相应通道的引脚电平输出方式:(00):输出比较的通道与引脚逻辑断开,也就是输出比较的输出不会影响相应的引脚的电平。(01):翻转输出比较的引脚的电平。(10):在相应的引脚上输出低电平。(11):在相应的引脚上输出高电平。CFORC:定时器强制输出比较寄存器相应位置1时,可以把相应通道的输出比较设为强制输出比较。一般情况下不用。OC7M:输出比较通道7屏蔽寄存器OC7D:输出比较通道7数据寄存器通道7上的连续输出比较会覆盖所有其他通道的引脚上的输出结果。OC7M就是设置其他通道的哪些通道会受通道7控制的。当OC7M的某位置1时,相应通道的输出比较就会受通道7控制,此时受控的通道在其通道上设置的OMx和OLx无效了,而是按照OC7D中对应的OC7Dx中的值输出到相应的引脚上。总的来说,OC7M是选择受通道7控制的其他通道,而OC7D是受控的通道在通道7发生输出比较时的输出结果。TTOV:定时器溢出翻转寄存器相应通道置1时,计数器溢出时,允许翻转输出比较引脚上的电平。这个寄存器只在输出比较模式下才有效。一般情况下,用不到这个寄存器,程序中不用做设置。OCPD(OCPD0~OCPD7):当相应位置1时,标志位正常,但是输出比较的结果不能输出到引脚上,也就是输出比较的寄存器与引脚逻辑断开了。当相应位设为0时,标志位正常,引脚输出也正常。下面是相应的程序:#includehidef.h#includederivative.hvoidmain(void){DDRB=0XFF;PORTB=0X7F;//DisableInterrupts;TSCR2=0X07;//设置定时器分频TIOS=0X01;//通道0为输出比较TCTL2=0X01;//模式为翻转引脚输出电平TC0=0XAAAA;//设置输出引脚在一个周期内翻转的时间,//如果这个值保持不变的话,那总的来看,//引脚输出电平的周期是不变的,周期等于计数器计数一周的时间//TTOV=0X00;////CFORC=0X01;//加上这一句,似乎没什么影响。还没清这个寄存器的具体作用。TIE=0X01;//相应通道中断允许TSCR1=0X80;//打开定时器//PORTB=PTT;EnableInterrupts;while(1);}#pragmaCODE_SEG__NEAR_SEGNON_BANKEDinterruptvoidinterrupt8CH0_ISR(void)//要特别注意中断函数的书写格式,我就在这里吃了大亏{DisableInterrupts;TFLG1=0x01;//清零标志位if(TC0==0xAAAA)//改变引脚输出的占空比。输出的周期由计数器计数一//周的时间决定,要改变,只能改变定时器的时钟分频TC0=0xffff;elseTC0=0xAAAA;PORTB_PB7=~PORTB_PB7;//测试是否进入中断EnableInterrupts;}——BYDABAO