智能车制作

标题: XS128输入捕捉 [打印本页]

作者: yg_1031    时间: 2013-2-19 15:53
标题: XS128输入捕捉
/***********************************************************************************************************
*   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,大家可以帮忙看看吗?


作者: yg_1031    时间: 2013-2-19 15:54
自己顶一个!!!
作者: uli12345    时间: 2013-2-19 18:17
这个程序看着有点乱,而且,本人水平阅历有限,貌似sprintf这种语句在单片机上没看到过,好像是在电脑系统上文件中写入数据什么的,真心不懂!
作者: uli12345    时间: 2013-2-19 18:19
哦,知道了,不好意思,搞错了
作者: yg_1031    时间: 2013-2-19 19:08
#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产生溢出的问题吧!!!
作者: Frozenflame    时间: 2013-8-10 10:08
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了么。。。当然只能测一次了。
作者: yg_1031    时间: 2013-8-11 10:40
Frozenflame 发表于 2013-8-10 10:08
if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

嗯,是这个问题。

作者: mlhmxhabc    时间: 2013-10-19 20:05
Frozenflame 发表于 2013-8-10 10:08
if (i == 1)
    {
        freq = TIMCLK / (cnt[1] - cnt[0]);

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

作者: Frozenflame    时间: 2014-8-27 17:28
mlhmxhabc 发表于 2013-10-19 20:05
DisableInterrupts;
这句话有什么意思?我一直不太明白!!谢谢

关闭所有的中断





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2