您的位置:首页 > 其它

Freescale 9S12 系列单片机应用笔记(ECT 模块) 3

2012-06-04 20:30 501 查看

实验3:输出比较 7 通道的特殊功能

输出比较通道OC7 具有特殊的权限,可以废止其他输出比较通道的动作,直接决定各个输出通道的状态。这种特权功能是通过配置两个额外的寄存器OC7M和OC7D来实现的。

OC7M寄存器(Output Compare 7 Mask Register)

使OC7Mx=1,OC7强行参与管理通道x的输出,但通道OC7 对通道OC0~OC6的管理仅限于使其引脚PT0~PT6 清0或置1,不能将引脚电平翻转,引脚的动作来自于输出比较7数据寄存器OC7D中的对应位OC7Dx定义的电平状态,必须事先通过程序设置。



图 11 OC7M寄存器

OC7D寄存器(Output Compare 7 Data Register)

OC7Dx=0,则对应事件发生时相应PTx位将被输出为低电平,OC7Dx=1,则对应事件发生时相应PTx位将被输出为高电平。



图 12 OC7D寄存器
可以开始我们的实验了。这个实验将在PT0 管腿上输出一个占空比位1/4 的方波。实现方法为在 TCNT = 10000 时将 PT0 置为高电平,TCNT = 26384 时将PT0 置为低电平。下面是程序片段。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "sci.h"
void ECTInit(void) 
{
    //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8
    
    TIOS_IOS0 = 1; // channel 0 as output compare
    TC0 = 10000;
    TCTL2_OL0 = 1;
    TCTL2_OM0 = 1; // 使 channel 0 输出高电平
        
    TIOS_IOS7 = 1; // channel 7 as output compare
    TC7 = 26384;
    //TIE_C7I = 1;  // 使能 channel 7 中断
    
    OC7M_OC7M0 = 1;
    OC7D = 0;      // 使 channel 0 输出低电平
    
    TCTL1_OL7 = 0;
    TCTL1_OM7 = 0;
    
    TSCR2_TOI  = 1;  //timer overflow interrupt enable
    TSCR1_TEN  = 1;  //timer enable    
}
void main(void) 
{
    SCIInit();
    SCISetBaudRate (SCI0, 9600, 8192000L);
    ECTInit();
    DDRM_DDRM0 = 1;
    EnableInterrupts;
    
    for(;;) 
    {
        _FEED_COP(); /* feeds the dog */
    } /* loop forever */
}
                
                
interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void) 
{
    TFLG2 = TFLG2_TOF_MASK;  //clear timer overflow interrupt flag
    PTM_PTM0 = ~ PTM_PTM0;
}
interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void) 
{
    
    TFLG1 = TFLG1_C0F_MASK;   //clear channel 0 interrupt flag
}
interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void) 
{
    TFLG1 = TFLG1_C1F_MASK;    //clear channel 1 interrupt flag
}







利用这种方式可以模拟个 PWM 功能出来。不过模拟出来的PWM周期只有8种选择。

在第一篇应用笔记中,我提到过TCSR2寄存器有一位叫 TCRE。TCRE 位是 Timer Counter Reset Enable 的简写。TCRE 位为 0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。

下面将给出一个利用 TCRE的例子。同样是占空比25%,但是同时还调整了波形的周期。这个例子中,TC0 = 1000, TC7 = 4000。PT0 在1000时翻转一下,在4000时再翻转一下。同时4000时将TCNT值复位到0重新计数。这样波形的频率就成了 4000/8192000=4.88ms。

void ECTInit(void) 
{
    TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8
    
    TIOS_IOS0 = 1; // channel 0 as output compare
    TC0 = 1000;
    TIE_C0I = 1;  // 使能 channel 0 中断
    TCTL2_OL0 = 1;
    TCTL2_OM0 = 1; // 使 channel 0 输出高电平
        
    TIOS_IOS7 = 1; // channel 7 as output compare
    TC7 = 4000;
    TIE_C7I = 1;  // 使能 channel 7 中断
	TCTL1 = 0x40;
	
    OC7M_OC7M0 = 1;
    OC7D = 0;      // 使 channel 0 输出低电平
    
    TCTL1_OL7 = 0;
    TCTL1_OM7 = 0;
    
    TSCR1_TEN  = 1;  //timer enable    
}




上面是实际波形,这里出现了个有意思的现象。PM0 一直为低电平,这表明TCNT 的Overflow 中断没有进去。说明这个中断只有在 TCNT为自由计数器时才有用,这点需要特别注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: