您的位置 首页 被动

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

实验2:输出比较功能(OutputCompare)所谓输出比较功能就是根据需要设置输出比较寄存器的值,自由运行计数器的值与输出比较寄存器的值每隔…

试验2:输出比较功用(OutputCompare)

所谓输出比较功用便是依据需求设置输出比较寄存器的值,自在运转计数器的值与输出比较寄存器的值每隔4个总线周期比较一次,当两者持平时,会在规则的通道引脚上输出预订的电平。假如答应中止,会发生一次输出比较中止。

相应需求操作的寄存器有如下几个:

TCx寄存器(TimerInputCapture/OutputCompare0-7)

一共8个16位寄存器,别离对应8个输出比较通道。当TCx=TCNT时分量输出比较条件,这时依据程序设置在对应输出管腿输出特定的电平(详细方法见TCTL1/TCTL2寄存器的功用设置)或许发生对应的中止事情。

TIOS寄存器(TimerInputCapture/OutputCompareSelect)

用来设定某一通道是输入捕捉功用仍是输出比较功用。IOSx=1对应位为输出比较功用,IOSx=0对应位为输入捕捉功用。

图7TIOS寄存器

TIE寄存器(TimerInterruptEnableRegister)

其间某一方位1后则使能相应的通道的中止,这儿操控的中止既包含输出比较中止也包含后边要介绍的输入捕捉中止。

图8TIE寄存器

TCTL1/TCTL2寄存器(TimerControlRegister1/2)

用来决议输出比较时的输出形式和输出电平。详细拜见表格1。

表格1输出比较动作

OMx

OLx

动作

0 0

不输出

0 1

每次翻转OCx的电平

1 0

OCx=0

1 1

OCx=1

图9TCTL1/TCTL2寄存器

TFLG1寄存器(MainTimerInterruptFlag1)

用来标识中止条件发生了,对某一位写1则铲除对应位。

图 10 TFLG1寄存器

有了这些就可以开端第二个比如了。第二个比如使用通道0和通道1的输出比较功用。在TCNT=TC0时将对应的PT0管腿的输出电平翻转,而且发生相应中止。在TCNT=TC1时将对应的PT1管腿的输出电平翻转,而且发生相应中止。这样,PT0和PT1就会输出两个具有稳定相位差的同频方波信号了。

  1. #include/*commondefinesandmacros*/
  2. #include”derivative.h”/*derivative-specificdefinitions*/
  3. #include”sci.h”
  4. voidECTInit(void)
  5. {
  6. //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
  7. TSCR2_TOI=1;//timeroverflowinterruptenable
  8. TSCR1_TEN=1;//timerenable
  9. TIOS_IOS0=1;//channel0asoutputcompare
  10. TIOS_IOS1=1;//channel1asoutputcompare
  11. TC0=10000;
  12. TC1=20000;
  13. TIE_C0I=1;//使能channel0中止
  14. TIE_C1I=1;//使能channel1中止
  15. TCTL2_OL0=1;
  16. TCTL2_OM0=0;
  17. TCTL2_OL1=1;
  18. TCTL2_OM1=0;
  19. }
  20. voidmain(void)
  21. {
  22. SCIInit();
  23. SCISetBaudRate(SCI0,9600,8192000L);
  24. ECTInit();
  25. DDRM_DDRM0=1;
  26. DDRM_DDRM1=1;
  27. DDRM_DDRM2=1;
  28. EnableInterrupts;
  29. for(;;)
  30. {
  31. _FEED_COP();/*feedsthedog*/
  32. }/*loopforever*/
  33. }
  34. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
  35. {
  36. TFLG2=TFLG2_TOF_MASK;//cleartimeroverflowinterruptflag
  37. PTM_PTM0=~PTM_PTM0;
  38. }
  39. interruptVectorNumber_Vtimch0voidECT_0_ISR(void)
  40. {
  41. unsignedintvalue;
  42. TFLG1=TFLG1_C0F_MASK;//clearchannel0interruptflag
  43. PTM_PTM1=~PTM_PTM1;
  44. }
  45. interruptVectorNumber_Vtimch1voidECT_1_ISR(void)
  46. {
  47. TFLG1=TFLG1_C1F_MASK;//clearchannel1interruptflag
  48. PTM_PTM2=~PTM_PTM2;
  49. }
  50. interruptVectorNumber_Vtimch7voidECT_7_ISR(void)
  51. {
  52. TFLG1=TFLG1_C7F_MASK;//clearchannel7interruptflag
  53. }

下面是用USBee抓下来的波形图。PortM0是在溢出中止中翻转的。PT0、PT1别离对应两个输出比较通道,两个上升沿的时刻距离为1/8192=1.22ms,丈量结果与理论值完全相同。

下面将程序做一个很小的修正。将TC0和TC1的值改成相同的。

  1. voidECTInit(void)
  2. {
  3. //TSCR2_PR=7;//prescalefactoris8,busclock/128=8Mhz/8
  4. TSCR2_TOI=1;//timeroverflowinterruptenable
  5. TSCR1_TEN=1;//timerenable
  6. TIOS_IOS0=1;//channel0asoutputcompare
  7. TIOS_IOS1=1;//channel1asoutputcompare
  8. TC0=10000;
  9. TC1=10000;
  10. TIE_C0I=1;//使能channel0中止
  11. TIE_C1I=1;//使能channel1中止
  12. TCTL2_OL0=1;
  13. TCTL2_OM0=0;
  14. TCTL2_OL1=1;
  15. TCTL2_OM1=0;
  16. }

从波形图中可以看出,输出是正常的。可是有些低版本的ECT模块有些问题,在这种情况下只要通道0的中止可以呼应,通道1的中止无法呼应。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/264169.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部