MC9S12XET256之ECT模块(5)

发布者:DreamySerenity最新更新时间:2021-08-10 来源: eefocus关键字:MC9S12XET256  ECT模块 手机看文章 扫描二维码
随时随地手机看文章

实验5:初识输入捕捉功能

所谓输入捕捉,简单的说就是感应输入引脚PTx上的电平的变化,如果发现电平变化,则:

l TCNT计数器的值被保存到到输入捕捉寄存器TCx中,状态标志位被置 1

l 如果中断允许,则向CPU发出中断请求

ECT 模块可以捕捉到的电平变化包括上升沿、下降沿或任意沿。简单的说就是可以捕捉任意一种变化,功能还是很强悍的。


TCx 寄存器(Timer Input Capture/Output Compare 0-7)


在介绍输出比较功能时已经提到过。在这里,用来记录外部事件发生时TCNT的值。通过读取两次相邻事件 TCx 的值就可以计算出两次事件的间隔时间了。


TCTL3/TCTL4 寄存器(Timer Control Register 3/4)


定时器控制寄存器TCTL3和TCTL4中的EDGxB和EDGxA位决定通道 x 有效跳变边沿是上升沿、下降沿或任意跳变。具体如何设置参见表格 2 的说明。

表格 2 输入捕捉跳变边沿类型


EDGxB

EDGxA

类型

0

0

禁止

0

1

上升沿

1

0

下降沿

1

1

任意跳变

图 14 TCTL3/TCTL4 寄存器


TCxH寄存器(Timer Input Capture Holding Registers 0-3)

当开启输入捕捉功能时,对应事件发生时TCNT的值会被拷贝到TCx 寄存器中。对于输入捕捉的前4个通道,在这个拷贝发生之前还要完成一件事情,就是将TCx 的值拷贝到TCxH中。因此,当输入捕捉中断发生时,TCx 中存储的是发生当前事件时 的TCNT 的值,TCxH 中存放的则是上一次事件发生时TCNT 的值。这两个值的差可以计算出两次事件间隔的时间。


程序中还要使用到的寄存器包括TIOS寄存器(Timer Input Capture/Output Compare Select)、TSCR1寄存器(Timer System Control Register 1)、TFLG1寄存器(Main T
imer Interrupt Flag 1)和TIE寄存器(Timer Interrupt Enable Register)。在前面的介绍中已经提到过这些寄存器了,这里就不重复了。

 

下面是例子程序的部分代码,功能很简单。连续捕捉十次上升沿对应的TCNT,然后计算周期。


#include       /* common defines and macros */

#include "derivative.h"      /* derivative-specific definitions */

#include "sci.h"

void ECTInit(void) 

{    

    TIOS_IOS0 = 0; // channel 0 as output compare

    TIE_C0I = 1;  // 使能 channel 0 中断

    

    TCTL4_EDG0A = 1;

    TCTL4_EDG0B = 0;  // 检测上升沿

    

    TSCR1_TEN  = 1;  //timer enable    

}

unsigned short buf[11];

char flag;

void main(void) 

{

    long interval = 0;

    char i;

    SCIInit();

    SCISetBaudRate (SCI0, 9600, 8192000L);

    ECTInit();

  

    EnableInterrupts;

    

    flag = 0;

    for(;;) 

    {

        if(flag == 1)

        {

            for( i = 0; i < 10; i++)

            {

                interval += buf[i+1] - buf[i];

            }

            SCIPutShort(SCI0, interval >> 16);

            SCIPutShort(SCI0, interval & 0xffff);

        }

        _FEED_COP(); /* feeds the dog */

    } /* loop forever */

}

                

                

interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void) 

{

    static int i = 0;

    TFLG1 = TFLG1_C0F_MASK;   //clear channel 0 interrupt flag

    buf[i++] = TC0;

    if (i == 11) 

    {

      flag = 1;

      i = 0;

      TIE_C0I = 0; //关闭中断

    }

}


信号源还是采用 USBee AX,利用通道7 输出的 7.8125KHz 方波

 

串口传上来的数据为:10486

简单计算一下:T = 10486*1/8192.0/10 = 0.128 ms

f : 1/T = 7.815 KHz


说明测量的结果还是很准确的。

关键字:MC9S12XET256  ECT模块 引用地址:MC9S12XET256之ECT模块(5)

上一篇:飞思卡尔s12系列CAN波特率计算
下一篇:MC9S12XET256之EETS4K

推荐阅读最新更新时间:2024-11-07 10:32

Atmega16输入捕捉功能的红外遥控器解码
//以下程序是利用T/C1的输入捕捉功能来实现红外解码 //用1838一体化万能接收头来对红外解码,1838的1脚接ICP1脚即 PD6脚(20脚),2脚接地,3脚接VCC //红外遥控器发出的信号是先发9.5ms高电平(也可能是4.5ms低电平)加4.5ms低电平的前导码, //其中0码由O.56ms高电平和0.56ms低电平组合而成.脉冲宽度为1.12ms;1码由0.56ms高电平和1.69ms低电平组合而成,脉冲宽度为2.25ms //但红外遥控器发出的红外信号经过1838处理后输出到单片机的信号却是相反的,因为1838没检测到红外信号时一直输出高电平,检测到红外信号后就输出低电平 //红外遥控器发出的红外信号经过1838处理
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved