【问题标题】:ESP32 reading DHT22 sensor in ULP coprocessorESP32 读取 ULP 协处理器中的 DHT22 传感器
【发布时间】:2018-05-03 23:11:38
【问题描述】:

我正在尝试在 ulp 深度睡眠中读取 dht22 传感器,但它无法正常工作,也许有人可以告诉我我做错了什么吗?

我正在重新实现 arduino-DHT 库,因为它使用我的传感器在非 ulp 模式下工作,它看起来像这样:

 digitalWrite(pin, LOW); // Send start signal
 pinMode(pin, OUTPUT);
 delayMicroseconds(800);

 pinMode(pin, INPUT);
 digitalWrite(pin, HIGH); // Switch bus to receive data

  // We're going to read 83 edges:
  // - First a FALLING, RISING, and FALLING edge for the start bit
  // - Then 40 bits: RISING and then a FALLING edge per bit
  // To keep our code simple, we accept any HIGH or LOW reading if it's max 85 usecs long

  uint16_t rawHumidity = 0;
  uint16_t rawTemperature = 0;
  uint16_t data = 0;

  for ( int8_t i = -3 ; i < 2 * 40; i++ ) {
    byte age;
    startTime = micros();

    do {
      age = (unsigned long)(micros() - startTime);
      if ( age > 90 ) {
        error = ERROR_TIMEOUT;
        return;
      }
    }
    while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );

    if ( i >= 0 && (i & 1) ) {
      // Now we are being fed our 40 bits
      data <<= 1;

      // A zero max 30 usecs, a one at least 68 usecs.
      if ( age > 30 ) {
        data |= 1; // we got a one
      }
    }

    switch ( i ) {
      case 31:
        rawHumidity = data;
        break;
      case 63:
        rawTemperature = data;
        data = 0;
        break;
    }
  }

看起来很简单:D,我用这段代码尝试了第一部分,但它不起作用:

rtc_gpio_init(15);
rtc_gpio_set_direction(15, RTC_GPIO_MODE_INPUT_OUTPUT);

在我的 ulp 脚本文件中:

.set temp_humidity_sensor_pin, 13 // gpio 15 (adc 13)

send_start_signal:

    /* disable hold on gpio 15 (data pin) */
    WRITE_RTC_REG(RTC_IO_TOUCH_PAD3_REG, RTC_IO_TOUCH_PAD3_HOLD_S, 1, 0)

    /* switch to output mode */
    WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS_S + temp_humidity_sensor_pin, 1, 1)

    /* send start signal (LOW) */
    WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + temp_humidity_sensor_pin, 1, 0)

    /* pull low for 800 microseconds (8Mhz) */
    wait    6400

    /* switch to input mode */
    WRITE_RTC_REG(RTC_GPIO_OUT_W1TC_REG, RTC_GPIO_OUT_DATA_W1TC_S + temp_humidity_sensor_pin, 1, 1)

    /* switch bus to receive data (HIGH) */
    WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + temp_humidity_sensor_pin, 1, 1)

wait_for_sensor_preparation_low:

    READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + temp_humidity_sensor_pin, 1)
    and r0, r0, 1
    jump wait_for_sensor_preparation_low, eq

wait_for_sensor_preparation_high:

    READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + temp_humidity_sensor_pin, 1) 
    and r0, r0, 0
    jump wait_for_sensor_preparation_high, eq

    jump wake_up // <-- never called :(

有什么想法吗?

【问题讨论】:

    标签: sensors esp32


    【解决方案1】:

    您的“and r0, r0, 0”指令(接近尾声)总是将 r0 设置为零(根据定义,x & 0 == 0),这意味着下面的跳转指令将永远循环。请记住,“eq”标志并不真正意味着“相等”。它的意思是“零”。我想你想要:

    wait_for_sensor_preparation_low:
    
        READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + temp_humidity_sensor_pin, 1)
        and r0, r0, 1
        jump wait_for_sensor_preparation_high, eq
        jump wait_for_sensor_preparation_low
    
    wait_for_sensor_preparation_high:
    
        READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + temp_humidity_sensor_pin, 1) 
        and r0, r0, 1
        jump wait_for_sensor_preparation_high, eq
    

    顺便说一句,我为 ULP 编写了一个 C 编译器,它应该会让您的生活更轻松。它在https://github.com/jasonful/lcc

    【讨论】:

    • 感谢您的帮助和对“eq”标志的澄清,它现在按预期工作。是我第一次在 Assembler 中编码,会尝试你的编译器,希望这是最后一次 :D
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多