智能车制作

标题: 请大家帮忙看看我的测速程序为什么没有返回值呢 [打印本页]

作者: 黄河浪    时间: 2012-3-28 10:14
标题: 请大家帮忙看看我的测速程序为什么没有返回值呢
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
//程序中用到的函数申明_WNL
void delay_1MS(int ms);//延时1ms程序
void SET_PLL(void);//锁相环程序_WNL
void SCI_Init();
void Uart_putchar( unsigned char c);
void Uart_putstr(char ch[]);
unsigned char Uart_getchar(void);
void PWM_Init(void);//PWM初始化
void OverCounter(void);//自由运行计数器溢出中断
void Speed_catch(void);//TC7输入捕捉中断
void Speed_Init(void);//速度采集初始化
void Initialize_RTI(void);//实时中断初始化
void RTI_Init(void);//RTI中断
//程序中用到的变量申明_WNL
byte res=0;
unsigned char Time=0;//自由运行计数器溢出次数
unsigned char Timefirst=0;
unsigned int  Speed=0,Speed1=0,Speed2=0;//前后三次的速度
unsigned int  trianglespeed=0;
unsigned int  Speedc=0,Speedd;//Speedc记录上升沿来临的次数,Speedd记录总的时间
unsigned int  TimeCnt1=0,TimeCnt0=0;//记录前后两次自由计数器中的值
unsigned char timecounter=0;//记录系统的时间_WNL
unsigned char time=0;
int Speedbase=0;//速度给定值的整体调控
/**************延时程序***********************/
void delay_1MS(int ms)
{
intii,jj;
  for(ii=0;ii<ms;ii++)
    for(jj=0;jj<1325;jj++);
}
  
/*****************锁相环程序*****************/
void SET_PLL(void)
{ //设置锁相环时钟频率为48M
SYNR=2;
REFDV=1;          //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
  asmNOP;
  asmNOP;
  asmNOP;
while((CRGFLG&0X08)==0);//等待锁相环频率锁定
CLKSEL=0X80;            //选定锁相环时钟
}
/*初始化SCI0*/
void SCI_Init()
{
   SCI0BD=313;//48MHz总线频率,9600的分频SCI系数,波特率=总线时钟/(16×SCIxBD)
   SCI0CR1 =0x00;//正常8位模式,偶校验
   SCI0CR2 =0x2c;//接收中断允许
}
void Uart_putchar ( unsigned char c)
{
while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty
SCI0DRL=c;
}
void Uart_putstr(char ch[])
{
unsigned char ptr=0;
while(ch[ptr]){
Uart_putchar((unsigned char)ch[ptr++]);}
}
unsigned char Uart_getchar(void)
{
byte res=0;
while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty
return (SCI0DRL);
}
/****************实时中断初始化程序*************/
void Initialize_RTI(void)
{
CRGINT_RTIE=1;//实时中断使能
RTICTL=0X54;//实时中断周期为5.12ms
EnableInterrupts;//清除I屏蔽位
}
/****************中断服务程序*******************/
#pragma CODE_SEG NON_BANKED//指示该程序在不分页区
#pragma TRAP_PROC
void RTI_Init(void)
{  
CRGFLG_RTIF = 1;   
AD_detect(); //调用AD转换处理程序
  asmNOP;
  asmNOP;
  asmNOP;
  //记录系统时间_WNL
timecounter++;
if(timecounter>=200)
  {
   timecounter=0;
   time++;
  }
if(time>200)time=0;
}
#pragma CODE_SEG DEFAULT
/****************************速度检测初始化*************************/                       
void Speed_Init(void)
{
   asm sei;
   TIOS=0x00;     //通道2设置为输入捕捉
   TIE=0xFF;       //通道1输入捕捉中断使能
   TCTL3_EDG7B=0;
   TCTL3_EDG7A=1;   //通道2捕捉上升沿
   TSCR2_TCRE=0;    //自由运行计数器禁止复位
   TSCR1_TFFCA=0;   //定时器标志普通清除方式
   TSCR2_TOI=1;     //定时器溢出中断
   TSCR2_PR=0x02;      //
   TSCR1_TEN=1;     //定时器使能
   EnableInterrupts;
}  
/********************检测自由运行计数器溢出次数*******************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void OverCounter(void)
{
TFLG2_TOF=1;//清除溢出标志位  
Time++; //自由运行计数器溢出,计数值加1
}
#pragma CODE_SEG DEFAULT
/*********************进行速度采集********************************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC                     
void Speed_catch(void)
{
  TFLG1_C7F=1; //清除中断标志位
if(Speedc==0)
  {//第一次进入
    Timefirst=Time;//记录自由运行计数器溢出次数
    TimeCnt0=TC7;//记录当前自由运行计数器中的值
    Speedc=1; //已经有第一次进入做基础,准备第二次进入     
  }
else if(Speedc==1)
  {
    TimeCnt1=TC7;//记录当前自由运行计数器的值   
    Speedd=(Time-Timefirst)*65535-TimeCnt0+TimeCnt1;//记录总的时间
    Speed=(uint)(197476/Speedd);//求当前瞬时速度
    Speed=(Speed+Speed1+Speed2)/3;//取三次速度的平均值
    Speed2=Speed1;
    Speed1=Speed;//速度跟新
    Speedc=0;
    Time=0;//标志位清0
  }
}
#pragma CODE_SEG DEFAULT
/*****************PWM初始化程序***************/
void PWM_Init(void)
{
PWME=0X00;//关闭所有PWM输出
PWMPRCLK=0X22;//24M/4=6M
PWMSCLA=0X06; //6M/(2*6)=0.5M
PWMSCLB=0X03; //6M/(2*3)=1M
PWMCTL=0X20; //通道2和通道2合并
PWMCLK=0X3C; //通道23,4,5选择clocksA
PWMPOL=0X3C; //PWM先输出高电平
PWMCAE=0X00; //左对齐
PWMPER23=10000;//周期为10ms
PWMDTY23=1500;//输出角度为0
PWMPER4 = 100; //5KHz
PWMPER5 = 100; //5KHz
PWMDTY4 =30;//初始速度设置为0
PWMDTY5 =0;
PWME=0X3C;//开启PWM23,PWM4,PWM5
}
void main(void)
{
delay_1MS(2000);
DDRA=0X00;
SET_PLL();
PWM_Init();
Initialize_RTI();
Speed_Init();
       EnableInterrupts;
while(1)
  {
  
PWMDTY4=20;
time=0;
timecounter=0;//计数器清零
  if(Uart_getchar() == 'c')
   Uart_putstr("Usart Is Working!");      
     
  }
  /*please make sure that you never leave main */
}


作者: hahah    时间: 2013-1-17 16:07
楼主,我也遇到同样的问题,莫非自由计数器溢出中断不能开。TSCR2_TOI=1;     //定时器溢出中断
一旦开了,就不能进入主程序了。搞不清楚是什么原因。。。TSCR2_TOI=0;     //禁止定时器溢出中断
这样程序没有问题。。。。。。也大神解释这是什么原因。。。
作者: hahah    时间: 2013-1-17 20:03
TIE=0xFF;       //通道1输入捕捉中断使能
只开有用的中断。其他的关掉。应该就可以了。 TIE=0x02;       //通道1输入捕捉中断使能





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