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.

[参考译文] MSP430F1611:TelosB,读取湿度和温度传感器,然后在终端上打印

Guru**** 2590620 points
Other Parts Discussed in Thread: MSP430F1611

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/633208/msp430f1611-telosb-reading-humidity-and-temperature-sensor-then-printing-on-the-terminal

部件号:MSP430F1611

我目前正在使用TelosB,我正在尝试从TelosB上的板载传感器检索数据。  我正在Mac OS上使用mspgcc对主板进行编程。

我想检索温度,湿度和光线传感器值并将其打印在终端窗口上,但我在执行这些操作时遇到困难。 我正在使用Openwsn,我认为应该使用这种代码

但是,我还不知道如何将这两个代码结合起来来实现我想要的功能。

如果有人能提供帮助,我们将不胜感激。

谢谢你

e2e.ti.com/.../01bsp_5F00_sensors.c

TelosB数据表: "www2.ece.ohio-state.edu/.../telosMote.pdf"  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里有几个需要的详细信息。 您遇到了哪些具体的问题? 您是否已经有一个将值打印到终端窗口的工作示例? 您尝试组合哪两个代码? 您没有提供太多代码,由于TI没有制作TelosB板,因此在可用资源方面存在知识差距。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复Ryan。

    我很难理解代码,因此TelosB基本上有板载传感器,我想在终端上显示检索到的数据。

    我有一个读取板载传感器(ADC_SENSORS)的代码,然后我有这个代码,我相信我可以用来在终端上打印。

    基本上,我要找的是如何执行Serial.print()的功能,就我在这里所附的代码而言。

    e2e.ti.com/.../adc_5F00_sensor.c

    e2e.ti.com/.../8666.00std_5F00_uart.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UART传输缓冲区发送单个8位字符。 如果要在终端上打印有意义的格式化数字(与原始数据相比),则需要开发代码,将12位ADC整数值分解为单独的数字,并将它们转换为终端预期的格式, 并通过传输缓冲区逐个发送它们。

    e2e.ti.com/.../11.3523万
    e2e.ti.com/.../8.1016万

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我已经阅读了你所附的链接,我构建了一个代码,看起来它实际上并不是在阅读任何内容。

    我正在使用PuTTY读取这些值。

    我附上了我的密码,如果您能给我一些提示,我们将不胜感激!

    谢谢你

    e2e.ti.com/.../00std_5F00_temp.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >__bis_sr_register(LPM3_bits + GIE);//睡眠,保持中断和ACLK打开

    您的程序不会超过此点,因为没有唤醒它的机制(另请参见LPM3_EXIT)。 我怀疑您确实想要:

    >__bis_sr_register(GIE);//启用中断

    ---------

    > 用于(i =0;tempAdc[i]> ADC12MEM5;I++){

    如果ADC12MEM5为0,则将从tempAdc[]的末尾运行(可能永远旋转)。 我建议您将元素0添加到TempAdc[]的末尾

    ---------

    TIC应声明为"volate",否则可能永远看不到任何输出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复,

    我已经按照你的程序进行了,但仍然没有得到任何读数。

    我重写了代码,但是没有得到任何读数。 我想我错过了UART上的一些内容。

    您可能需要帮助吗?

    感谢youe2e.ti.com/.../1447.00std_5F00_temp.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) ADC_SENSOR_INIT有一段时间(1),没有中断,因此您永远不会回到主页来设置UART。
    2)重复调用UART_INIT很可能会影响传输。 在ADC_SENSOR_INIT之前调用它一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../6201.00std_5F00_temp.cThank您的回复。

    我编辑了代码,但仍然没有得到任何读数。

    我在通道10上启动了ADC12转换,通道10是内部温度传感器,该值在ADC12MEM0中被环速转。

    这些值被转换为人类可读值,然后打印出来。

    我的代码中是否缺少某些内容?

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    按照此代码的构建方式,它不会发送读数,直到您先通过串行线路发送Telos内容。 你在干什么?

    执行此操作时,由于您未清除USART1RX_ISR中的RXIFG,您最多只能得到一个字符。 添加行"(void)RXBUF1;"将其清除。

    更一般地说:使用串行线路时有许多陷阱,它们可以掩盖其他问题。 如果第一次不起作用,我建议(暂时)在main()中插入类似的内容:

    //向主机发送连续的'U'字符。
    UART_INIT();
    而(1){
    while (!(IFG2&UTXIFG1))/*empty*/;
    TXBUF1='U';
    }

    然后运行它,看看您是否获得连续的'U'字符序列。 (它可以是任何字符,但'U'(0x55)在范围上特别容易看到。)

    一旦您按所需方式运行串行线路,您就可以继续执行剩余的操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的回复。

    我根据你的建议编辑了代码,现在我得到了一些值,但它们不是正确的值,因为值是1919年,并且不会随光强度的变化而变化。

    下面是我的代码:

    包含"msp430f1611.h"

    #include "opendefs.h"

    //=================================== 定义===========================================================

    //=================================== 变量===========================================================

    //=================================== 原型===================================================

    unsigned int Sensor_value=0;

    字符数字[4];

    int i=0;

    作废开始(作废);

    void stop (void);

    void ADC_SENSOR_INIT (void);

    void UART_INIT (void);

    void tx_buf (char buf);

    //=================================== 公共===========================================================

    Port_inline void stop (void)(端口_内联void

     ADC12CTL0 &=~ENC;        //立即停止转换

     ADC12CTL1 &=~CONSEQ_2;     //如果未配置EOS,则需要删除CONSEQ_3

     while (ADC12CTL1和ADC12BUSY); //等待转换停止

     ADC12IFG = 0;          //清除所有挂起的中断

    }

    Port_inline void start (void)(无效)

     ADC12CTL0 = SHT0_6 | REFON | Ref2_5V;

     //ADC12CTL0 = SHT0_6 | SHT1_6 | Ref2_5V | MSC | REFON;

     ADC12CTL1 = SHP | CONSEQ_2;

     //清除所有序列结束到WFP 6.5

     ADC12MCTL0 &=~EOS;

     ADC12MCTL1 &=~EOS;

     ADC12MCTL2 &=~EOS;

     ADC12MCTL3 &=~EOS;

     ADC12MCTL4 &=~EOS;

     ADC12MCTL5 |= EOS;

     ADC12CTL1 |= CSTARTADD_4;   //设置第一个转换寄存器P^.4

     ADC12CTL0 || ADC12ON;      //启用转换

     ADC12CTL0 || ENC;

     ADC12CTL0 |= ADC12SC;       //开始采样

    }

    void ADC_SENSOR_INIT (void){

     //停止传感器

     stop();

     //将WFP 6.4 和WFP 6.5 设置为外围设备

     P6SEL ||(1 << inch_4);

     //|(1 <英寸_5));

     //设置ADC配置

     //ADC12MCTL4 = inch_4 | SREF_0;

     ADC12MCTL5 = inch_5 | SREF_0;

     start();

     SENSOR_VALUE = ADC12MEM5;

    }

    void UART_INIT (void){

    P3SEL   = 0xC0;              // 3.6 ,7= UART1TX/RX

    ME2   |= UTXE1 + URXE1;          //启用UART1 TX/RX

    UCTL1  |= 字符;              // 8位字符

    UTCTL1  |= SSEL0;              //从ACLK计时

    UBR01   = 0x03;              // 3.2768万/9600 =9600 = 3.41

    UBR11   = 0x00;              //

    UMCTL1  = 0x4A;              //调制

    UCTL1  &=~SWRST;              //清除UART1重置位

    IE2   |= URXIE1;             //启用UART1 RX中断

    }

    Void主(void)

    WDTCTL  = WDTPW + WDTHOLD;         //禁用看门狗计时器  

    DCOCTL  = DCO0 | DCO1 | DCO2;       // MCLK (~8MHz时)

    BCSCTL1  = RSEL0 | RSEL1 | RSEL2;      // MCLK (~8MHz时)

    P5DIR  |= 0x70;              // P5DIR = 0bx111xxxx,用于LED

    P5OUT  |= 0x70;              // P5OUT = 0bx111xxxx,所有LED熄灭

    UART_INIT();

    ADC_SENSOR_INIT();

    而(1){

       Digit[0]=传感器值%1000/1000+0x30;1000;

       Digit[1]=传感器值%1000/100+0x30;

       Digit[2]=传感器值%100/10+0x30;

       Digit[3]=传感器值%10+0x30;

       对于(i=0;i<4;i++){

        tx_buf (digit[i]);

       }       

      tx_buf ('\n');

      tx_buf ('\r');

      __DELAY周期(50万);

     }

    }

    void tx_buf (char buf){

    while (!(UTCTL1&TXEPT));

    U1TXBUF = buf;

    }

    提前非常感谢!!

    e2e.ti.com/.../7245.00std_5F00_temp.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在ADC_SENSOR_INIT中运行ADC,但只调用该函数一次,因此在该SENSOR_VALUE之后不会更改。

    我建议您将ADC_SENSOR_INIT拆分为两个函数:一个用于初始化(一次),另一个用于运行ADC (重复),这样更容易使用。

    您是否看过msp430f1611示例? (产品页面上有一个链接。) "fet140_ADC12_09.c"可能很有用。