This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

就到9月16日, 三款TI eStore最热销产品2折起, 库存有限, 立刻行动!

Other Parts Discussed in Thread: CC2541, TPS62730, MSP430F5509, CC1101, CC2540, CC-DEBUGGER, CC430F6137, TUSB3410, MSP430F1612, SIMPLICITI, CC1100


 优惠期间: 9/1 ~ 9/16, 心动不如赶快行动 !




 
获奖无数的CC2541 SensorTag 开发套件
CC2541DK-SENSOR

首款蓝牙智能开发套件,专注于无线传感器应用,也是唯一面向智能手机应用开发人员的开发套件,可用作各种智能手机附件的参考设计和开发平台。
查看技术文档 / 查看視頻
原价:$25促销价:$12.5 [ 优惠码: promrxv6 ]
基于 CC430 的 GHz 以下频谱分析仪
MSP-SA430-SUB1GHZ

是一款基于 CC430 的参考设计,它提供了操作简便且价格实惠的工具,可在低于1 GHz 频谱范围内快速启动射频开发。
查看技术文档 / 查看視頻
原价:$249促销价:$50 [ 优惠码: promwe5x ]
Chronos:无线手表开发工具
EZ430-CHRONOS-433 

既是运动手表,又是基于 CC430 高度集成的无线开发系统。它可用作手表系统的参考平台、个人局域网的个人显示器或远程数据收集的无线传感器节点。
查看技术文档 / 查看視頻
原价:$58促销价:$29 [ 优惠码: promus56 ]
 
  更多新上线 50 款 DSP, MSP430, Sitara, 无线连接开发工具,抢先购买
★ 订购小帖示:

  请点“立即购买”,“从 TI 购买”进入 eStore 购物车,点“马上结算”按步骤申请,订单摘要中记得输入优惠码并提交订单,以享有此次折扣优惠。如果碰到不能自动进入采购车的情况,请在导航栏中点击工具 → Internet 选项 → 常规设置中清空历史浏览记录
  您订购的货物将在 7-10 个工作日后送达。若遇海关查验或者缺货,会有延长。
  以上订单总额不包含进口增值税或者关税。您在收到货物时,可能会被要求支付相关税费,合计金额大致为订单金额的 25%。

  • 希望可以有更多的产品加入到促销

  • 最近网站好像又打不开了!

  • 【晒心得】+ TI EZ430-CHRONOS-433 无线手表代码解析

    作者EEWORLD网友 azhiking

    开个帖子,共同学习EZ430。使用了一下EZ430-CHRONOS ,感觉挺酷的 !不过也遇到这样那样的问题,看到坛子上不少大神都遇到了,所以我不是最幸运的,哈哈。所以先研究研究代码,想随后重新定制一下功能。因为很多配件要么压根没有,要么很贵,就像心律测试的,没有433MHz的,而且好几十美刀,消费不起啊。直接把这些个
    功能去了,以后改成别的用途!看得到,用不到,闹心!!

    以前没有接触过MSP430,所以估计有很多不妥当的地方,欢迎各位拍拍砖(别砸死我就行了 )。另外也希望大家多多支持,增加点学习的信心,多点动力

    代码分析,我想按照代码的执行路径,一步一步解析,有其他的引用,通过注释或者在后面的跟贴中解析。

    EZ430-CHEONOS的相关文档也上传上来了,方便大家下载。

    代码下载地址:http://www.ti.com/lit/sw/slac341c/slac341c.zip
    比较大,里面还包含PC端驱动和软件,所以就不上传了。下面分析的代码就是这里安装包里面的代码。采用默认路径安装,则
    代码的存放位置为:
    C:\Program Files\Texas Instruments\eZ430-Chronos\Software Projects\Chronos Watch\eZ430-Chronos v1.1 - white PCB\CCS\Sports Watch
    我收到的是白色PCB的版本,所以选择代码时选择V1.1 - white PCB。不知道有没有朋友收到黑色PCB的版本,相信那个版本还是使用
    没有缩水的VTI的传感器。

    啰嗦了这么多,下面开始代码分析。(一天写一点

    复制内容到剪贴板
    1. // *************************************************************************************************
    2. // @fn          main
    3. // @brief       Main routine
    4. // @param       none
    5. // @return      none
    6. // *************************************************************************************************
    7. int main(void)
    8. {
    9.     // Init MCU
    10. //初始化MCU,里面做的工作主要有配置MCU电源时钟,使能IO中断,复位关闭无线发射,初始化加速度传感器、LCD、按键、定时器、压力传感器
    11.     init_application();
    12.     // Assign initial value to global variables
    13. //初始化全局变量: 初始化菜单,复位各标志位,读取校正因子,复位时钟、日期、闹钟、蜂鸣器、跑表、高度计、加速度、协议栈、温度、电池电压等
    14. //如果你不想每次复位后手表都显示4:30,可以将初始化的初值改称你希望的值 ,包括日期。
    15.     init_global_variables();
    16.     // Branch to welcome screen
    17. //测试模式,持续按住*和up键进入测试模式,按其他键退出。测试模式显示LCD上所有的字段,关闭看门狗。
    18.     test_mode();
    19.     // Main control loop: wait in low power mode until some event needs to be processed
    20. //主循环:无事件触发的时候,进入LPM3模式
    21.     while (1)
    22.     {
    23.         // When idle go to LPM3
    24. //系统空闲进入LPM3模式
    25.         idle_loop();
    26.         // Process wake-up events
    27. //处理唤醒事件
    28. //button结构体中标志位包括手表上的五个按键——长按或短按标志位,这个结构体定义在ports.h中
    29. // Set of button flags
    30. typedef union
    31. {
    32.     struct
    33.     {
    34.         // Manual button events
    35.         u16 star : 1;           // Short STAR button press
    36.         u16 num : 1;            // Short NUM button press
    37.         u16 up : 1;             // Short UP button press
    38.         u16 down : 1;           // Short DOWN button press
    39.         u16 backlight : 1;      // Short BACKLIGHT button press
    40.         u16 star_long : 1;      // Long STAR button press
    41.         u16 num_long : 1;       // Long NUM button press
    42.         u16 star_not_long : 1;  // Between short and long STAR button press
    43.         u16 num_not_long : 1;   // Between short and long NUM button press
    44.     } flag;
    45.     u16 all_flags;              // Shortcut to all display flags (for reset)
    46. } s_button_flags;

    //sys结构体中标志位表包括系统中的标志位,结构体定义在project.h中

    复制内容到剪贴板
    1. // Set of system flags
    2. typedef union
    3. {
    4.     struct
    5.     {
    6.         u16 idle_timeout : 1;             // Timeout after inactivity
    7.         u16 idle_timeout_enabled : 1;     // When in set mode, timeout after a given period
    8.         u16 lock_buttons : 1;             // Lock buttons
    9.         u16 mask_buzzer : 1;              // Do not output buzz for next button event
    10.         u16 up_down_repeat_enabled : 1;   // While in set_value(), create virtual UP/DOWN button
    11.                                           // events
    12.         u16 low_battery : 1;              // 1 = Battery is low
    13.         u16 use_metric_units : 1;         // 1 = Use metric units, 0 = use English units
    14.         u16 delay_over : 1;               // 1 = Timer delay over
    15.     } flag;
    16.     u16 all_flags;                        // Shortcut to all system flags (for reset)
    17. } s_system_flags;

    if (button.all_flags || sys.all_flags)
                wakeup_event();

            // Process actions requested by logic modules
    //处理逻辑模块触发事件
            if (request.all_flags)
                process_requests();

            // Before going to LPM3, update display
    //有任何事件触发,更新显示
            if (display.all_flags)
                display_update();
        }
    }


    上一贴子中Button和sys描述有误,都是联合体,由于帖子审核后不能编辑,只能在这里重新说明一下了。

    说道这里,顺便提一下位域的概念。
    我们看到联合体中定义了flag的结构体,每个成员后都有一个“:”加上一个数字1。如紫色标注部分。

    复制内容到剪贴板
    1. typedef union
    2. {
    3.     struct
    4.     {
    5.         // Manual button events
    6.         u16 star : 1;           // Short STAR button press
    7.         u16 num : 1;            // Short NUM button press
    8.         u16 up : 1;             // Short UP button press
    9.         u16 down : 1;           // Short DOWN button press
    10.         u16 backlight : 1;      // Short BACKLIGHT button press
    11.         u16 star_long : 1;      // Long STAR button press
    12.         u16 num_long : 1;       // Long NUM button press
    13.         u16 star_not_long : 1;  // Between short and long STAR button press
    14.         u16 num_not_long : 1;   // Between short and long NUM button press
    15.     } flag;
    16.     u16 all_flags;              // Shortcut to all display flags (for reset)
    17. } s_button_flags;

    至于原因和作用(以前也没有注意过,
    从来么有用过MSP430,一看才发现头文件中很多都是这样定义的),参考了一下度娘,下面摘录了部分内容
    /*以下内容摘自"度娘"*/
        有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0
    和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
    所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按
    域名进行操作。   这样就可以把几个不同的对象用一个字节的二进制位域来表示。
        位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:           
        struct   位域结构名           
        {   位域列表   };         
        其中位域列表的形式为:   类型说明符   位域名:位域长度

    带有'位域'的结构体并不是按照每个域对齐的,而是将一些位域成员'捆绑'在一起做对齐的。
    1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
    2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
    /*摘录部分结束*/

        flag中定义了9个U16类型的成员,9个成员所占位域空间之和9bit>8bit(1byte),所以占2个字节的空间
        这样一来,这个联合体只占2个字节的空间,节省了很多存储空间。
        联合体中成员的英文注释已经比较明了啦,这里就不再翻译啦。

    下面开始解析函数init_application();
    复制内容到剪贴板
    1. // *************************************************************************************************
    2. // @fn          init_application
    3. // @brief       Initialize the microcontroller.
    4. // @param       none
    5. // @return      none
    6. // *************************************************************************************************
    7. void init_application(void)
    8. {
    9.     volatile unsigned char *ptr;
    10.     // ---------------------------------------------------------------------
    11.     // Enable watchdog
    12. //使能看门狗
    13.     // Watchdog triggers after 16 seconds when not cleared
    14. //16s位清除看门狗触发复位操作
    15. #ifdef USE_WATCHDOG
    16. //通过WDTCTL寄存器,看门狗模块可以配置为看门狗功能或者内部定时器功能。WDTCTL是一个16位的带密码保护的可读写寄存器,
    17. //读写操作必须使用字指令,写操作必须在高位字节包含写密码,0x5A。这里宏WDRPW定义为写密码0x5A00。
    18. //WDTIS为时钟间隔选择,一共有8种时钟间隔可供选择。
    19. //WDTSSEL为时钟源选择:SMCLK、ACLK、VLOCLK、X_CLK
    20. //WDRHOLD为1时停止看门狗定时器
    21.     WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK;
    22. #else
    23.     WDTCTL = WDTPW + WDTHOLD;
    24. #endif
    25.     // ---------------------------------------------------------------------
    26.     // Configure PMM
    27. //提升核心供电电压
    28.     SetVCore(3);
    29.     // Set global high power request enable
    30. //0xA5为电源管理模块寄存器写操作密码
    31. //开启PMM的高能量消耗允许
    32.     PMMCTL0_H = 0xA5;
    33.     PMMCTL0_L |= PMMHPMRE;
    34. //写入除0x5A外设和数字,锁定PMM寄存器写操作
    35.     PMMCTL0_H = 0x00;
    36.     //UCS包括5个时钟源

    37.    //XT1CLK:低频/高频晶振,可以用低频32768Hz手表晶振、标准晶振、陶瓷振荡器、或范围4MHz-32MHz的外部时钟源。
    参考资料.rar
  • 接上篇

    参考电路

    统一时钟系统模块包含5个时钟源:

    XT1CLK:低频/高频晶振,可以用低频32768Hz手表晶振、标准晶振、陶瓷振荡器、或范围4MHz-32MHz的外部时钟源。

    VLOCLK:内部非常低功率、低频率的12KHz典型频率的晶振

    REFOCLK:内部的、修正过的、低频32768Hz典型频率振荡器,可以作为FLL的基准时钟。

    DCOCLK:内部数控振荡器,可以用FLL稳定。

    XT2CLK:可选择的高频振荡器,可以用标准晶振、陶瓷振荡器、或范围4MHz-40MHz的外部时钟源。

    从统一时钟系统模块有3个有效的时钟信号:

    ACLK:辅助时钟。ACLK可软件选择来自XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV和XT2CLK(如果有)的信号。DCOCLKDIV是在FLL模块作用下分频为1、2、4、6、8、16或32的DCOCLK频率。ACLK可软件选择为个人外设模块的信号。ACLK/n是ACLK被分为1,2,4,6,8,16,32,并且可以用一个引脚外部输出。

    MCLK:系统主时钟。MCLK可软件选择来自XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV和XT2CLK(如果有)的信号。MCLK可分频为1,2,4,6,8,16或32。MCLK主要用于CPU与系统.

    SMCLK:子系统时钟。SMCLK可软件选择来自XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV和XT2CLK(如果有)的信号。SMCLK可分频为1,2,4,6,8,16或32。SMCLK可软件选择为个人外设模块。


    参考MSP430F6137的datasheet和EZ430的原理图,可以看到其使用的是P5.0和P5.1作为外部晶振的输入输出,所以有
    P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1
    接下来配置CPU时钟为12MHz

    // ---------------------------------------------------------------------
        // Enable 32kHz ACLK
        P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1
        UCSCTL6 &= ~XT1OFF;         // XT1 On, Highest drive strength
        UCSCTL6 |= XCAP_3;          // Internal load cap

        UCSCTL3 = SELA__XT1CLK;     // Select XT1 as FLL reference
        UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;

        // ---------------------------------------------------------------------
        // Configure CPU clock for 12MHz
        _BIS_SR(SCG0);              // Disable the FLL control loop
        UCSCTL0 = 0x0000;           // Set lowest possible DCOx, MODx
        UCSCTL1 = DCORSEL_5;        // Select suitable range
        UCSCTL2 = FLLD_1 + 0x16E;   // Set DCO Multiplier
        _BIC_SR(SCG0);              // Enable the FLL control loop

        // Worst-case settling time for the DCO when the DCO range bits have been
        // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
        // UG for optimization.
        // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle
        __delay_cycles(375000);

        // Loop until XT1 & DCO stabilizes, use do-while to insure that
        // body is executed at least once
        do
        {
            UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
            SFRIFG1 &= ~OFIFG;      // Clear fault flags
        }
        while ((SFRIFG1 & OFIFG));

        // ---------------------------------------------------------------------
        // Configure port mapping

        // Disable all interrupts
        __disable_interrupt();
        // Get write-access to port mapping registers:
        PMAPPWD = 0x02D52;
        // Allow reconfiguration during runtime:
        PMAPCTL = PMAPRECFG;

        // P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)
        ptr = &P2MAP0;
        *(ptr + 7) = PM_TA1CCR0A;
        P2OUT &= ~BIT7;
        P2DIR |= BIT7;

    //参考原理图

    //配置SPI接口
        // P1.5 = SPI MISO input
        ptr = &P1MAP0;
        *(ptr + 5) = PM_UCA0SOMI;
        // P1.6 = SPI MOSI output
        *(ptr + 6) = PM_UCA0SIMO;
        // P1.7 = SPI CLK output
        *(ptr + 7) = PM_UCA0CLK;

        // Disable write-access to port mapping registers:
        PMAPPWD = 0;
        // Re-enable all interrupts
        __enable_interrupt();

        // ---------------------------------------------------------------------
        // Configure ports

        // ---------------------------------------------------------------------
        // Reset radio core
        radio_reset();
        radio_powerdown();

        // ---------------------------------------------------------------------
        // Init acceleration sensor
    //初始化加速度传感器
        as_init();

        // ---------------------------------------------------------------------
        // Init LCD
    //初始化LCD
        lcd_init();

        // ---------------------------------------------------------------------
        // Init buttons
    //初始化按键
        init_buttons();

        // ---------------------------------------------------------------------
        // Configure Timer0 for use by the clock and delay functions
    //配置Timer0
        Timer0_Init();
        // ---------------------------------------------------------------------

        // ---------------------------------------------------------------------
        // Init pressure sensor
    //初始化Bosch压力传感器
        bmp_ps_init();
        // Bosch sensor not found?
    //如果配置失败,清除标志位,然后初始化VTI SCP1000压力传感器,这个是为了兼容黑色pcb版本的Chorons。
        if (!ps_ok)
        {
            bmp_used = 0;
            cma_ps_init();
        }
        else
        {
                bmp_used = 1;
        }
    }

    参考原理图:


    // *************************************************************************************************
    // @fn          test_mode
    // @brief       Manual test mode. Activated by holding buttons STAR and UP simultaneously.
    //                              Cancelled by any other button press.
    // @param       none
    // @return      none
    // *************************************************************************************************
    void test_mode(void)
    {
        u8 test_step, start_next_test;
        u8 *str;
        u8 i;

        // Disable timer - no need for a clock tick
    //关闭定时器
        Timer0_Stop();

        // Disable LCD charge pump while in standby mode
        // This reduces current consumption by ca. 5礎 to ca. 10礎
        LCDBVCTL = 0;

        // Show welcome screen
    //显示LCD的所有字段
        display_chars(LCD_SEG_L1_3_0, (u8 *) "0430", SEG_ON);
        display_chars(LCD_SEG_L2_4_0, (u8 *) "CC430", SEG_ON);
        display_symbol(LCD_SEG_L1_COL, SEG_ON);
        display_symbol(LCD_ICON_HEART, SEG_ON);
        display_symbol(LCD_ICON_STOPWATCH, SEG_ON);
        display_symbol(LCD_ICON_RECORD, SEG_ON);
        display_symbol(LCD_ICON_ALARM, SEG_ON);
        display_symbol(LCD_ICON_BEEPER1, SEG_ON);
        display_symbol(LCD_ICON_BEEPER2, SEG_ON);
        display_symbol(LCD_ICON_BEEPER3, SEG_ON);
        display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
        display_symbol(LCD_SYMB_AM, SEG_ON);

        // Hold watchdog
    //关闭看门狗
        WDTCTL = WDTPW + WDTHOLD;

        // Wait for button press
    //等待按键
        _BIS_SR(LPM3_bits + GIE);
        __no_operation();

        // Clear display
    //清除LCD显示
        display_all_off();

    #ifdef USE_LCD_CHARGE_PUMP
        // Charge pump voltage generated internally, internal bias (V2-V4) generation
        // This ensures that the contrast and LCD control is constant for the whole battery lifetime
        LCDBVCTL = LCDCPEN | VLCD_2_72;
    #endif

        // Renenable timer
    //使能Timer0
        Timer0_Start();

        // Debounce button press
    //按键去抖,延时100ms
        Timer0_A4_Delay(CONV_MS_TO_TICKS(100));


    //
    //按键定义见上原理图,P2口,0,1,2,3,4
    #define BUTTON_STAR_PIN             (BIT2)
    #define BUTTON_NUM_PIN               (BIT1)
    #define BUTTON_UP_PIN                  (BIT4)
    #define BUTTON_DOWN_PIN            (BIT0)
    #define BUTTON_BACKLIGHT_PIN      (BIT3)
    #define ALL_BUTTONS                     (BUTTON_STAR_PIN + BUTTON_NUM_PIN + BUTTON_UP_PIN + \
                                                           BUTTON_DOWN_PIN + BUTTON_BACKLIGHT_PIN)

    参考图片:

    while (1)
        {
            // Check button event
    //针对不同的按键做出不同的响应
    //如果"*"和向上键同时按下

            if (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED)
            {
                // Start with test #0
                test_step = 0;
                start_next_test = 1;
                while (1)
                {
                    if (start_next_test)
                    {
                        // Clean up previous test display
                        display_all_off();

                        start_next_test = 0;

                        switch (test_step)
                        {
                            case 0: // All LCD segments on
                                display_all_on();
                                // Wait until buttons are off
                                while (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED) ;
                                break;
                            case 1: // Altitude measurement
                                display_altitude(LINE1, DISPLAY_LINE_UPDATE_FULL);
                                for (i = 0; i < 2; i++)
                                {
                                    while ((PS_INT_IN & PS_INT_PIN) == 0) ;
                                    do_altitude_measurement(FILTER_OFF);
                                    display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
                                }
                                stop_altitude_measurement();
                                break;
    //温度测量
                            case 2: // Temperature measurement
                                display_temperature(LINE1, DISPLAY_LINE_UPDATE_FULL);
                                for (i = 0; i < 4; i++)
                                {
                                    Timer0_A4_Delay(CONV_MS_TO_TICKS(250));
                                    temperature_measurement(FILTER_OFF);
                                    display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
                                }
                                break;
    //加速度测量,在初始化的时候已经根据硬件不同,置不同的标志位,这里根据标志位选择BOSCH或者VTI的加速度传感器。
    //以兼容不同的硬件版本

                            case 3: // Acceleration measurement
                                    if (bmp_used)
                                    {
                                    bmp_as_start();
                                    }
                                    else
                                    {
                                    cma_as_start();
                                    }
                                for (i = 0; i < 4; i++)
                                {
                                    Timer0_A4_Delay(CONV_MS_TO_TICKS(250));
                                        if (bmp_used)
                                        {
                                        bmp_as_get_data(sAccel.xyz);
                                        }
                                        else
                                        {
                                        cma_as_get_data(sAccel.xyz);
                                        }
                                    str = int_to_array(sAccel.xyz[0], 3, 0);
                                    display_chars(LCD_SEG_L1_2_0, str, SEG_ON);
                                    str = int_to_array(sAccel.xyz[2], 3, 0);
                                    display_chars(LCD_SEG_L2_2_0, str, SEG_ON);
                                }
                                    if (bmp_used)
                                    {
                                    bmp_as_stop();
                                    }
                                    else
                                    {
                                    cma_as_stop();
                                    }
                                break;
                            case 4: // BlueRobin test
                                button.flag.up = 1;
                                sx_bluerobin(LINE1);
    //按键去抖,延时100ms
                                Timer0_A4_Delay(CONV_MS_TO_TICKS(100));
                                get_bluerobin_data();
                                display_heartrate(LINE1, DISPLAY_LINE_UPDATE_FULL);
                                stop_bluerobin();
                                break;
                        }

                        // Debounce button
    //按键去抖,延时200ms
                        Timer0_A4_Delay(CONV_MS_TO_TICKS(200));
                    }

                    // Check button event
                    if (BUTTON_STAR_IS_PRESSED)
                    {
                        test_step = 1;
                        start_next_test = 1;
                    }
                    else if (BUTTON_NUM_IS_PRESSED)
                    {
                        test_step = 2;
                        start_next_test = 1;
                    }
                    else if (BUTTON_UP_IS_PRESSED)
                    {
                        test_step = 3;
                        start_next_test = 1;
                    }
                    else if (BUTTON_DOWN_IS_PRESSED)
                    {
                        test_step = 4;
                        start_next_test = 1;
                    }
                    else if (BUTTON_BACKLIGHT_IS_PRESSED)
                    {
                        // Wait until button has been released (avoid restart)
                        while (BUTTON_BACKLIGHT_IS_PRESSED) ;

                        // Disable LCD and LCD charge pump
                        LCDBCTL0 &= ~BIT0;
                        LCDBVCTL = 0;

                        // Debounce button press
    //按键去抖,延时500ms
                        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));

                        // Disable timer - no need for a clock tick
                        Timer0_Stop();

                        // Hold watchdog
                        WDTCTL = WDTPW + WDTHOLD;

                        // Sleep until button is pressed (ca. 4礎 current consumption)
                        _BIS_SR(LPM4_bits + GIE);
                        __no_operation();

                        // Force watchdog reset for a clean restart
    //看门狗标志位置位,是系统复位
                        WDTCTL = 1;
                    }

    #ifdef USE_WATCHDOG
                    // Service watchdog
                    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;
    #endif
                    // To LPM3
    //进入LPM3功耗模式
                    _BIS_SR(LPM3_bits + GIE);
                    __no_operation();
                }
            }
            else
            {
                // Debounce button
    //按键去抖
                Timer0_A4_Delay(CONV_MS_TO_TICKS(100));
                button.all_flags = 0;

                // Turn off backlight
    //关闭背光
                P2OUT &= ~BUTTON_BACKLIGHT_PIN;
                P2DIR &= ~BUTTON_BACKLIGHT_PIN;
                break;
            }
        }
    }
    复制内容到剪贴板
    1. idle_loop();
    这个函数的功能是当cpu IDLE的时候,切换进入LPM3低功耗模式。
    CPU内的状态寄存器SR种的SCG1、SCG2、OscOff和CPUOff是重要的低功耗控制位。
    MSP430的几种低功耗模式下的时钟运行情况如下图所示:

    由于不同的休眠模式下,系统使用的时钟可能是不同的,所以在“喂狗”的时候需要选择合适的时钟源
    复制内容到剪贴板
    1. // *************************************************************************************************
    2. // @fn          idle_loop
    3. // @brief       Go to LPM. Service watchdog timer when waking up.
    4. // @param       none
    5. // @return      none
    6. // *************************************************************************************************
    7. void idle_loop(void)
    8. {
    9.     // To low power mode
    10. //
      #define LPM0_bits              (CPUOFF)
    11. #define LPM1_bits              (SCG0+CPUOFF)
    12. #define LPM2_bits              (SCG1+CPUOFF)
    13. #define LPM3_bits              (SCG1+SCG0+CPUOFF)
    14. #define LPM4_bits              (SCG1+SCG0+OSCOFF+CPUOFF)
    //_BIS_SR(LPM3_bits + GIE);
    //void __bis_SR_register(unsigned short);
    //功能:将CPU 中SR 寄存器中的某些位置1。其参数为屏蔽码,需要置1 的位为1。
        to_lpm();

    #ifdef USE_WATCHDOG
        // Service watchdog
    //清除看门狗定时器
        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;
    #endif
    }

    这个函数用来处理内部和外部的各种唤醒事件,如按键操作,IDLE超时
    // *************************************************************************************************
    // @fn          wakeup_event
    // @brief       Process external / internal wakeup events.
    // @param       none
    // @return      none
    // *************************************************************************************************
    void wakeup_event(void)
    {
        // Enable idle timeout
        //使能IDEL超时,当“长时间”不做进一步操作的时候,做超时处理
        sys.flag.idle_timeout_enabled = 1;

        // If buttons are locked, only display "buttons are locked" message
        //如果按键被锁定,显示"buttons are locked"信息
        //同时按下#和向下方向键可以将按键锁定,有点类似于手机的按键锁一样
        if (button.all_flags && sys.flag.lock_buttons)
        {
            // Show "buttons are locked" message synchronously with next second tick
            if (!(BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED))
            {
                message.flag.prepare = 1;
                message.flag.type_locked = 1;
            }
            // Clear buttons
            button.all_flags = 0;
        }
        // Process long button press event (while button is held)
        //处理按键“长按”事件

        //长按*键
        else if (button.flag.star_long)
        {
            // Clear button event
            //清除长按*键标志位
            button.flag.star_long = 0;

            // Call sub menu function
            //进入当前菜单的子菜单,第一行菜单
            ptrMenu_L1->mx_function(LINE1);

            // Set display update flag
            //置刷新屏幕标志位
            display.flag.full_update = 1;
        }

        //长按#键
        else if (button.flag.num_long)
        {
            // Clear button event
            //清除长按#键标志位
            button.flag.num_long = 0;

            // Call sub menu function
            //进入当前菜单的子菜单,第二行菜单
            ptrMenu_L2->mx_function(LINE2);

            // Set display update flag
            //置刷新屏幕标志位
            display.flag.full_update = 1;
        }
        // Process single button press event (after button was released)
        //普通按键事件,短按按键
        else if (button.all_flags)
        {
            // M1 button event ---------------------------------------------------------------------
            // (Short) Advance to next menu item
            //“短按”进入下一个菜单,和长按不一样,长按是进入子菜单
            //短按*键
            if (button.flag.star)
            {
                // Clean up display before activating next menu item
                //清除第一行显示的内容
                fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);

                // Go to next menu entry
                //进入下一菜单
                ptrMenu_L1 = ptrMenu_L1->next;

                // Assign new display function
                //为第一行显示函数指针赋值
                fptr_lcd_function_line1 = ptrMenu_L1->display_function;

                // Set Line1 display update flag
                //置刷新第一行屏幕标志位
                display.flag.line1_full_update = 1;

                // Clear button flag
                //清除*键按下标志位
                button.flag.star = 0;
            }
            // NUM button event ---------------------------------------------------------------------
            // (Short) Advance to next menu item
            //短按#事件,与*类似,不再赘述
            else if (button.flag.num)
            {
                // Clear rfBSL confirmation flag
                rfBSL_button_confirmation = 0;

                // Clean up display before activating next menu item
                fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);

                // Go to next menu entry
                ptrMenu_L2 = ptrMenu_L2->next;

                // Assign new display function
                fptr_lcd_function_line2 = ptrMenu_L2->display_function;

                // Set Line2 display update flag
                display.flag.line2_full_update = 1;

                // Clear button flag
                button.flag.num = 0;
            }
            // UP button event ---------------------------------------------------------------------
            // Activate user function for Line1 menu item
            //向上按键事件
            //调用当前菜单的功能函数,置LINE1刷新标志位,清除按键事件标志位
            else if (button.flag.up)
            {
                // Call direct function
                ptrMenu_L1->sx_function(LINE1);

                // Set Line1 display update flag
                display.flag.line1_full_update = 1;

                // Clear button flag
                button.flag.up = 0;
            }
            // DOWN button event ---------------------------------------------------------------------
            // Activate user function for Line2 menu item
            //向下按键事件
            //如果当前菜单是RFBSL,do nothing
            //调用当前菜单功能函数,置LINE2刷新标志位,清除按键事件标志位
            else if (button.flag.down)
            {
                if (ptrMenu_L2 == &menu_L2_RFBSL)
                {

                }

                // Call direct function
                ptrMenu_L2->sx_function(LINE2);

                // Set Line1 display update flag
                display.flag.line2_full_update = 1;

                // Clear button flag
                button.flag.down = 0;
            }
        }
        // Process internal events
        //处理内部事件,IDLE超时
     //如果IDLE超时后,清除超时标志位,清除当前显示,刷新屏幕,并禁用超时功能
       //因为超时退出后,不需要超时了,所以禁用此功能
        if (sys.all_flags)
        {
            // Idle timeout ---------------------------------------------------------------------
            if (sys.flag.idle_timeout)
            {
                // Clear timeout flag
                sys.flag.idle_timeout = 0;

                // Clear display
                clear_display();

                // Set display update flags
                display.flag.full_update = 1;
            }
        }
        // Disable idle timeout
        sys.flag.idle_timeout_enabled = 0;
    }
    上面代码中提到menu,这里先插播一下ez430的menu吧。
    menu结构体定义在menu.h中,具体如下
    复制内容到剪贴板
    1. struct menu
    2. {
    3.     // Pointer to direct function (start, stop etc)
    4. //当前功能函数指针
    5.     void (*sx_function)(u8 line);
    6.     // Pointer to sub menu function (change settings, reset counter etc)
    7. //子函数功能指针
    8.     void (*mx_function)(u8 line);
    9.     // Pointer to display function
    10. //显示函数指针
    11.     void (*display_function)(u8 line, u8 mode);
    12.     // Display update trigger
    13. //显示更新触发函数指针
    14.     u8 (*display_update)(void);
    15.     // Pointer to next menu item
    16. //指向下一菜单结构体的指针
    17.     const struct menu *next;
    18. };
    EZ430的屏幕上有两行,代码中把两行作为两个独立的菜单来对待,分别为LINE1和LINE2。
    通过手表上的*和#键进行操作。
    短按按键为进入下一菜单,长按按键进入子菜单。

    菜单的初始化在menu.c中,两组菜单均初始化为循环单链表的数据结构,也就是说,你只能通过
    按键,循环一圈才能回到当前菜单。因为对每组菜单的操作按键只有一个,上下键为修改功能键,
    所以这么设计是合情合理的。

    我们以LINE1菜单为例简单说明一下:
    第一个菜单时间显示菜单初始化如下:
    复制内容到剪贴板
    1. const struct menu menu_L1_Time = {
    2.     FUNCTION(sx_time),                // direct function
    3.     FUNCTION(mx_time),                // sub menu function
    4.     FUNCTION(display_time),           // display function
    5.     FUNCTION(update_time),            // new display data
    6.     &menu_L1_Alarm,
    7. };
    最后一个菜单加速度初始化如下:
    复制内容到剪贴板
    1. // Line1 - Acceleration
    2. const struct menu menu_L1_Acceleration = {
    3.     FUNCTION(sx_acceleration),        // direct function
    4.     FUNCTION(dummy),                  // sub menu function
    5.     FUNCTION(display_acceleration),   // display function
    6.     FUNCTION(update_acceleration),    // new display data
    7.     &menu_L1_Time,
    8. };
    注意蓝色部分代码,最后一个菜单的下一菜单指向第一个菜单。

    所以我们可以修改下一个菜单的指针,来"屏蔽"那些我们没法使用的功能
    // *************************************************************************************************
    // User navigation ( [____] = default menu item after reset )
    //
    //      LINE1:  [Time] -> Alarm -> Temperature -> Altitude -> Heart rate -> Speed -> Acceleration
    //
    //      LINE2:  [Date] -> Stopwatch -> Battery  -> ACC -> PPT -> SYNC -> Calories/Distance --> RFBSL
    // *************************************************************************************************

    // Line1 - Altitude
    const struct menu menu_L1_Altitude = {
        FUNCTION(sx_altitude),            // direct function
        FUNCTION(mx_altitude),            // sub menu function
        FUNCTION(display_altitude),       // display function
        FUNCTION(update_time),            // new display data
        &menu_L1_Speed,           //&menu_L1_Heartrate,如此修改就可以"屏蔽"Heart rate菜单

    在wakeup_event()中根据不同的事件置了不同的标志位,挂接对应的函数,
    在process_requesets()中根据不同的标志位做不同的处理。
    此函数调用底层的驱动接口,所以看起来比较简单明了。
    // *************************************************************************************************
    // @fn          process_requests
    // @brief       Process requested actions outside ISR context.
    // @param       none
    // @return      none
    // *************************************************************************************************
    void process_requests(void)
    {
        // Do temperature measurement
    //温度测量
        if (request.flag.temperature_measurement)
            temperature_measurement(FILTER_ON);

        // Do pressure measurement
    //压力测量
        if (request.flag.altitude_measurement)
            do_altitude_measurement(FILTER_ON);

        // Do acceleration measurement
    //加速度测量
        if (request.flag.acceleration_measurement)
            do_acceleration_measurement();

        // Do voltage measurement
    /电池电压测量
        if (request.flag.voltage_measurement)
            battery_measurement();

        // Generate alarm (two signals every second)
    //蜂鸣器鸣叫
        if (request.flag.buzzer)
            start_buzzer(2, BUZZER_ON_TICKS, BUZZER_OFF_TICKS);

        // Reset request flag
    //处理完对应的事件后,清除标志位
        request.all_flags = 0;
    }

    下面这个函数的功能很简单,就是根据对应的显示标志位,刷新LCD
    复制内容到剪贴板

    1. // *************************************************************************************************
    2. // @fn          display_update
    3. // @brief       Process display flags and call LCD update routines.
    4. // @param       none
    5. // @return      none
    6. // *************************************************************************************************
    7. void display_update(void)
    8. {
    9.     u8 line;
    10.     u8 string[8];
    11.     // ---------------------------------------------------------------------
    12.     // Call Line1 display function
    13. //调用LINE1显示函数
    14.     if (display.flag.full_update || display.flag.line1_full_update)
    15.     {
    16. //清除LINE1显示内容
    17.         clear_line(LINE1);
    18. //更新显示LINE1内容
    19.         fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_FULL);
    20.     } else if (ptrMenu_L1->display_update())
    21.     {
    22.         // Update line1 only when new data is available
    23. //仅当有新数据的时候更新LINE1显示
    24.         fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);
    25.     }
    26.     // ---------------------------------------------------------------------
    27.     // If message text should be displayed on Line2, skip normal update
    28. //如果有文本信息需要在LINE2显示
    29.     if (message.flag.show)
    30.     {
    31.         line = LINE2;
    32.         // Select message to display
    33.         if (message.flag.type_locked)
    34.             memcpy(string, "  LO?T", 6);
    35.         else if (message.flag.type_unlocked)
    36.             memcpy(string, "  OPEN", 6);
    37.         else if (message.flag.type_lobatt)
    38.             memcpy(string, "LOBATT", 6);
    39.         else if (message.flag.type_alarm_on)
    40.         {
    41.             memcpy(string, "  ON", 4);
    42.             line = LINE1;
    43.         } else if (message.flag.type_alarm_off)
    44.         {
    45.             memcpy(string, " OFF", 4);
    46.             line = LINE1;
    47.         }
    48.         // Clear previous content
    49.         clear_line(line);
    50.         fptr_lcd_function_line2(line, DISPLAY_LINE_CLEAR);
    51.         if (line == LINE2)
    52.             display_chars(LCD_SEG_L2_5_0, string, SEG_ON);
    53.         else
    54.             display_chars(LCD_SEG_L1_3_0, string, SEG_ON);
    55.         // Next second tick erases message and repaints original screen content
    56. //下一个tick清除文本信息,重新显示原始信息
    57.         message.all_flags = 0;
    58.         message.flag.erase = 1;
    59.     }
    60.     // ---------------------------------------------------------------------
    61.     // Call Line2 display function
    62. //LINE2显示更新
    63.     else if (display.flag.full_update || display.flag.line2_full_update)
    64.     {
    65.         clear_line(LINE2);
    66.         fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_FULL);
    67.     } else if (ptrMenu_L2->display_update() && !message.all_flags)
    68.     {
    69.         // Update line2 only when new data is available
    70.         fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);
    71.     }
    72.     // ---------------------------------------------------------------------
    73.     // Restore blinking icons (blinking memory is cleared when calling set_value)
    74.     if (display.flag.full_update)
    75.     {
    76.         if (is_bluerobin() == BLUEROBIN_CONNECTED)
    77.         {
    78.             // Turn on beeper icon to show activity
    79.             display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);
    80.             display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);
    81.             display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);
    82.         }
    83.     }
    84.     // Clear display flag
    85.     display.all_flags = 0;
    86. }

  • 作者: EEWORLD网友cat3902982

    【晒心得】购得的TI的频谱分析仪到手-购买过程体验心得

    首先打开TI促销,我抢红包!,如下图所示,可以看到一个购买攻略

    点开它,按照里面的步骤,一步一步进行。直到付款成功,过一段时间,我们的邮箱会收到一份确认邮件。

    好了,下面就没我们的事了,要做的只有等待。接下来TI确认可以发货了,他会通过联邦快递进行发货。同样的,你也会收到一份通知邮件。同时你也可以查看订单状态。


    只用了4天,我的货就从美国发到我的手上了。联邦快递的外包装被我拆了,就拍下收到的物件吧!

    盒子外观欣赏:

    拆开盒子包装,里面包括:分析仪、天线、资料光盘、说明书、USB线等物品。


    总的来说,这次购买TI的物品很顺畅。物品到的也快,礼拜一下的单,礼拜五就收到了哦,很是方便。

    谢谢EEWORLD给我们提供的这么好的机会,可以购买这么好的东西。

    [ 本帖最后由 cat3902982 于 2013-9-6 23:41 编辑 ]

    附件

     EEWORLD提示:为减少服务器的压力,请尽量不要使用迅雷等下载软件。
     频谱仪 快递单号和海关文件.JPG (228.42 KB)

    2013-9-6 23:24

     P1010864.JPG (244.15 KB)

    2013-9-6 23:24

    P1010864.JPG

     P1010867.JPG (252.63 KB)

    2013-9-6 23:24

    P1010867.JPG

     P1010868.JPG (235.62 KB)

    2013-9-6 23:24

    P1010868.JPG

  • 作者:EEWORLD网友cat3902982

    【晒心得】TI的频谱分析仪-入门心得

    收到心得见【晒心得】购得的TI的频谱分析仪到手-购买过程体验心得
    收到TI的东西,拆开后发现TI的做工还是不错的。外壳是用的磨砂,感觉像金属材质一样。
    首先,我先拆开光盘,打开光盘,内部有如下资料:

    里面包括了,安装软件和使用说明书,及资料更新网址。接下来开始安装软件。软件按装完,插上分析仪。会自动加载硬件驱动。如下图所示:

    应该是个USB转串口的通信接口。正是因为这个,所以在后面使用软件的时候,扫描带宽比较大的时候,显示的时候会比较慢。

    软件初始话界面,属于TI的风格。打开软件后,左边是显示框:

    右边是设置栏,上边是工具按钮。



    设置标签栏,包括了:HardWare、RF Settings、Traces、Maker、Screen

    hardware栏:指示硬件连接状态,以及连接的控制。

    RF Setting:主要设置频谱分析的参数

    Traces:设置一些测量线的使能控制。

    Maker:主要是用来控制Trace里面设置的一些测量线

    Screen:主要用于显示区域的控制。
    打开软件后,连接上硬件,在Hardware标签栏里,我们会看见COM3连接上:

    此时我们点击下面的CONNECT,会显示硬件的一些信息:

    这样这台设备的所有初始话工作都做完了,连上后硬件如下图所示:
     
  • 【晒心得】TI的频谱分析仪-使用心得

    作者:EEWORLD网友cat3902982

    这里先讲下我测试的输入信号:
    1.433MHz的数据传输模块的发射信号;
    2.315MHz的信号数据传输模块的发射信号;
    首先我测试的是433MHz的模块,打开RF Settings 标签。将EasyRF 按钮弹开,选择频端在389MHz-463MHz,模式为扫频模式,从389.5MHz扫到460.5MHz;选择连续扫描模式。点击开始按钮。如下图所示:

    这时我们看到430MHz-440MHz之间有检测到信号,在将扫描的设置值修改为430MHz-440MHz;点击开始按钮。如下图所示:

    这时我们看到432MHz-436MHz之间有检测到信号,在将扫描的设置值修改为432MHz-436MHz;点击开始按钮。如下图所示:

    这时,可以测到我433MHz的信号的中心频点在433.85MHz左右。
    上面使用的连续扫描的方式测到信号的频谱,这时我们采用中心频点加频偏的方式。如下图所示,中心频点设为433MHz、频偏设为3MHz。点击开始扫描按钮。

    这时也可以测到信号的中心频点和信号强度的信息。
    同样的方式,我们在测试315MHz的时候,先选择频段:300MHz-348MHz,设置扫描的开始频点300MHz、结束频点340MHz。选择连续扫描模式。点击开始按钮。如下图所示:

    按433MHz同样的方式,测到最后信号的中心频点在315MHz附近,如下图所示:

    用中心频点家频偏的扫描方式,如下图所示。

    在频谱仪工作在采集模式的时候,其硬件工作状态如下图所示:

    注意下:在连续出发的模式下:以上图中的红线,是实时的测试数据,绿线是红线检测到的最高值。
                  在单次出发的模式下:没有红线,绿线就代表测到的数据。

    本来也不知道TRACE和MAKERS两个标签栏干嘛的,摸索了下,发现他们是用来测试信号的dB值的,如下图所示:

    右边下边的旋钮是控制测试线调动的,在测试线的上方会显示,当前测试信号的dB值,用起来也比较方便,这些线的使能是在TRACES标签中进行控制。如下图所示

    不过这里也发现了个问题,当我测试完后,这些线不需要使用,我将各个TRACE都关闭的时候,软件出现了bug,如下图所示:
     

    总结:TI的这款精简版的频谱分析仪,我觉得是基础功能OK,扩展功能需要更强大点!
    它能测试的频段有限制,我觉得是CC430本身的限制,它自身就只支持那3个频段。
    他的功能也非常的有限,希望TI在后续的时候可以在这个软件的基础上再开发些功能。我看到一个带宽的设置(如下图所示),不知道是不是数据的带宽的设置,如果以后能加数据的解析的功能的话,这个分析仪就真的买赚了哈!

    具体的硬件测试的器件,明天再拍照上传吧!

  • 【晒心得】TI的频谱分析仪底噪不同的分析

    作者:EEWORLD网友cat3902982

    在看到有其它网友也买了这个分析仪,突然发现我跟其的底噪相差很大。今天晚上尝试着找找原因。我主要改变了软件设置中的RefLvl,将其值分别设置如下:
    RefLvl = -70dB时其底噪如下:

    RefLvl = -50dB时其底噪如下:

    RefLvl = -35dB时其底噪如下:

    从上面可以看出设置RefLvl会对底噪的显示会产生影响。
    上个帖子中【晒心得】TI的频谱分析仪-使用心得使用的信号发射器如下图所示:左边是一个433MHz的信号发射模块,右边是一个315MHz的信号发射模块。这两个其实跟我们平时见到的电动卷帘门的遥控器或者电瓶车的防盗遥控器是一样的。

    当这边有信号发出时,设置不同的RefLvl值时其测到的波形如下
    RefLvl = -70dB 315MHz测试波形如下:

    RefLvl = -50dB 315MHz测试波形如下:

    RefLvl = -35dB 315MHz测试波形如下:
     
    从上图中可以看出,当RefLvl的设置值较低时,其灵敏度较高,测到的信号较多;当RefLvl的设置值较低时,其灵敏度较高,测到的信号较集中。就像对信号进行了滤波后的显示。
    本来买这个东西的目的,主要是想调试上面的遥控器。那个433MHz的信号发射有问题,接收不是太灵敏。总是一会能收到信号,一会收不到信号。用这个频谱 仪看了下信号,发现个问题,就是这个发射器的中心频点并不在433MHz,而是在433.9MHz上,不知道这个是不是接收不太灵敏的主要原因。还希望懂 无线通信的大虾可以科普讲解下。这个跟它的数据带宽有关吗?


  • 【晒心得】TI的频谱分析仪测试EZ430-CHRONOS-433 的无线信号

     作者:EEWORLD网友cat3902982

    今天把我在论坛买的EZ430-CHRONOS-433 的无线手表,想通过频谱分析仪测试一下手表的信号,结果测了半天啥也没测到,白忙活了半天。

    也不知道为什么,感觉是不是手表的信号太弱了。因为在使用AP板的时候也是,手表必须离AP板50cm左右,当超过这个值的时候,通信就没有反应了。
    还有发现了一个BUG,就是频谱分析仪,和CHRONOS-433 的无线AP不能同时使用,在打开上位机的时候,两个当中只能有一个在工作。我也检查了硬件,两个的COM口也是不一样的,按理说TI自己的东西应该可以兼容的啊,不知道为啥会出现这样的情况。
    信号测了半天,也没测到啥,也就不贴图了,不过这个BUG到是很好奇是怎么回事了????

  • 【晒心得】初步使用CC2541 SensorTag

      作者:EEWORLD网友wangfuchong

     

    一.订购
    95号下的订单,好像是19号左右发的货,25号实际上就到我这个地区县城了,但是本地区联邦快递代理一般是不送到乡镇的,要去取,但是包裹单上也没有电话号码联系我。联邦快递说又向发货方要电话号码,告诉我去取。好像是929号自己去取到手的。

    二.外观把玩
    先上点外观照片,

    请问这张照片中最左边多出来的透明塑料片大家安装的时候是怎么处理的?我是折回来两个孔正好对着按键,不知道对不对?


                                  


    以前曾经想申请红外温度传感器,没想到实际尺寸这么小呀,就是申请到了可能还真焊接不了,太小了。
    硬件电路图之类在官网如下链接找到:



    不知道从机械结构或光学结构上来说,用于TMP006红外温度传感器的那个孔有没有什么讲究?尤其是里面的透明塑料壳上的。



    对照相关文档:

    CC2541 SensorTag Quick Start Guide

    总结一下:
    SensorTag 基于 CC2541 与 TI 的 TPS62730(降压转换器)配合工作。它包含 TI 的 TMP006 IR MEMS 温度传感器、湿度传感器、压力传感器、加速计、回转仪和磁力计。想来除了可用来体验低功耗蓝牙BLE性能,还有这么多传感器,如果时间充裕,对于学习来说 一定很能富有乐趣。实际上TI官网也介绍说:SensorTag的多功能性意味着无限的应用可能性,其中包括健康与健身、医疗、教育工具、玩具、远程控 制、移动电话附件、邻近和室内定位等领域的应用。EEWORLD现在正在进行一项活动:


    SensorTag这么多传感器,参加这个活动应该随便都能想想出来可能的目的初步方案来。

    三.上电
    按照手册装上包装盒里的CR2032纽扣电池,按下侧键,一个LED长时间闪烁后自动停止;分别按下顶部的两个按键,都是另外一颗LED闪 烁一两秒钟。装上外壳,感觉一直受操作按键很方便,中指正好可以操作侧键,大拇指可以操作顶部的两个按键。顶部的两个按键尤其很有触摸感很容易不用看找到 位置,据论坛中的一个帖子网友说顶部两个按键的外壳部位的几个凸点还是盲文,虽然一般人用不着盲文,但是感觉也有利于正常人操作。完整装上外壳后LED灯显得有点暗,但是还是能看到闪烁的。
    看来可以初步判断收到的SensorTag应该是能够工作没有损坏的,但是穷人我没有什么ipad什么iphone之类的,还需要想法试试蓝牙连接呀!

    四.使用BLE Device Monitor初试蓝牙连接

    为了使买的SensorTag能够充分体验价值,穷人我一冲动可是花了血本呀!

    在淘宝买了一套工具,没法呀,TI官网的太贵。

    没有iXX什么的,我就用平常的电脑,使用BLE Device Monitor软件!

    BLE Device Monitor软件下载:downloaded here

    使用BLE Device Monitor软件需要硬件CC2540 USB dongle

    先看指导手册:


    特别需要注意的是需要按照手册中的要求重新烧写CC2540 USB dongle的固件。然后插上CC2540 USB dongle,在电脑的设备管理器中查找记下对应的COM端口号。

    打开BLE Device Monitor软件,设置选择相应的端口号,在左下框里会出现蓝牙host,如图:





    在软件出现SCAN…提示框的时候(Autoscan默认是打开的)按一下下SensorTag的侧键使之进入广播状态,软件则会扫描到SensorTag并如下图显示在左下框网络列表里。如果错过了软件自动扫描时间,可以手动点击Scan按钮进行扫描。这时还没有连接,点击Connect按钮进行连接,连接如果成功在Status列显示Connected





    右侧大框底部的Autodiscover默认是打开的,如果连接成功会列出发现的服务属性列表,如下图,也可以手动点击Discover按钮。






    在属性列表中按级别显示服务,特性和属性,暂不详述。


    作为第一次使用,当然是急着看看传感器啦,右侧框顶部切换到SensorTag标签,显示如下图:






    在“Test”模式,点击“Start”可以进行检测SensorTag功能是否正常,按照提示操作即可,不详述。

    在“Monitoring”模式,确定上方的传感器都选中,点击“Start”,就可以看到不断刷新的传感器数据啦。

    感觉还是比较准的,例如三个传感器片内温度,相差不大,气压和气象站网站的也差不多。

    这里提一下红外测温,初步测试,感觉好像弄不准,相差很大。

    可是看这个官方这个视频拍的真够煽情,测咖啡的温度,多酷呀:TI蓝牙低能耗SensorTag:开启无限应用可能




    顺手贴一下关于红外测温的介绍:


      依据测温原理的不同,红外测温仪的设计有三种方法,通过测量辐射物体的全波长 的热辐射来确定物体的辐射温度的称为全辐射测温法;通过测量物体在一定波长下的单色辐射亮度来确定它的亮度温度的称为亮度测温法;如果是通过被测物体在两 个波长下的单色辐射亮度之比随温度变化来定温的称为比色测温法。


    亮度测温法无需环境温度补偿,发射率误差较小,测温精度高,但工作于短波区,只适于高温测量。比色测温法的光学系统 可局部遮挡,受烟雾灰尘影响小,测温误差小,但必须选择适当波段,使波段的发射率相差不大。本文选用全辐射测温法来计算被测量物体的温度,全辐射测温法是 根据所有波长范围内的总辐射而定温,得到的是物体的辐射温度。选用这种方法是因为中低温物体的波长较大,辐射信号很弱,而且结构简单,成本较低,但它的测 温精度稍差,受物体辐射率影响大。


    固定的予置为0.95的发射率。该发射率值是对于多数有机材料、油漆或氧化表面的表面温度,就要用一种胶带或平光黑漆涂于被测表面加以补偿。使胶带或漆达到与基底材料相同温度时,测量胶带或漆表面的温度,即为其真实温度。

    这里闲扯到校准的问题,有关详细请参看官网关于TMP006的文档:TMP006 User Guide,编号: sbou107


    但是SensorTag源代码中好像传输的不是计算过后的温度值,而是热电堆的电压或者芯片内置温度传感器的芯片温度,这样的话,需要在Central设备方计算?

    在源文件hal_irtemp.c中:

    复制内容到剪贴板
    1. /**************************************************************************************************
    2. * @fn          HalIRTempRead
    3. *
    4. * @brief       Read the sensor voltage and sensor temperature registers
    5. *
    6. * @param       Voltage and temperature in raw format (2 + 2 bytes)
    7. *
    8. * @return      TRUE if valid data
    9. **************************************************************************************************/
    10. bool HalIRTempRead(uint8 *pBuf)
    11. {
    12.   uint16 v;
    13.   uint16 t;
    14.   bool success;
    15.   if (irtSensorState != TMP006_DATA_READY)
    16.   {
    17.     return FALSE;
    18.   }
    19.   HalIRTempSelect();
    20.   // Read the sensor registers
    21.   success = HalSensorReadReg(TMP006_REG_ADDR_VOLTAGE, (uint8 *)&v,IRTEMP_REG_LEN );
    22.   if (success)
    23.   {
    24.     success = HalSensorReadReg(TMP006_REG_ADDR_TEMPERATURE, (uint8 *)&t,IRTEMP_REG_LEN );
    25.   }
    26.   if (success)
    27.   {
    28.     // Store values
    29.     pBuf[0] = HI_UINT16( v );
    30.     pBuf[1] = LO_UINT16( v );
    31.     pBuf[2] = HI_UINT16( t );
    32.     pBuf[3] = LO_UINT16( t );
    33.   }
    34.   // Turn off sensor
    35.   if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN))
    36.   {
    37.     irtSensorState = TMP006_OFF;
    38.   }
    39.   HalDcDcControl(ST_IRTEMP,false);
    40.   return success;
    41. }

    上面代码中在SensorTag.c中直接调用了:

    复制内容到剪贴板
    1. static void readIrTempData( void )
    2. {
    3.   uint8 tData[IRTEMPERATURE_DATA_LEN];
    4.   if (HalIRTempRead(tData))
    5.   {
    6.     IRTemp_SetParameter( IRTEMPERATURE_DATA, IRTEMPERATURE_DATA_LEN, tData);
    7.   }
    8. }

    而在在源文件hal_irtemp.c中有这样一段代码是注释掉的没有使用:

    复制内容到剪贴板
    1. /*  Conversion algorithm for die temperature
    2. *  ================================================
    3. *
    4. double calcTmpLocal(uint16 rawT)
    5. {
    6.     //-- calculate die temperature [癈] --
    7.     m_tmpAmb = (double)((qint16)rawT)/128.0;
    8.     return m_tmpAmb;
    9. }
    10. *
    11. * Conversion algorithm for target temperature
    12. *
    13. double calcTmpTarget(uint16 rawT)
    14. {
    15.     //-- calculate target temperature [癈] -
    16.     double Vobj2 = (double)(qint16)rawT;
    17.     Vobj2 *= 0.00000015625;
    18.     double Tdie2 = m_tmpAmb + 273.15;
    19.     const double S0 = 6.4E-14;            // Calibration factor
    20.     const double a1 = 1.75E-3;
    21.     const double a2 = -1.678E-5;
    22.     const double b0 = -2.94E-5;
    23.     const double b1 = -5.7E-7;
    24.     const double b2 = 4.63E-9;
    25.     const double c2 = 13.4;
    26.     const double Tref = 298.15;
    27.     double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));
    28.     double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);
    29.     double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);
    30.     double tObj = pow(pow(Tdie2,4) + (fObj/S),.25);
    31.     tObj = (tObj - 273.15);
    32.     return tObj;
    33. }
    34. */

    这块的代码还没怎么看,不知道是不是这样。以后再学习钻研。


    BLE Device Monitor软件好像没有源代码,不知道怎么处理的。各位使用iPAD什么的,里面有关于校准的选项么?

    五.低功耗的初步感觉

    匆匆看了一下传感器,体验了一下直接的功能,接下来要关心的才是最重要的吆,低功耗!到底怎样?看看资料,也要体验验证一下吆

    在上面第4节使用BLE Device Monitor软件过程中,我就实现按照如下图的接法接入了万用表测电流。

    这是没有连接或者断开连接一段时间后电流显示值,8.4uA


                                  

    连接状态,但是没有选择任何传感器,电流1.08mA,注意,是毫安不是微安

    选中监视所有传感器,电流跳动值在8mA~10mA。如果电池电压不够,容易到一定电压就掉线。

    陀螺仪传感器电流比较大,其它加在一起电流值在3mA左右以下。

    仅仅连接状态就达1mA,那么例如报道的防丢器可以几个月不换电池,是怎么实现的呢?不要着急,自己还不懂BLE就学嘛,先了解一下。

    大概看了一些资料朦朦胧胧了解了一下,再看一下官方的视频:BLE课程(三):蓝牙低功耗技术的链接参数设置

    原理时间关系就不细述了,还是睡觉舒服。

    官方有片关于功耗测试方法的应用笔记文档,现在官网搜索打不开,没法找到链接贴出来,反正文档编号名称是:AN092 -- Measuring Bluetooth Low Energy Power Consumption_swra347a,大家感兴趣的以后自己搜索下载。

    那么就自己简陋的方法先看看吧,还是如第4节中的硬件接法,还是使用BLE Device Monitor软件。

    打开BLE Device Monitor软件菜单Options—GAP settings,出现设定界面,例如改成如下图设置:


    那么在仅仅连接的情况下电流多大呢?由于是使用的万用表,没法避免抖动,只能大概体验一下,用20mA档,显示0.01mA,抖动到0.1mA(忘记了,好像我间隔设置的可能四1S),总之反正不是原来那么大啦。提高频率,万用表可能不抖,更利于较精确比较,时间关系就不再做了,感兴趣的自己可以试验一下,例如原来间隔20mS,改成40mS,这样对比就很直观了。当然用示波器之类的更好吧。

    因此,像防丢器那样不可思议的能够至少使用几个月不是吹嘘的。
    六.使用Btool
    七.协议栈的初步了解
    八.使用展望


  • 【晒心得】eZ430-chronos上手试用

    作者:EEWORLD网友johnrey

    觊觎430chronos已经很久了,无奈原来价格太贵。element14上要4百多,taobao上少量有货,也是4-500的样子。这次趁着优惠 estore用支付宝不到200的包邮价格拿到,还是相当开心的。唯一不爽的是考虑到使用频率问题,选了433,那心率带什么的就没戏了。不过也好,省的 折腾啊,哈哈,懒人就是这样的。

    寄过来还是很快的,拿到就立马带上了,发现没有想象中那么大哦,本人手臂是比较细的,带上去还算协调,哈哈。很低调的一只表哦,拿出去唬同事还蛮管用的,“呀,Ti的手表。。。。”心里是不是嘀咕:这小子上哪参加研讨会送的吧。


    下图是手表的配件全家福。



    很细心的附上了两颗备用螺丝,是给手表后背的螺丝备用的。不过我拿到的这个是白色电路板的,和网上一直在贴的黑色版不一样。尤其是那个无线接收器(长方的那个)和包装盒以及quick start上的照片都不一样(要长很多),应该是收那一长条影响。这一长条是天线?

    430chronos的基本功能操作都可以在手表上完成,现在简单说说每个按钮的功能。其实chronos的显示上下两行是独立的,所以左边两颗按钮分别 控制上、下两行的状态转换,上面主要是时间、闹钟、温度、海拔、心率*、速度*、倾角。下面是日期、秒表、电池电压、无线倾斜控制、PPT控制、无线同 步、距离与卡路里、无线更新。那如果要对时间等进行设置,在对应模式下,长按对应位置的左按钮就行,然后用#切换设计项目,用上下箭头调节参数值。同时每 个模式有时候还有不同功能,比如时间的秒,比如日期的年,这个需要通过按上或下箭头来切换。

    懒人到手就把时间和日期给调好了。用了一段时间,精度还是不错的。其他功能也简单用了用,大致做下介绍,供参考。

    闹钟:毕竟控制按钮少,所以在上面调闹钟时间要摁很多按键,适合一天里面只要某个闹钟的家伙使用。同时因为上面有7中模式,因此调完闹钟还等摁好几下才能切回到时间模式。

    温度:很装逼的一个功能,前面有学生做了个18B20的温度计,然后问这准不准啊,我卡卡一按手表,小伙伴们惊呆了。过了一会儿说,这玩儿带在手上,要受 体温影响的歪。。。。。。事实上温度应该是可以校准的,长按*温度就会闪,然后用上下来调。不过,反正受影响了,就这样吧。

    海拔:这个应该大部分感觉是不准的,但是又有部分觉得应该在变化值上还算准,也就说到了一个地方应该需要根据当地的实际情况校准一下会比较合适。实际在一个山头走了走,反正有变化。

    以上两项以及时间也可以在control center中用rf方式来设置,更快。

    心率和速度,无法测试

    tilt:倾角其实有三轴,那通过上来切换。H代表x,y显示正常,2代表z轴。
     
    日期:格式为日-月,对国人来讲会有点不适用。板上有大大写了程序做修改的,不过对我这个懒人,就只能用高度适应能力去解决问题了。其实,看久了,就习惯了。按下切换为年。

    秒表:功能很简单,只有start,stop,试了很久才发现长按#是清零。

    电池电压没啥说的,到手3V,各个功能用了一遍,尤其是ppt,就到2.99V了

    tilt control没用

    PPT:这个其实是我原本很感兴趣的功能之一,到手之后赶紧用了用,发现要配合PC机的control center,吭哧吭哧装好,发现只有3个键可以用,坑爹啊。不过再想想也够了,前进,后退,全屏。基本满足。实际上这个还可以控制其他的,目前可选 itunes和mplayer,不过其实都可以自定义啦,就是选择按键功能嘛,说不定极品飞车咱不要刹车,也可以控制哦。有同学问为啥down键不能用? 因为down是ppt无线的开关啦。

    无线同步:这个也需要配合control center。首先start access point,然后就可以read和set了。有童鞋反应不能无线读取或更新系统数据,其实关键在手表的down,按一下,看看是不是就可以了。嘿嘿。不过 Ti的这个程序还是有很多bug的,经常无缘无故就说access point拔掉了,要自动关闭。

    懒人没有编程,所以无线更新就没用啦,更懒得拆表。所以,提供的也就是些表面的东西,供大家娱乐参考吧。

    末了,想起一个自己关心,可能大家也关心的问题,这货电池能撑多久??!!官方文件称:出厂时,处于LPM4模式,能撑92个月,我们拿到手,按任意键开 始处于时间日期模式,29个月!!哈哈,两年换个电池,应该不用太担心了。而使用rf同步是最耗电的,3.7mA,连续使用只能用2天。

    附件

     EEWORLD提示:为减少服务器的压力,请尽量不要使用迅雷等下载软件。
     DSC02449.JPG (451.61 KB)

    2013-10-15 21:44

    DSC02449.JPG

     DSC02477.JPG (450.76 KB)

    2013-10-15 21:44

    DSC02477.JPG

     DSC02450.JPG (516.17 KB)

    2013-10-15 21:44

    DSC02450.JPG

     rf控制配置.JPG (45.66 KB)

    2013-10-15 21:44

     rf同步.JPG (30.69 KB)

    2013-10-15 21:44


  • 【晒心得】 Chronos无线手表套件到手开箱~~~~~【多图杀猫^_^】

    作者:EEWORLD网友anqi90

    本来早就该到了,结果到了北京就趴在那里不动了,等了一个多星期还是没动静....

    昨天受不了了,给FedEx发了封邮件,问是不是出问题了,结果今天一查,已经开始派送了,之前是给我忘了吧!!!!郁闷

    不过好歹是到手了,这个无线手表可是垂涎已久了啊,想当初论坛里做活动,秒杀还是什么来着,还要200多,如今177到手,感觉很好啊有木有~~~


    好啦,废话不多说,上图喽~~~~

    显示FedEx的箱子,好大一个,吓了一跳.....
     

    打开,原来大半都是空的
     

    真正的主角还是很小巧的嘛,话说MM很漂亮啊有木有....
     

    再打开...da ta~~~
     

    全家福,一个编程器,一个PC端,两个备用螺丝,一个连接排针,一个螺丝起子,再有就是主角——无线手表咯
     

    下载器和PC端特写——
     

     

    手表上的贴膜:It‘s always somewhere. 430确实应用得很广泛啊
     

    手表显示效果:
     

    背光效果:


    表带很厚实,很有质感


    带扣的金属磨砂质感也很好啊,做工很精致


    拆开,后盖上的Made in China....→_→


    机芯,下面的应该是气压传感器,可以测量海拔高度:


    机芯设计的非常紧凑,很厉害啊
     

    ok,首次的开箱就发这么多吧,具体的还要以后慢慢研究一下
    不得不说,这个手表作为一个开发工具是很不错的,创意也很好,但是要是作为普通手表戴出去....还是略显大了一点啊.....

    哈哈,总之,祝大家玩得开心!

  • 【晒心得】+ eZ430-Chronos 无线手表初体验

     作者:EEWORLD网友newofcortexm3

      于97日在德州仪器estore官网下订单,11日发货,14日到达深圳,由于周末不派送,如预期在今天(16日)下午收到。话说联邦快递的服务真心不错,先询问我是否方便收货,询问收货的地点,之后再次通知我去我指定的地点取货。取货完之后还对我道谢,不得不感慨服务真是周到(PS:听说联邦快递的国际件要100$,不知真假,求验证)。
    先来看看包裹吧,方方正正的,包的很严实。货品信息和收货人的信息到处可见,可见德州仪器对客户的尊重啊。

          打开包裹之后,是无线手表的包装盒与出口信息表单,中间放了不少填充物。打开包装盒,里面的物件如下:eZ430-Chronos手表一块,一个eZ430-RFUSB调试接口(图中手表左侧),一个MSP430F5509+CC1101USB RF访问点(图中手表右侧),一个微型飞利浦螺丝刀。


          图中手表的时间已经经过调整,调整的方法如下:
          1. 按下“*”按钮直到顶部LCD显示行上显示出时间。
          2. 按住“*”三秒钟直到时间显示消失并且“12H”或“24H”显示在LCD上。
          3. 通过按下"UP" "DOWN"(“上”或“下”)按钮来选择12H/24H模式。
          4. 按下“#”继续进行时间调节。
          5. 按下"UP" "DOWN" 按钮来设定小时。
          6. 按下“#”继续进行分钟调节。
          7. 按下"UP" "DOWN" 按钮来设定分钟。
          8. 按下“#”继续进行秒调节。
          9. 按下"UP" "DOWN" 按钮来设定秒。
          10.按下“*”来确认设置并返回正常运行,或按下“#”来重新开始第2步。
           EZ430-Chronos无线手表的具体模式下图所示:

          其他模式的具体设定见手册SLAU292E,中文版手册编号ZHCU020D20113月版)  eZ430-Chronos开发工具用户指南.pdf (7.28 MB) ,发现其中有点小错误,已修改。
    简单的测试了ACC模式。首先得打开上位机软件eZ430-Chronos Control Center,将MSP430F5509+CC1101USB RF插入普通USB接口,一般情况下会默认安装驱动。如果遇到安装失败的情况,可到安装路径下更新驱动程序,例如D:\Program Files\Texas Instruments\eZ430-Chronos\Driver。接着点击Start Access Point(如下图),CC1101USB RFLED闪烁。在eZ430-Chronos手表底部LCD显示行上选择"ACC"模式并按下"DOWN" 按钮来激活数据传输。手表界面上出现外放的图标,并且闪烁。

          当连接成功后,上位机界面的XYZ轴上出现连续变化的曲线,当摆动手表的幅度突然变大,曲线的变化剧烈,底下的Status栏实时显示三轴加速度计分别在XYZ轴上的值。

          在上位机界面端点击Mouse on,摆动手表就可以看到鼠标的移动。当要退出链接状态时,先在手表端按Down键,再在上位机端点击stop Access Point,链接就会断开,手表恢复到ACC模式下。
    对其他模式进行了简单的把玩,等有机会再深入专研一番,最后放上一张戴在手上的靓照。

  • 【晒心得】+ ez430 chronos 无线更新

    作者:EEWORLD网友reayfei

    这个模式可无线更新eZ430-Chronos 手表的固件,而无需将手表拆开。
    更新步骤:
    1. 点击"Browse..." 来选择CC430 闪存镜像。针对运动手表软件和数据记录器应用的示例镜像位于C:\ProgramFiles\Texas Instruments\eZ430-Chronos\Recovery\eZ430-ChronosWatch\Applications(对于Windows)和/home/<user name>/TexasInstruments/eZ430-Chronos/Recovery/eZ430-Chronos Watch/Applications(对于Linux)。
    : 请确保选择正确的闪存镜像版本。如果选择了不正确的频率,那么不能再进行无线通信。在这个情况下,手表必须使用eZ430 调试接口进行更新。
    只有把闪存镜像传输到手表,才能够调用手表上的更新程序软件。
    被下载至手表的文件的格式必须为TI-TXT 以与这个更新过程一同工作。这个全新的固件必须驻留在主存储器闪存内(0x8000 至0xFFFF),否则更新过程会由于手表上的边界校验而失败。
    2. 点击"Update eZ430-Chronos Watch"(更新eZ430-Chronos 手表)来在PC 上激活更新机制。当PC就绪,控制中心状态行显示"Access point started. Now startwatch in rFbSL mode"。
     
    控制中心状态行显示"Failed tostart Wireless Update" 查看是否RF访问点包含正确的软件版本。早于2010 年4 月的套件(数据代码可在eZ430-Chronos 包装盒的底部找到)需要进行访问点的手工更新。
    3. 通过按下"#" 按钮来在eZ430-Chronos 手表上选择"rFbSL"。
    4. 按压"DOWN" 按钮一次来切换至确认菜单
    5. 再次按下"DOWN" 来初始化更新
    6. 很短的一段时间后,更新开始

    更 新开始时,LCD 将显示几秒钟"rAM"。在这段时间内,实际更新程序软件从PC 下载至手表上CC430的RAM 内。这个程序包含所有内存写入和LCD 例程。这个传输完成时,代码从RAM 中执行,并且开始固件文件的下载。LCD 在上部LCD 显示行内用百分比显示下载进程。传输完成后,一个复位启动手表内的软件。
     

  • 【晒心得】Ez430-Chronos-433无线手表试用小记

    作者:EEWORLD网友sdnumcu

    最近实在是忙,各种忙,而且网络也不给力。眼睁睁的看着论坛上TI的促销活动搞得轰轰烈烈,竟然直到TI促销活动结束的前一天才把订单搞定。话说TI的效 率那是没得说。下单一周就接到了联邦快递快递员问路的电话,奉劝以后在国外往国内邮寄物品的童鞋们,适当写点汉语拼音没害处的!一波三折,终于如愿以偿的 拿到了梦寐以求的Ez430-Chronos-433无线手表。
    第一次国外购物的心情相信大家肯定都有过,除了兴奋还是兴奋。小心翼翼的拆开包装盒,事实表明,这款运动手表还是非常酷的。只是,只是,表后盖上刻着三个 醒目的英文单词:made in china!唉,made in china 就made in china 吧。大家都知道,现在made in china 几乎已经无处不在了。这样的价格,再加上联邦快递的邮费,确实已经很便宜了。套件清单除了没有传说中的光盘,MSP-eZ430仿真器、无线手表配套的 CC1101无线板、备用螺丝一应俱全,TI还提供了一个小螺丝刀供拆机使用。不得不说,TI考虑的还是挺仔细的。

    再说一下配套资源吧:其实,TI对产品的支持还是蛮好的。出现什么问题,基本都可以从他的官方网站:
    获得支持。
    以下是TI eZ430-Chronos 开发工具 用户指南(中文),下载地址:
    以下是TI eZ430-Chronos 开发工具PC端控制软件下载地址:
    windows xp系统所有的驱动都是自动安装的,不需要其他操作,只需要安装好TI eZ430-Chronos 开发工具PC端控制软件就能玩了。
    无线手表的基本设置就没有什么好说的了,可以看用户指南,不喜欢看用户指南的朋友们,多尝试几次就轻车熟路,设置自如了。我还是说一下程序方面的问题吧。说真的,TI提供的TI eZ430-Chronos 开发工具PC端控制软件可能具有BUG.也希望TI的相关工作人员能勤快点出来捉捉虫。问题如下图:

    另外一个是手表的无线更新问题,同样不起作用:


    好多网友普遍反映的通信距离过短的问题我暂时没有发现,也许是环境的问题吧。希望有更多的网友把自己的体验发聩上来,一起分享。
    还有一个问题,就是手表的日期显格式问题,估计是外国人的习惯吧。手表的时间显示格式是日-月-年,而非我们喜闻乐见的月-日-年。时间调整操作也存在这样的问题。经过我的简单修改,显示界面变成了下面的图片:

    具体修改过程如下,在TI eZ430-Chronos 开发工具PC端控制软件的安装目录:
    C:\Program Files\TexasInstruments\eZ430-Chronos\Software Projects\Chronos Watch\eZ430-Chronos v1.1 -white PCB\CCS\Sports Watch\logic\下的date.c文件是决定无线手表日期显示的文件



    使用CCS修改完毕,编译后,把程序烧写进去就可以完美显示了。
    还有一个问题,是无线手表的海拔计算程序貌似不是很准确啊,误差有好几百米,直接吓得我没脾气了,不早了,先写到这里吧。改天好好研究研究,把海拔的问题解决了。
    那个朋友需要CC或者烧写软件的话,可以去官网下载,也可以找我索取。就写这么多吧!

    附件

     EEWORLD提示:为减少服务器的压力,请尽量不要使用迅雷等下载软件。
     IMG_0020.JPG (181.51 KB)

    2013-10-8 22:28

    IMG_0020.JPG

     IMG_0017.JPG (160.02 KB)

    2013-10-8 22:28

    IMG_0017.JPG

     IMG_0017.JPG (160.02 KB)

    2013-10-8 22:30

    IMG_0017.JPG

     IMG_0020.JPG (181.51 KB)

    2013-10-8 22:30

    IMG_0020.JPG

  • 【晒心得】+ sensortag和无线手表之初次接触

    作者:EEWORLD网友yangking91

    sensortag和无线手表都收到好多天了,一直没有时间玩,自己也对无线通讯技术这一块不了解。今天抽空拿出来看一看,摆弄一下。
    先上无线手表的图片

    外包装

    左边的是RF access point,右边的是仿真器,要想使用仿真器来仿真手表的话要将手表拆开才行

    手表的金属壳有橡胶圈,不知道能不能起到防水的作用,还有记得将电池拆掉

    这就是仿真器接好的样子,接下来的步骤就是连接到电脑上就可以仿真啦。
    下面来一张全家福

    接下来介绍一下sensortag,SensorTag 集成了来自第三方的 6 种 MEMS 传感器,其中包括 InvenSense(陀螺仪)、Kionix(加速计)、Sensirion(湿度和温度)、TDK(气压计)以及磁力计和 TI IR 温度传感器 (TMP006)。可以有很多应用。途中的那个螺丝钉貌似没什么用。


    [ 本帖最后由 yangking91 于 2013-10-19 00:00 编辑 ]

    附件

     EEWORLD提示:为减少服务器的压力,请尽量不要使用迅雷等下载软件。
     IMG_20130916_223617.jpg (1.07 MB)

    2013-10-19 00:00

    IMG_20130916_223617.jpg

     IMG_20130928_115125.jpg (1006.56 KB)

    2013-10-19 00:00

    IMG_20130928_115125.jpg

    资料查找

    先找资料,站在巨人的肩膀上嘛, ,有用的链接:
    BLE Device Monitor User Guide:http://processors.wiki.ti.com/index.php/BLE_Device_Monitor_User_Guide
    CC2541 迷你开发套件:http://www.ti.com.cn/tool/cn/cc2541dk-mini#0,这个开发套件包含1 个 CC2540 USB 软件狗:此器件将用作 BLE 主设备。它连接 Windows PC 的 USB 端口,并预先载入了主设备演示应用软件。1 张 CC2541 密钥卡:此器件将用作 BLE 从属设备。密钥卡可以安装在随附的塑料外壳内。它使用一颗 CR2032 钮扣电池供电,并包含双色 LED、蜂鸣器、加速计和两个按钮。1 个带有附件的 CC 调试器:用于将软件闪存到 USB 软件狗以及密钥卡上。它还可以用于通过 IAR 嵌入式工作平台调试软件。
    bluetooth sensortag:http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag
    sensortag user guide:http://processors.wiki.ti.com/index.php/SensorTag_User_Guide很好的入门资料
    sensortag firmware:http://processors.wiki.ti.com/index.php/SensorTag_Firmware
    CC2540 USB Evaluation Module Kit: http://www.ti.com/tool/cc2540emk-usbDebugger and Programmer for RF System-on-Chips:http://www.ti.com/tool/cc-debugger
    EZ430-chronos: http://processors.wiki.ti.com/index.php/EZ430-Chronos先找这么多,找多了也看不完,如果还有以后再补
    自己找的蓝牙4.0开发教程:http://pan.baidu.com/s/1rEQSj


    心得


    为什么买sensortag?一个原因是ti的促销活动,第二个原因是senortag上的资源,再加上看了一个sensortag应用的短篇,决定购买 了。付完款后,提示缺货,要两个星期以后才发货,就等吧。等到发货后的第三天,突然提示我地址错误,电话错误,终止送货。打电话才知道ti把电话号码弄错 了,又拖了5-6天才搞定。货到手上了,打开包装,做工果然不错。使用的时候才发现自己手机的蓝牙无法连接,下载android app也无法安装成功,总提示无法安装。查了网上才知道,sensortag是蓝牙4.0的,而我的手机上的蓝牙是2.1的,两者不兼容,2.1蓝牙无法 搜寻到4.0的蓝牙设备。需要android 4.3才能安装上那个软件。支持的手机型号不多,主要有这些:

    • Nexus 4 (JWR66V)
    • Nexus 7 (2012) (JWR66V)
    • Nexus 7 (2013) (JSS15J)
    • Samsung S4 (JWR66V.S11.130708)
    • HTC One (0.1.0.0 - 20130728)

    还有苹果的产品:

    • iPhone 4S and newer
    • iPad(3) and newer
    • iPad mini
    • iPod Touch (5. gen)

    傻眼了,这些东西都没有,肿么办?还好有个orico的蓝牙4.0的usb适配器,用的是csr8510的芯片。用这个试一试,看看能不能使用
    将适配器插到usb口,可以成功搜寻到sensortag,然后我安装了ble device monitor和btool,以为这样可以通过蓝牙串口来和sensortag通讯。
    可是,事实上,需要CC2540 USB dongle 这个东西,我没有,在taobao上查了一下98元一个。看来还缺东西,电脑上也用不了。我想问一下为什么不能用这个orico的蓝牙适配器呢,不是已经 成功搜到了sensortag吗?那个cc2540 usb dongle也是一个蓝牙适配器嘛,只不过芯片不同而且个头大一些没外壳。是不是要开发一个基于csr8510的软件才能在电脑上观察sensortag 传感器的数据呢?
    光有这个usb dongle还不够,想开发sensortag的固件程序还要一个仿真器,叫cc-debugger,在taobao上查了一下,不多不少还是98元。看来干什么都得查清楚需要些什么,有什么条件等,不能盲目购买。

  • 【晒心得】Chronos运动手表初体验

    作者:EEWORLD网友nightseas

    TI这款Chronos手表出的有年头了,我也是觊觎已久。只可惜价钱不菲,而且没有2.4GHz频率,无益于实现我的设计。现在智能穿戴成为了消费电子新宠,TI也借着这股潮流借旧瓶装新酒,推出5折优惠。我也正好借着这个便利,买一块回来折腾。


    之前在eStore下单的时候发生了点小意 外,收货地址填错了,立刻取消订单。TI取消订单虽是网上提申请,但居然是人工发邮件来取消的,而取消后优惠马居然不能再用。好在工作人员热心帮助,联系 美国方面要了一个新的优惠码过来,数日之后,手表寄到。联邦快递的效率还是蛮高的,eStore的购买体验总体也还不错。


    手表样式尚可,背后不锈钢板上大大的Made in China让我诧异了,后来看到液晶屏的规格书也是中文的,看来不仅消费电子,开发套件也都中国制造了。段式液晶关断时为黑色,导通处透明,开启背光后直接透出来,晚上效果很赞。


    Chronos的MCU为CC430F6137,集成MSP430内核和RF SOC,PCB上还有一颗气压传感器和一颗加速度传感器。手表出厂自带一套运动手表的程序,可以读取温度、海拔等参数,并通过无线网同USB AP模块通信,来模拟电脑鼠标和按键。



    旧版的USB AP模块是一颗51核的CC1111芯片,这种设计有点二,一套开发工具要使用两种不同平台的MCU和仿真器,非常麻烦。新版已经修正了这种缺陷,采用了 MSP430F5509+CC1101的方式,这样一来可以使用自带的USB Debugger来仿真AP和Chronos了。而仿真器使用了MSP430F1612+TUSB3410,与我手里的RF2500相同,正好可以同时仿 真调试Chronos和AP。








    插上AP,安装TI官网上下载的软件包,通过 数据中心启动AP再设置下手表就可以同步了,试了一下重力感应模拟鼠标和操作PPT,灵敏度还不错,不过虽说433MHz的衍射性好,实际隔物的时候通信 依然会中断,而控制距离也比较近。另外控制中心软件提供的获取系统时间并同步到手表的功能居然不能用,获取时间的时候哐哐地报错,Win7和XP下都是如 此,看来还需要改进啊。



    Chronos的Demo代码使用了裸奔的前 后台结构,无线为SimpliciTI协议栈,使用非常Easy。前期打算先精简一下代码,把心率啊速度啊什么的无用功能都删掉。后期把它加到我的 WSpider智能家居里面来,通过一个控制中心实现433MHz和2.4GHz双频无线网络。


    个人感觉手表这样的东西就是要待机时间长,几 个月不错了,最起码得几周吧,现在的新产品都是好男人产品,每天必须回家充电(看来老婆只要掌握了充电器就掌握了男人的命运),对此我是很不以为然的。 430虽做不了太高端的应用,低功耗还是可以标榜的,做手表正合适,貌似不开无线的话一块纽扣电池可以用27个月呢~~~V5啊~~~~
  • eZ430-Chronos手表连接PC遇到大问题,已解决

    作者:EEWORLD网友gaoyang9992006

    我的手表也到了,不过把玩之后就开始安装电脑客户端软件以及安装USB AP的驱动程序,当一切搞定后,按照说明把COM波特率改成了115200,一切OK了,开启PC软件,然后启动连接模式,这个时候USB-AP开始闪亮 蓝色LED,这说明电脑那边的AP工作正常了,OK,再启动手表,通过#调节进入ACC模式,按下DOWN手表上的发射信号图标闪动,不过悲剧也发生了, 等了半天连接不上,PC的软件始终没有收到任何信号,没有连接成功,但是我按照说明再次按下DOWN也无法退出手表的ACC连接模式了,没办法我只有开开 后盖取了电池让系统复位,真悲催啊。
    有谁成功的进行无线连接了,求指导

    *****************************************************************************************************************************************
    [size=13.63636302947998px]上面是我遇到的问题,有一部分同学购买的都是这个问题的手表,现在解决方法找到了,如下
    [size=13.63636302947998px]下载软件  MSP430 Application UART(串口驱动).rar (14.47 KB)

     FET-Pro430-Lite-Setup.rar (14.03 MB) [size=13.63636302947998px]安装好后启动下面的软件,然后看第二幅图的配置,以及圈起来的地方,点击进去找到路径
    [size=13.63636302947998px]C:\Program Files\Texas Instruments\eZ430-Chronos\Recovery\Chronos Watch\Applications下面的
    [size=13.63636302947998px]Recovery_ez430_chronos_433MHz_2_0.txt文件,然后自动完成
    [size=13.63636302947998px]前提当然是安装好上面的那个驱动,然后将手表芯的通信接口和那个UART的编程器连接好安装到USB接口上
    [size=13.63636302947998px]另外附上该手表的中文使用说明书:  zhcu020d.pdf (7.21 MB)
      

  • 解决Chronos手表无法读取时间(Copy System Time)的问题

    作者:EEWORLD网友southwolf1813

    刚拿到Chronos手表,发现这个BUG。看到论坛里好多人遇到这个问题,现学了一下TCL 找到了原因

    原理如下:

    Chronos Control Center(CCC) 使用了TCL脚本语言做的界面,读取系统时间的函数是

    复制内容到剪贴板
    1. clock format [clock seconds] -format "%m"

    这个表达式得到的结果是一个两位数的月份,比如现在就是"09"

    CCC里直接将这个09转成整数,但由于0开头的默认都是八进制数,遇到08 09这样的直接就歇菜了……

    解决办法:

    先干掉前导零

    找到代码文件eZ430-Chronos CC 1_2.tcl 里面的函数 sync_get_time_and_date
    把这一行

    复制内容到剪贴板
    1. set sync_date_month   [expr [clock format [clock seconds] -format "%m"]]

    替换成

    复制内容到剪贴板
    1. set month_str 9
    2.   scan $month_str %d [clock format [clock seconds] -format "%m"]
    3.   set sync_date_month  [expr {$month_str}]

    即可。

    编译好的文件见附件。下载后请复制到原CCC文件夹下(需要调用eZ430_Chronos_CC.dll)运行


    参考链接:

    TCL语言里的月份问题   http://wiki.tcl.tk/948

    如何把TCL程序打包成exe http://wiki.tcl.tk/11861

    附件

     EEWORLD提示:为减少服务器的压力,请尽量不要使用迅雷等下载软件。
     CC_1.2.1_southwolf.zip (1.21 MB)

    2013-9-28 07:10, 下载次数: 3
    , 售价: 芯币 1 枚  [记录]  [购买]

    修复的Control Center

  • TI促销活动中的频谱分析仪浅谈

    作者:EEWORLD网友wstt

    大家有没有注意到这个频谱分析仪?
    http://bbs.eeworld.com.cn/TI/20130901/

    就是这个货。
    频谱分析设备在我们看来经常就代表着高端大气上档次,最重要的是贵!顺带说一句这次TI只要50刀算是良心价了。
    为何这个频谱分析仪这么便宜呢?
    之前我就给大家介绍过一次这个设备,它并不是1GHz以下全频段的分析设备,它的分析频段在:
    300 MHz to 348 MHz, 389 MHz to 464 MHz, and 779 MHz to 928 MHz 这三个频段,基本上对应ISM频段。(这个里面我国只有433.05-434.79 MHz这个是ISM的,至于具体做什么的大家看下面)。900MHz这个频段就可以看手机通讯的频带了。

    复制内容到剪贴板
    1. “中华人民共和国无线电频率划分规定”2006版
    2. 下列频带:
    3. 6 765-6 795 kHz (中心频率为6 780 kHz),
    4. 433.05-434.79 MHz (中心频率为433.92 MHz),除5.280 款所列国家以外的第一区,
    5. 61-61.5 GHz (中心频率为61.25 GHz),
    6. 122-123 GHz (中心频率为122.5 GHz),
    7. 和244-246 GHz (中心频率为245 GHz)。
    8. 指定给工业、科学和医疗(ISM)使用,但须经有关部门与那些无线电通信业务可能受到影响的主管部门达成协议后给予特别批准。援用本规定时,主管部门应考虑有关的ITU-R最新建议书。
    9. 欧洲ISM标准:
    10. 1. ETSI :Draft ETSI EN 300 220-2 V2.2.1 (2008-04)规定了频段,如下表
    11. ERC Recommendation 70-03 relating to the use of short range devices (SRD)'
    12. 规定: The bands in Annex 1 a - b - c - d f - f1 - f2 - h - i - j - k - l and m are also designated for industrial, scientific and medical (ISM)
    13.        查找Annex 1 a - b - c - d f - f1 - f2 - h - i - j - k - l and m,如下:
    14.            6765-6795 kHz
    15. 13.553-13.567 MHz
    16. 26.957-27.283 MHz
    17. 40.660-40.700 MHz
    18. 433.050-434.790 MHz
    19. 2400.0-2483.5 MHz
    20. 5725-5875 MHz
    21. 5725-5875 MHz
    22. 61.0-61.5 GHz
    23. 122-123 GHz
    24. 244-246 GHz
    25. 美国标准:
    26. Operation within the bands 902 - 928 MHz, 2400 - 2483.5 MHz, 5725 - 5875 MHz,
    27. and 24.0 - 24.25 GHz.

    说了这么多关于频带的扯远了。
    这个板子在249刀的时候大家不舍买,更不舍得得拆。现在一降价,马上就被拆掉了:
    http://bbs.eeworld.com.cn/thread-379764-1-1.html
    拆开外壳,可以看到板子。非常的简洁,单面焊接,应该是两层板。

    红色就是主芯片:CC430F6137
    黄色:USB桥接新品TUSB3410,大家的JTAG的USB调试器上都用的这个。
    绿色:暂时还没去查具体的型号,从走线上看应该是USB的保护芯片,跟5529的开发板上用的应该差不多。
    粉红色:DCDC电路(升降压明天继续讨论)
    紫色:LDO
    棕色:还没想到是什么。
    今天先到这里,明天继续分析。
    --------分割线,弄晚了,写不了多少-,但是不能放大家鸽子--------
    USB的保护器件我今天查了下,应该是TI自己的ESD的保护器,根据这个封装,应该是这个器件
    http://www.ti.com.cn/product/cn/sn75240
    对照照片的电路布线,两个信号线D+ 和D-是对上的,暂且就认定是它好了。
    CC430F6137是MSP430和CC1101的混搭

    CC1100算是明星射频SOC了,在中国感觉挺畅销的,CC1101就是CC1100的替代芯片。(芯片换代,实属正常)
    那么频谱仪的射频IC就靠CC1101了,红色框框就是CC1101支持的频段,这个频谱分析仪其实就是和这些个频段对应。
     

    ------------------------------------困了,得睡觉了,再聊----------------------------------------------------------------------

  • 【晒心得】收到MSP-SA430-SUB1GHZ后之初应用

    作者:EEWORLD网友dwwzl

    之前一直垂涎品牌射频分析仪,现在终于熬到了自个拥有了一台MSP-SA430-SUB1GHZ 的频谱分析仪,虽然是3个频段而不是全频段的,好在最近一直围绕着315M和433Mhz设计东东,想想也够了,即使有用到2.4G的,再想办法吧哈!
            到手时,外包装好大的纸盒子,仍是一贯的TI包装哦!上图说明

    打开盒子,就是全家福了

    数据线好长,部分的弥补了些不是便携的不足哦,一路安装,链接硬件,天线也有个好特点,就是它的旋转是单向的。不知道大家有注意到没有呐!
    软件界面也很友好,就是频率设置放在了第二项。每次都得点点鼠标了,频率设置为手机频段 900M±20Mhz,测得的室内环境信号,如下图:

    高起的信号会随时间不断的密集,估计是多个手机待机时的网络搜寻通信所需吧
    接下来开始用手机给另一个手机打电话,看到好大的信号起伏啊!

    自个的切身感受是:“哥们们,以后可要距离手机远一点吧,这辐射高的不得了哇!” 对了,忘了说了,我测试的过程中,手持机可是距离频谱分析仪有1m远呐!辐射还是这么的强!接通后的观察,信号会降下来些,但是辐射也是时大时小的了。

    接下来就是自个做的遥控器的发射信号检测了,
    我选了两个不同功率的315MHz的遥控手柄,一个是标称距离1000m的,发射电流大概在15mA左右,一个是标称距离50m的,发射电流大概在7mA左右。
    首先软件设置改为315MHz±1Mhz,对自个的产品频偏还是有信心的哈!
    看看环境信号吧

    还好吧,信号不是太嘈杂了,放大探测窗口后发现在312Mhz那里有更强信号,不知是不是ufo发来的呢!呵呵,反正不是我这里的信号
    接着测试一个小功率的遥控手柄,

    测试时,未拉开天线,任意的按下一个按键,绿色包络线就是记录的信号达到的程度。

    测试时,手碰触天线并拉开时的信号,频率宽度增大了,功率也增大了n倍呀!


    接着,又测试了大功率的遥控手柄,

    每次测量后,需要点击一下软件上的运行按钮才可以消除之前的绿色包络线记录哦!
    下图是按下任意发送键的信号,手柄距离频谱仪仍是1m的距离

    未拉开天线的信号也很强的,难怪遥控距离远了,
    接着用手拉开天线发射的信号,强度那个大呀!,电池那个费呀!
     

    好了,以上是昨天收到后匆忙测试的效果,遥控手柄距离频谱仪是1m远,
    我不知道这样测是不是规范,但是因为还不是很熟悉软件的设置和频谱仪的特性,还没有想好如何对测量的信号进行量化。
    有哪位大侠知道的,指导一下咱了,俺在此先谢过了!

  • SensorTag android设备试用(含android app)

    作者:EEWORLD网友eric_wang

    参与论坛TI促销,我抢红包!活动,本来想等到货了发个开箱,看到订购的SensorTag 从大西洋那边飘过来仅用了3天, 这速度让我和小伙伴们都惊呆了一把

        可惜到货那天是周五,没给派送,一直等到今天下午终于送来了, 看到坛子里的大神们好多已经比我先拿到了板子,而且发了不错的开箱,相关链接请看:

    [晒心得]CC2541DK-SENSOR 骚红,非常漂亮!
    TI Sensortag收到了!
    【晒心得】CC2541到了哦,我是不是第一个收到的呢

    照片拍的都很赞哦!
    我这里就不做开箱了
     下午收到SensorTag后,上网找了一圈app,手头没有ios设备,碰巧有个刚刚升级到android4.3的N4,支持蓝牙4.0 BLE 这就齐活了!匆忙的在谷歌商店里搜了一圈,你们懂得,很显然搜不到。事先没看文档,主要是因为都是英文的,我英语很渣,所以……终于在一位坛友的帮助下(他给我传过来一个Ti的适用于android的app)  SensorTag_0_9_3.apk.zip (793.05 KB)
    立刻装上见下图

    心情那个激动啊,先打卡蓝牙

    打开软件之后提示让按SensorTag侧面的按钮,轻按一下

    出现这个页面之后点击连接

    默认只勾选了四个传感器,再点击连接,此时SensorTag上面会有个黄色的led灯闪烁约3秒钟,连接成功后灯就熄灭了,如下图



    连接成功 数据出来了,随着移动SensorTag,数据会有所变化,就如同演示视频演示的样子。

     SensorTag 的红色外壳是橡胶材质的,手感很好,起到了抗震防摔的作用。但是这里明显能感觉到android设备的app没有ios的给力,界面简单,功能单一,不能 显示统计数据图表,而且当你同时选择4个以上传感器之后就会提示只能选择4个,如果想选择多个请重新启动,我启动了N次都没成功,现在选择温度、湿度传感 器还总出现连接失败的提示,不知道是不是那两个传感器挂了,还是软件出现什么问题了 大家有遇到过这类问题的吗?等周末用ios设备试试看。

  • 说说 TI eZ430-Chronos 改日期格式

    作者:EEWORLD网友upc_arm

           手表默认的显示日期格式是 日.月 ,看起来很不爽。晚上改了一下程序 ,改过来了。

    拆手表,费了一些劲,而且装上去之后按键就没有以前好使了。。。

    说一说怎么改程序吧。

    1 白色的是1.1版本,在1.1文件夹里,有个 CCS和IAR,结果两个文件夹里的例程是不一样的,我一直以为是相同的例程,不同的开发环境呢。

    在CCS文件夹里有个 SportWatch工程,打开这个工程,在 logic/data.c文件中 display_date 函数

    // Convert day to string
                str = itoa(sDate.day, 2, 0);
                if (sys.flag.use_metric_units)
                {   
                    display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);
                }
                else
                {
                    display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);
                }

                // Convert month to string
                str = itoa(sDate.month, 2, 0);
                if (sys.flag.use_metric_units)
                {
                    display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);
                }
                else
                {
                    display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);
                }
                
                // Display "." to separate day and month
                display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);

    只需要将 month 和 day 换一下位置就可以了。

  • TI工程师,你好!想买1个MSP-SA430-SUB1GHZ ,发现好像过了促销日期了,不知道现在还能不能,以折扣价买上。谢谢!