CC2431定位程序分析1


原文地址:CC2431定位程序分析 作者:阿元

   下面的程序分析是基于CC2431的定位程序,使用的是CC2431中的相关定位寄存器,CC2430不能使用下面定位寄存器。

    整个定位引擎的函数均放在LocationEngine.c/h文件里。现在我们看一下具体的定位程序。

//定位引擎使能宏定义

#define LOC_ENABLE()  do { LOCENG |= 0x10;  } while(0)

#define LOC_DISABLE() do { LOCENG &= ~0x10; } while(0)

 

// LOC_PARAMETER_LOAD宏定义

#define LOC_PARAMETER_LOAD( on )

   do {                        

      if(on) LOCENG |= 0x04;   

      else LOCENG &= ~0x04;    

   } while(0)

 

// LOC_REFERENCE_LOAD宏定义       

#define LOC_REFERENCE_LOAD( on )

   do {                        

      if(on) LOCENG |= 0x02;   

      else LOCENG &= ~0x02;    

} while(0)

 

//启动定位引擎

#define LOC_RUN() do { LOCENG |= 0x01; } while(0)

 

//执行定位

#define LOC_DONE()  (LOCENG & 0x08)

 

//节点位置计算函数

void locationCalculatePosition( LocRefNode_t *ref, LocDevCfg_t *node )

{

  LocRefNode_t *pRef = ref;

  // Rev-B Chip have LocEng Ver 1.0 w/ cap=8, Rev-C have LocEng Ver 2.0 w/ 16.

  const byte stop = ( ( CHVER == 0x01 ) ? LOC_ENGINE_NODE_CAPACITY_REVB :

LOC_ENGINE_NODE_CAPACITY_REVC);

  byte idx;

 

  //定位引擎使能

  LOC_DISABLE();     

  LOC_ENABLE();      

 

  // LOC_REFERENCE_LOAD使能,准备写入参考坐标

  LOC_REFERENCE_LOAD( TRUE );

 

  for ( idx = 0; idx < stop; idx++ )

  {

    //参考坐标输入

REFCOORD = pRef->x;             

    REFCOORD = pRef->y;

    pRef++;

  }               

  LOC_REFERENCE_LOAD( FALSE );   //参考坐标写入完成

 

   //使能LOC_PARAMETER_LOAD,准备写入测量参数

  LOC_PARAMETER_LOAD( TRUE );     

 

  MEASPARM = node->param_a;     

  MEASPARM = node->param_n;

 

  // CC2431 rev. C->

  if ( CHVER != 0x01 )

  {

    MEASPARM = LOC_ENGINE_X_MIN;

    MEASPARM = LOC_ENGINE_X_MAX;

 

    MEASPARM = LOC_ENGINE_Y_MIN;

    MEASPARM = LOC_ENGINE_Y_MAX;

  }

 

  // Load the measured RSSI values shifted for not used fractional bit.

  for ( idx = 0; idx < stop; idx++ )

  {

    MEASPARM = ref->rssi * 2;

    ref++;

  }

 

  LOC_PARAMETER_LOAD( FALSE );     //测量参数写入完成

 

  LOC_RUN();                           //启动定位估计计算

 

  while( !(LOCENG & 0x08) );

 

  if ( CHVER == 0x01 )

  {

    // Convert output format (LSB = .5m) to input format (2 LSB's = .25m).

    node->x = (LOCX << 1);

    node->y = (LOCY << 1);

    node->min = LOCMIN;

  }

  else

  {

    node->x = LOCX + 2;

    node->y = LOCY;

    node->min = 0;

  }

 

  LOC_DISABLE();      //关闭定位引擎

}

    整个程序解释的比较清楚了,相信大家也知道定位的相对过程了,现在可以继续我们的ZigBee定位了。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值