以前就有这个疑问,我的那块EZ430 Chronos手表首次打开温度显示差很多。
是普遍现象还是就是我的那块的个别故障?
看CC430F6137数据手册好像是有温度校准数据的呀
但是看EZ430 Chronos的源程序V1.6 (21.11.2010),好像校准数据却是从INFO D memory读取的,而6137数据手册中温度校准数据好像却是在叫什么Device
Descriptor区域中的,而手表程序中好像没有看到使用这个区域中的温度校准数据。请问是不是这样?如果不是,在别的地方我没有看到?(我只能看部分程序呀,好像有说法看程序比写程序还烦人,当然我是菜鸟,可能正好相反,看程序也是种学习,但是看程序那也是比专家难吧)
前天我更新了手表程序(自己改的,删除了配件所需的显示和相关程序,因为自己没有配件,以后要使有兴趣自己做再加上自己的。增加了气压计功能显示,呵呵,钓鱼用,穷讲究),发现以前对比其它温度计手动校准就失效了,扫了一眼源程序,好像是没有进行FLASH保存吧?就存在变量中的,掉电就没了。
请问CC430芯片使用芯片中的校准数据应该是很准的吧?一般误差多少?手册英文的,我还没有仔细看。是不是应该比那个压力传感器的温度绝对误差要小吧?为什么不使用Device Descriptor中的数据呢?其它地方有拷贝里面数据到info D?
// *************************************************************************************************
// @fn read_calibration_values
// @brief Read calibration values for temperature measurement, voltage measurement
// and radio from INFO memory.
// @param none
// @return none
// *************************************************************************************************
void read_calibration_values(void)
{
u8 cal_data[CALIBRATION_DATA_LENGTH]; // Temporary storage for constants
u8 i;
u8 *flash_mem; // Memory pointer
// Read calibration data from Info D memory
flash_mem = (u8 *) 0x1800;
for (i = 0; i < CALIBRATION_DATA_LENGTH; i++)
{
cal_data[i] = *flash_mem++;
}
if (cal_data[0] == 0xFF)
{
// If no values are available (i.e. INFO D memory has been erased by user), assign
// experimentally derived values
rf_frequoffset = 4;
sTemp.offset = -250;
sBatt.offset = -10;
simpliciti_ed_address[0] = 0x79;
simpliciti_ed_address[1] = 0x56;
simpliciti_ed_address[2] = 0x34;
simpliciti_ed_address[3] = 0x12;
sAlt.altitude_offset = 0;
} else
{
// Assign calibration data to global variables
rf_frequoffset = cal_data[1];
// Range check for calibrated FREQEST value (-20 .. + 20 is ok, else use default value)
if ((rf_frequoffset > 20) && (rf_frequoffset < (256 - 20)))
{
rf_frequoffset = 0;
}
sTemp.offset = (s16) ((cal_data[2] << 8) + cal_data[3]);
sBatt.offset = (s16) ((cal_data[4] << 8) + cal_data[5]);
simpliciti_ed_address[0] = cal_data[6];
simpliciti_ed_address[1] = cal_data[7];
simpliciti_ed_address[2] = cal_data[8];
simpliciti_ed_address[3] = cal_data[9];
// S/W version byte set during calibration?
if (cal_data[12] != 0xFF)
{
sAlt.altitude_offset = (s16) ((cal_data[10] << 8) + cal_data[11]);
} else
{
sAlt.altitude_offset = 0;
}
}
}
下次我打开手表的时候读一下INFO D看看有没有数据,貌似应该有,因为这一句sTemp.offset = -250;那显示应该就是-200左右了吧