微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Freescale 9S12 系列单片机应用笔记(ECT 模块) 3

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

时间:11-20 来源:互联网 点击:

实验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置为低电平。下面是程序片段。

  1. #include/*commondefinesandmacros*/

  2. #include"derivative.h"/*derivative-specificdefinitions*/
  3. #include"sci.h"

    voidECTInit(void)

  4. {
  5. //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
  6. TIOS_IOS0=1;//channel0asoutputcompare
  7. TC0=10000;

    TCTL2_OL0=1;

  8. TCTL2_OM0=1;//使channel0输出高电平
  9. TIOS_IOS7=1;//channel7asoutputcompare
  10. TC7=26384;
  11. //TIE_C7I=1;//使能channel7中断
  12. OC7M_OC7M0=1;
  13. OC7D=0;//使channel0输出低电平
  14. TCTL1_OL7=0;
  15. TCTL1_OM7=0;
  16. TSCR2_TOI=1;//timeroverflowinterruptenable
  17. TSCR1_TEN=1;//timerenable
  18. }
  19. voidmain(void)
  20. {
  21. SCIInit();
  22. SCISetBaudRate(SCI0,9600,8192000L);
  23. ECTInit();
  24. DDRM_DDRM0=1;
  25. EnableInterrupts;
  26. for(;;)
  27. {
  28. _FEED_COP();/*feedsthedog*/
  29. }/*loopforever*/
  30. }
  31. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
  32. {
  33. TFLG2=TFLG2_TOF_MASK;//cleartimeroverflowinterruptflag
  34. PTM_PTM0=~PTM_PTM0;
  35. }

    interruptVectorNumber_Vtimch0voidECT_0_ISR(void)

  36. {
  37. TFLG1=TFLG1_C0F_MASK;//clearchannel0interruptflag
  38. }
  39. interruptVectorNumber_Vtimch1voidECT_1_ISR(void)
  40. {
  41. TFLG1=TFLG1_C1F_MASK;//clearchannel1interruptflag
  42. }

利用这种方式可以模拟个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。

  1. voidECTInit(void)
  2. {
  3. TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
  4. TIOS_IOS0=1;//channel0asoutputcompare
  5. TC0=1000;
  6. TIE_C0I=1;//使能channel0中断
  7. TCTL2_OL0=1;
  8. TCTL2_OM0=1;//使channel0输出高电平
  9. TIOS_IOS7=1;//channel7asoutputcompare
  10. TC7=4000;
  11. TIE_C7I=1;//使能channel7中断
  12. TCTL1=0x40;
  13. OC7M_OC7M0=1;
  14. OC7D=0;//使channel0输出低电平
  15. TCTL1_OL7=0;
  16. TCTL1_OM7=0;
  17. TSCR1_TEN=1;//timerenable
  18. }

上面是实际波形,这里出现了个有意思的现象。PM0一直为低电平,这表明TCNT的Overflow中断没有进去。说明这个中断只有在TCNT为自由计数器时才有用,这点需要特别注意。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top