打印

跪求用MSP430编写0.001MS的源程序

[复制链接]
3649|6
手机看帖
扫描二维码
随时随地手机跟帖
沙发
恺撒大帝|  楼主 | 2008-7-11 10:02 | 只看该作者

我的

以下是我变编的,大家觉得这样编
精度是否已达到,还是根本不能这样编,精确到0.001MS.




#include "DHM015.c"
#include "hw.h"
#include "math.h"
void main (void)
{
  
   
   MSP430Init();//430初始化
   WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms
   DHM015Init();//液晶初始化
   WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms
   _EINT();//开总中断
   while(1)
   {
          WDTCTL = WDT_ARST_1000;//设定看门狗定时时间为1s
         _BIS_SR(LPM3_bits);//低功耗
         WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms
         //WDTCTL=WDTPW+WDTHOLD;
         if((Flag&RESET)==RESET)//是否复位键按下
               WDTCTL = 0;//写入错误看门狗键值,使程序复位
         else
         {
           if(Flag2==2) //是否已两次采样  
           {
             Tsum=(4086*cnt+Compare)*1000000/800000 ;
             Flag2=0;
           }
                           
           /***************************************显示结果 ***************************************/ 
          WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms
       DisplayResult();   
         }    
       }  
              
               
        
               
   }



/********************************************************************************
函数原型: void MSP430Init(void)
函数功能: 430单片机初始化函数,在该函数中对时钟,I/O口,各个外围模块进行初始化。
调用
入口参数: 无
出口参数: 无
*********************************************************************************/
void MSP430Init(void)
{
  int i;
 WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms
   BCSCTL1 |= ~XT2OFF;//关闭XT2
                   //wait in loop until crystal is stable
   {
         IFG1&=~OFIFG;
       for (i = 0xFF; i > 0; i--);           // Time for flag to set
   }while(OFIFG&IFG1);
   BCSCTL2=SELS;                              //SMCLK的时钟源为TX2CLK;8MHZ;
   
   //--------------------------------I/O initial------------------------------------//
   P1DIR |= 0xFF;
   P1OUT = 0;
   
   P2DIR |= 0xFF;
   P2OUT = 0;
   
   P3DIR |= 0xFF;
   P3OUT = 0;
   
   P4DIR |= 0xFF;
   P4OUT = 0;

   P5DIR |= 0xFF;
   P5OUT = 0;

   P6DIR |= 0xFF;
   P6OUT = 0;
   
   
  

   
   //----------------------------------TimerB---------------------------------------//
  
  TBCTL=TBSSEL1+TBCLR;//选择SMCLK作为时钟源
  TBCCTL0=CCIE;//中断允许
  TBCCR0=4096;//计时0.1MS
  TBCTL=MC_1;//增计数
  TBCCTL1=CCIE+CAP+CM_3;//捕获模式,上下源都捕获
 #if VERSION>126
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
#else
interrupt[TIMERA0_VECTOR] void TimerA(void)
#endif
{   
   
 
  switch(TBIV)
  {
  case 2:Newcapture=CCR1;
         Compare=Oldcapture-Newcapture;
         Oldcapture=CCR1;
         Flag2++;
  case 14: cnt++;       
  }
}
 
     
}

使用特权

评论回复
板凳
mac001| | 2008-7-15 09:28 | 只看该作者

11

选用外部晶振做时钟源能准一些,不过对于一般的8M晶振而言,要实现1US的计时不大可能~~~~~,楼主要实现什么功能,如果只是计数的话可以把周期设长点然后再结合计数器内部计数值,这样就能达到1US的计数;如果是为了发出波形,可以考虑PWM

使用特权

评论回复
地板
恺撒大帝|  楼主 | 2008-7-15 15:19 | 只看该作者

为了计时

我为了做一个精确到1US的计时器,计算一个脉冲的高电平时间

使用特权

评论回复
5
Again_gyf| | 2008-7-16 08:59 | 只看该作者

捕获时间太短了!

不知道你的MCLK是多少?看你用的是1XXX系列,最大8M这样一个指令就要125NS,看看你的中断执行指令,肯定大于8个CLOCK

使用特权

评论回复
6
无名小辈| | 2008-7-26 15:02 | 只看该作者

我是新手,才开始学MSP430请教一下你程序里面的

#if VERSION>126
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
#else
interrupt[TIMERA0_VECTOR] void TimerA(void)
#endif
是什么意思啊?????我正在研读你的作品。。。

使用特权

评论回复
7
again_gyf| | 2008-7-27 09:31 | 只看该作者

这是软件版本问题!

IAR在以前早期版本中断的写法和现在的版本是不一样的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

19

帖子

0

粉丝