智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2426|回复: 8
打印 上一主题 下一主题

[编程类] XS128输入捕捉

[复制链接]

6

主题

67

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1600
威望
746
贡献
464
兑换币
490
注册时间
2012-12-9
在线时间
195 小时
跳转到指定楼层
1#
发表于 2013-2-19 15:53:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3贡献
/***********************************************************************************************************
*   Description          :  测量从IC0输入的信号的频率
***********************************************************************************************************/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <stdio.h>

#define TIMCLK 8000000
static unsigned int cnt[2], freq;

/***********************Functions Prototype*************************/
/**********************************************************************************************************
* Function Name         :  SCI_Init                    
* Description           :  Initialize SCI
**********************************************************************************************************/
void SCI_Init(void)  
{
    SCI0BD = 52;    //9600 bps
    SCI0CR1 = 0x00;
    SCI0CR2 = 0x0c;    //允许使用SCI发送器和SCI接收器            
}      
/**********************************************************************************************************
* Function Name         :  IcInit                    
**********************************************************************************************************/
void IcInit(void)
{
    TIOS_IOS0 = 0;    //选取0作为IC
    TIE_C0I = 1;     //使能通道0中断
    TCTL4_EDG0A = 1;
    TCTL4_EDG0B = 0;  //检测上升沿
    TSCR1_TEN = 1;
}
/**********************************************************************************************************
* Function Name         :  InputCapture                    
* Description           :  中断服务程序,计算信号频率
**********************************************************************************************************/
#pragma CODE_SEG  NON_BANKED
void interrupt 8 InputCapture(void)
{
    static unsigned char i = 0;
    char freqence[16];
    char counter[16];

    TFLG1_C0F = 1;
    cnt[i++] = TC0;

    if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

        sprintf(counter,"cnt[0] = %d\n",cnt[0]);     
        putstr(counter);
        sprintf(counter,"cnt[1] = %d\n",cnt[1]);     
        putstr(counter);
        sprintf(freqence,"Source freqence:%d\n\n",freq);     
        putstr(freqence);

        DisableInterrupts;
    }
}
#pragma CODE_SEG DEFAULT
/**********************************************************************************************************
* Function Name         :  main                  
**********************************************************************************************************/
void main(void)
{
    freq = 0;
    SCI_Init();
    IcInit();

    putstr("\nNow start input capture:\n");

          EnableInterrupts;
}
程序可以测出cnt[0],但是测出的cnt[1]一直是0,大家可以帮忙看看吗?

6

主题

67

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1600
威望
746
贡献
464
兑换币
490
注册时间
2012-12-9
在线时间
195 小时
2#
 楼主| 发表于 2013-2-19 15:54:28 | 只看该作者
自己顶一个!!!
回复

使用道具 举报

13

主题

136

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
威望
955
贡献
629
兑换币
275
注册时间
2012-10-28
在线时间
171 小时
3#
发表于 2013-2-19 18:17:48 | 只看该作者
这个程序看着有点乱,而且,本人水平阅历有限,貌似sprintf这种语句在单片机上没看到过,好像是在电脑系统上文件中写入数据什么的,真心不懂!
回复

使用道具 举报

13

主题

136

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
威望
955
贡献
629
兑换币
275
注册时间
2012-10-28
在线时间
171 小时
4#
发表于 2013-2-19 18:19:03 | 只看该作者
哦,知道了,不好意思,搞错了
回复

使用道具 举报

6

主题

67

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1600
威望
746
贡献
464
兑换币
490
注册时间
2012-12-9
在线时间
195 小时
5#
 楼主| 发表于 2013-2-19 19:08:56 | 只看该作者
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <stdio.h>

#define TIMCLK 8000000
static unsigned int cnt[2], freq;

void SCI_Init(void)  
{
    SCI0BD = 52;    //9600 bps
    SCI0CR1 = 0x00;
    SCI0CR2 = 0x0c;    //允许使用SCI发送器和SCI接收器            
}      

void IcInit(void)
{
    TIOS_IOS0 = 0;    //选取0作为IC
    TIE_C0I = 1;     //使能通道0中断
    TCTL4_EDG0A = 1;
    TCTL4_EDG0B = 0;  //检测上升沿
    TSCR1_TEN = 1;
}

#pragma CODE_SEG  NON_BANKED
void interrupt 8 InputCapture(void)
{
    static unsigned char i = 0;
    char freqence[16];
    char counter[16];

    TFLG1_C0F = 1;
    cnt[i++] = TC0;

    if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

        sprintf(counter,"cnt[0] = %d\n",cnt[0]);     
        putstr(counter);
        sprintf(counter,"cnt[1] = %d\n",cnt[1]);     
        putstr(counter);
        sprintf(freqence,"Source freqence:%d\n\n",freq);     
        putstr(freqence);

        DisableInterrupts;
    }
}
#pragma CODE_SEG DEFAULT

void main(void)
{
    freq = 0;
    SCI_Init();
    IcInit();

    putstr("\nNow start input capture:\n");

    EnableInterrupts;
}

补充内容 (2013-2-22 09:59):
可能是使用sprintf产生溢出的问题吧!!!
回复

使用道具 举报

4

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
146
贡献
67
兑换币
80
注册时间
2013-3-15
在线时间
22 小时
毕业学校
USTC
6#
发表于 2013-8-10 10:08:53 | 只看该作者
if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

        sprintf(counter,"cnt[0] = %d\n",cnt[0]);     
        putstr(counter);
        sprintf(counter,"cnt[1] = %d\n",cnt[1]);     
        putstr(counter);
        sprintf(freqence,"Source freqence:%d\n\n",freq);     
        putstr(freqence);

        DisableInterrupts;
    }

同志你没发现你第一次进来后,DisableInterrupts了么。。。当然只能测一次了。
回复

使用道具 举报

6

主题

67

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1600
威望
746
贡献
464
兑换币
490
注册时间
2012-12-9
在线时间
195 小时
7#
 楼主| 发表于 2013-8-11 10:40:14 | 只看该作者
Frozenflame 发表于 2013-8-10 10:08
if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

嗯,是这个问题。
回复

使用道具 举报

6

主题

132

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
威望
1003
贡献
504
兑换币
411
注册时间
2013-9-23
在线时间
166 小时
8#
发表于 2013-10-19 20:05:13 | 只看该作者
Frozenflame 发表于 2013-8-10 10:08
if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

DisableInterrupts;
这句话有什么意思?我一直不太明白!!谢谢
回复

使用道具 举报

4

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
146
贡献
67
兑换币
80
注册时间
2013-3-15
在线时间
22 小时
毕业学校
USTC
9#
发表于 2014-8-27 17:28:18 | 只看该作者
mlhmxhabc 发表于 2013-10-19 20:05
DisableInterrupts;
这句话有什么意思?我一直不太明白!!谢谢

关闭所有的中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 13:23 , Processed in 0.166332 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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