查看: 3618|回复: 8

[其他] 急!!有关输入捕获问题

[复制链接]

该用户从未签到

2

主题

25

帖子

0

新手上路

Rank: 1

积分
36
最后登录
1970-1-1
发表于 2011-7-17 22:37:11 | 显示全部楼层 |阅读模式
小弟想用s12dp512的输入捕获功能测试一个脉冲的频率(0~5khz作用变化),想采用队列模式,每一个下降沿都触发中断,两次之间的计数n=count*65536+TC0H-TC0(其中count为两次中断间的溢出次数),我的ICSYS设为0x02。后来发现频率值算的有时候会出现错误,用串口将TC0H和TC0的数值发出来后发现,保持寄存器的数值并不等于上次中断的时候的通道寄存器的值,好像并不是每次下降沿都触发中断的样子,哪位知道这是为什么啊?
我知道答案 目前已有7人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-18 09:29:42 | 显示全部楼层

    RE:急!!有关输入捕获问题

    TC0H-TC0是一直在变的,想要得到正确的值,就要在进入中断以后输出这2个值。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2011-7-18 14:16:38 | 显示全部楼层

    回复:急!!有关输入捕获问题

    回复第 2 楼 安于2011-07-18 01:29:42发表:
    TC0H-TC0是一直在变的,想要得到正确的值,就要在进入中断以后输出这2个值。 

    先谢谢您的回答。恩,我是在中断里面将TC0和TC0H分别赋给了first和second(参考网上的一个例程),然后用它俩相减的,但是从结果看好像并不是每个下降沿都进入了中断,因为从first和second的值观察明显有些时候这两次计数之间是没有溢出的,但是count却等于1,说明第一个下降沿前面有一次溢出(count=1),第一个下降沿到的时候TC0收到了数,但是貌似没有给TC0H,并且没有产生中断,到第二个下降沿才产生了中断,这时溢出数count=1,但显然两次下降沿之间没有中断的,所以就计算错了,我的问题是我明明设置的ICSYS=0x02,这样不是每次都应该触发中断吗?
    中断处理程序如下:
    #pragma CODE_SEG __NEAR_SEG NON_BANKED
    void interrupt 8  CH0IC(void)
    {
          first=ECT_TC0H;
         second=ECT_TC0;
         n=count*65536+second-first;
        lc.fr=f1/n;//fr为脉冲频率,f1为总线频率分频后的值
       put_char(lc.ch[0]);//串口发送频率
       put_char(lc.ch[1]);
      ECT_TFLG1=0X01;
    count=0;
    }
     interrupt 16 void TOI(void)
    {
    count++;
    ECT_TFLG2_TOF=1;
    }
     
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-18 15:18:04 | 显示全部楼层

    RE:急!!有关输入捕获问题

    ICSYS=0x02应该是0x03,你这也试试。另外count只有在溢出以后才会+1,你可以使用断点的方式,看看每次下降沿是不是都能进入中断。还有,不看你的程序配置,不知道当前是否正确。能不能把你配置的代码发出来?
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2011-7-18 16:01:33 | 显示全部楼层

    回复:急!!有关输入捕获问题

    回复第 4 楼 安于2011-07-18 07:18:04发表:
    ICSYS=0x02应该是0x03,你这也试试。另外count只有在溢出以后才会+1,你可以使用断点的方式,看看每次下降沿是不是都能进入中断。还有,不看你的程序配置,不知道当前是否正确。能不能把你配置的代码发出来? 

    我的代码是这样写的:
    #include       /* common defines and macros */
    #include "derivative.h"      /* derivative-specific definitions */
    #pragma LINK_INFO DERIVATIVE "MC9S12XEP100"
    unsigned int count=0;
    unsigned long f1=500000,first=0,second=0,n,N;
    union inttochar{ //定义共同体,用于串口发送int型16位数据
       int fr ;
     char ch[2];
    }lc;
    /****************
         初始化串口6
         ************/
    void SCI_Init(void)
    {   unsigned char t;
        //定义波特率Bt=9600,SCI6BD=fBUS/(16*Bt),晶振频率4mhz
        SCI6BDL = 0x0d;    //须先给低8位赋值,总线频率2MHz
        SCI6BDH = 0x00;    //再给高8位赋值
        SCI6CR1 = 0x00;    //设置允许SCI,正常码输出,8位数据,无校验
        t = SCI6DRL;       //读数据寄存器(清0)
       
        t = SCI6SR1;       //读状态寄存器(清0)
        SCI6CR2 = 0x0C;    //允许SCI6接收和发送 查询方式
       }
       /****************
         串口发送程序
         ************/
      
    void put_char (char c) {
                     
    while((SCI6SR1 & 0X80)==0);//SCI6SR1的loops置0,正常模式,即当SCI6SR1.7=0时,等待
    SCI6DRL=c;
     
    }
    /****************
         初始化IC
         ************/
    void IC_Init(void)
    {
    ECT_TSCR2=0X82; //溢出中断,4分频
    ECT_TIOS=0XFE; //设定pt0输入捕捉口
    ECT_TCTL4=0X02;
    ECT_ICSYS=0X02;
    ECT_TIE=0X01;
    ECT_TSCR1=0X80;
    }
    void main(void)
    {

    DisableInterrupts;
    SCI_Init();
    IC_Init();
    EnableInterrupts;
    for(;;);

    }
    #pragma CODE_SEG __NEAR_SEG NON_BANKED
    void interrupt 8  CH0IC(void)
    {first=ECT_TC0H;
    second=ECT_TC0;
    n=count*65536+second-first;
    lc.fr=f1/n;
    put_char(lc.ch[0]);
    put_char(lc.ch[1]);
    ECT_TFLG1=0X01;
    count=0;
    }
     interrupt 16 void TOI(void)
    {
    count++;
    ECT_TFLG2_TOF=1;
    }
    这样写在遇到有溢出的时候就可能会出问题,那个频率就不是正常频率了,原因就是n多加了一个65536.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2011-7-18 16:01:56 | 显示全部楼层

    回复:急!!有关输入捕获问题

    回复第 4 楼 安于2011-07-18 07:18:04发表:
    ICSYS=0x02应该是0x03,你这也试试。另外count只有在溢出以后才会+1,你可以使用断点的方式,看看每次下降沿是不是都能进入中断。还有,不看你的程序配置,不知道当前是否正确。能不能把你配置的代码发出来? 

    我的代码是这样写的:
    #include       /* common defines and macros */
    #include "derivative.h"      /* derivative-specific definitions */
    #pragma LINK_INFO DERIVATIVE "MC9S12XEP100"
    unsigned int count=0;
    unsigned long f1=500000,first=0,second=0,n,N;
    union inttochar{ //定义共同体,用于串口发送int型16位数据
       int fr ;
     char ch[2];
    }lc;
    /****************
         初始化串口6
         ************/
    void SCI_Init(void)
    {   unsigned char t;
        //定义波特率Bt=9600,SCI6BD=fBUS/(16*Bt),晶振频率4mhz
        SCI6BDL = 0x0d;    //须先给低8位赋值,总线频率2MHz
        SCI6BDH = 0x00;    //再给高8位赋值
        SCI6CR1 = 0x00;    //设置允许SCI,正常码输出,8位数据,无校验
        t = SCI6DRL;       //读数据寄存器(清0)
       
        t = SCI6SR1;       //读状态寄存器(清0)
        SCI6CR2 = 0x0C;    //允许SCI6接收和发送 查询方式
       }
       /****************
         串口发送程序
         ************/
      
    void put_char (char c) {
                     
    while((SCI6SR1 & 0X80)==0);//SCI6SR1的loops置0,正常模式,即当SCI6SR1.7=0时,等待
    SCI6DRL=c;
     
    }
    /****************
         初始化IC
         ************/
    void IC_Init(void)
    {
    ECT_TSCR2=0X82; //溢出中断,4分频
    ECT_TIOS=0XFE; //设定pt0输入捕捉口
    ECT_TCTL4=0X02;
    ECT_ICSYS=0X02;
    ECT_TIE=0X01;
    ECT_TSCR1=0X80;
    }
    void main(void)
    {

    DisableInterrupts;
    SCI_Init();
    IC_Init();
    EnableInterrupts;
    for(;;);

    }
    #pragma CODE_SEG __NEAR_SEG NON_BANKED
    void interrupt 8  CH0IC(void)
    {first=ECT_TC0H;
    second=ECT_TC0;
    n=count*65536+second-first;
    lc.fr=f1/n;
    put_char(lc.ch[0]);
    put_char(lc.ch[1]);
    ECT_TFLG1=0X01;
    count=0;
    }
     interrupt 16 void TOI(void)
    {
    count++;
    ECT_TFLG2_TOF=1;
    }
    这样写在遇到有溢出的时候就可能会出问题,那个频率就不是正常频率了,原因就是n多加了一个65536.
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-19 15:34:34 | 显示全部楼层

    RE:急!!有关输入捕获问题

    void ECT_Init(void)
    {   
        ECT_PACTL=0X50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
        ECT_TCTL3=0xc0;//c-输入捕捉7任何沿有效,            
        ECT_TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿      
        ECT_TIE  =0x00;//每一位对应相应通道中断允许,0表示禁止中断
        ECT_TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
        ECT_TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
    }  
    你看看中断代码,可以使用的,就是需要修改一下。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    25

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2011-7-19 19:04:13 | 显示全部楼层

    回复:急!!有关输入捕获问题

    回复第 7 楼 安于2011-07-19 07:34:34发表:
    void ECT_Init(void)
    {   
    ECT_PACTL=0X50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
    ECT_TCTL3=0xc0;//c-输入捕捉7任何沿有效,            
    ECT_TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿      
    ECT_TIE  =0x00;//每一位对应相应通道中断允许,0表示禁止中断
    ECT_TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
    ECT_TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
    }  
    你看看中断代码,可以使用的,就是需要修改一下。 

    不好意思,我是个初学者,没太明白你的意思。我发现按照这种写法,在输入脉冲的频率低于某一值时(当前频率设置下时69Hz),好像每次输入都能捕捉到,即当前的TC0H的值等于上一次中断的TC0的值,但是当输入频率大于该频率时,当前的TC0H的值就不是上次的TC0的值了,这是为什么啊
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-21 10:12:25 | 显示全部楼层

    RE:急!!有关输入捕获问题

    TC0H是当前频率产生以后的值。这个值是上一次进入中断以后的保存值。
    该会员没有填写今日想说内容.
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-26 18:27 , Processed in 0.104488 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表