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.

[参考译文] MSP430F5529:与DHT11传感器连接时出现问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/640812/msp430f5529-problem-in-interfacing-with-dht11-sensor

部件号:MSP430F5529

我尝试对DHT11湿度和温度传感器进行连续读数,实际上它只是读数一次。 当我在LCD_wr_byte (RXBUF5)行后面加上一段时间(1)时,就会注意到在第一个读数中没有问题。 如您所见,RXBUF5 (校验和)给出了RXBF1 (湿度整数),RXBUF2 (湿度小数),RXBUF3 (温度整数)和RXBUF4 (温度小数)的总和,作为测试,我只需在LCD上写入RXBUF5。 但是当我取出while (1)时,我的想法是让传感器以大约3秒的时间间隔(由延迟表示)执行连续读数, 但它只在第一次读取时才读取,因为当它离开进行第二次读取时,它只是在DO { cont1++;}中停止 而(P3IN & BIT4)== BIT4)线,即,就像传感器将线下拉(到目前为止良好),然后将线上拉(也正常),但不会再次将线下拉以开始比特的传输。 对于尚未了解DHT11协议(1-Wire协议)的用户,以下是一个示例:

代码:

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

config_timerA0();// LCD的时间
CONFIG_I2I2();//LCD通信
lcdIniti();//LCD初始化
lcdBacklightON();//lcd
LCD_RS_RW();//LCD
port_out ();//WFP 3.4 = out
config_timera1();//计时器,使该行持续20毫秒

而(1){

P3OUT &=~BIT4;//启动信号
TA1R = 0;
while ((TA1CCTL0和CCIFG)== 0);//20 ms?
P3OUT |= BIT4;
Port_In();//WFP 3.4 =英寸
while ((P3IN和BIT4)= 1);

//DHT11回复

执行{
cont1++;
} 同时((P3IN和BIT4)=0);
如果(cont1 <= 10){//<= 80 us?
cont1 = 0;
执行{
cont1++;
} 而((P3IN和BIT4)== BIT4);//在第二个读数时出现问题,始终在此处停止
如果(cont1 <= 10){//<= 80 us?
yume_integer();//在RXBUF1上写入
HUEST_DECIMAL();//在RXBUF2上写入
temperature_integer();//在RXBUF3上写入
temperature_decimal();//在RXBUF4上写入
checksum();//在RXBUF5上写入

IF (((RXBUF5)==(RXBUF1 + RXBUF2 + RXBUF3 + RXBUF4)){
LCD_wr_Byte (RXBUF5);//在LCD上测试

//while (1);
}

RXBUF1 = 0;
RXBUF2 = 0;
RXBUF3 = 0;
RXBUF4 = 0;
RXBUF5 =0;}


}

//我不认为这些延迟会是问题,因为我已经尝试使用计时器,但它不起作用。

延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万);
延迟(2万); 
port_out (); } 返回0;}


void port_out (){

P3DIR |= BIT4;

 }

void port_in(){
P3DIR &=~BIT4;
P3REN |= BIT4;
P3OUT |= BIT4;
}

有人能帮我吗?

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

    抱歉,我忘记了这张图片,以证明一读是有效的:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您似乎已经捕获了所有其他事件,但是

    > while ((P3IN和BIT4)= 1);

    此条件始终为假。 尝试:

    > while ((P3IN和BIT4)== BIT4);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。

    当我将while ((P3IN和BIT4)== 1)更改为while ((P3IN和BIT4)== BIT4)时,问题仍然存在,但现在它在此行上停止。

    当我将两者都输入为while ((P3IN和BIT4)== 1)时,传感器依次读取,但只读取零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议的表格是正确的。 如果与== 1进行比较,则说明已有效删除循环。

    我注意到的另一件事:
    > while ((TA1CCTL0和CCIFG)== 0);//20 ms?
    一旦检测到CCIFG,您需要清除它,否则它仍将在大循环的第二次出现。 这符合您的"第二次停止"症状。 只需添加:
    > TA1CCTL0 &=~CCIFG;//清除过时状态
    在while ()之前执行此操作,因为计时器可能自上次(大)循环以来已循环(多次)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢bro! 这确实是个问题,我只是忘记了。 但是现在我有了新的问题,它第一次正确读取,但在第一个条件下(除了第一个读数)它停止输入,结果它停止读取。

    我删除了IF条件,我注意到它第一次读取时是正确的,但随后只读取零。 我尝试停止清洁RXBUF,但它始终读取相同的值,而不再是零。 从二读开始,它似乎不再进入我的阅读功能。

    也许那个传感器不喜欢我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到一些路径,其中cont1未重置为0,因此可能会继续累积。 结果是<=即使测量正确,测试也会失败。 我建议您在开始计数之前将其设置为0 (在所有情况下)。

    此外,cont1似乎是全局的。 它是否也被例如yume_integer()使用?

    您是否使用外部上拉? 内部上拉不是很强,这至少会减慢上升时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    解决了!

    你的问题让我更加关注我的程序中的柜台。 实际上,它不是cont1,它是另一个变量,我在读取函数中使用它来计算已经读取的位数,而我没有清理那个计数器。 这就是为什么它只能在第一次读取的原因。

    非常感谢!