• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено ошибка чтения 1-wire при запросах на веб

АндрейМ

New member
Всем доброго дня.

Взял ядро от https://esp8266.ru/forum/threads/modbus-tcp-rtu-rs-485-web-server.911/ , на него навесил в поллинге опрос нескольких ds18. При чтении данных на веб-морду время от времени возникает ошибка чтения DS18 Scratchpad. Возник вопрос: а не прерывание ли таймера (или на чем сидит отправка данных сервером) разрывает цикл чтения DS? И как его безопасно глушить?

Код:
int ICACHE_FLASH_ATTR ds_read_bit(void) {
    int r;
    GPIO_OUTPUT_SET(DS18B20_PIN, 0);
    os_delay_us(3);
    GPIO_DIS_OUTPUT(DS18B20_PIN);
    os_delay_us(10);
    r = GPIO_INPUT_GET(DS18B20_PIN);
    os_delay_us(53);
    return r;
}
uint8_t ICACHE_FLASH_ATTR ds_read() {
    uint8_t bitMask;
    uint8_t r = 0;
    for (bitMask = 0x01; bitMask; bitMask <<= 1) {
        if (ds_read_bit())
            r |= bitMask;
    }
    return r;
}
uint8_t ICACHE_FLASH_ATTR ds18_read_scatchPad(ds18DeviceRom_t *rom,
        ds18ScratchPad_t *scp) {
    int i;
    ds_reset();
    ds_select((uint8_t *) rom->bytes);
    ds_write(DS1820_READ_SCRATCHPAD, DS18B20_PARASITE); // read scratchpad
    for (i = 0; i < 9; i++) {
        scp->bytes[i] = ds_read();
    }

    return ds_crc8(scp->bytes, 8) == scp->regs.crc;
}
PS: подключение по мануалу, питание прямое. Провода до метра
 
Последнее редактирование:

pvvx

Активный участник сообщества
Возник вопрос: а не прерывание ли таймера (или на чем сидит отправка данных сервером) разрывает цикл чтения DS? И как его безопасно глушить?
Кроме прерываний таймера есть и прерывания от WiFi.
Глушить WiFi :)
ets_intr_lock();
....
ets_intr_unlock();
 

АндрейМ

New member
Зачем запрещать прерывания на долго?
получается, что минимальный квант 9 * 8 * (3+10+53) мс = 4,5 микросекунды. в сумме 10 микросекунд.

Код:
//    ets_intr_lock();
    ds_reset(); //1 мкс
    ds_select((uint8_t *) rom->bytes); //4.5 мкс
    ds_write(DS1820_READ_SCRATCHPAD, DS18B20_PARASITE); // read scratchpad
    for (i = 0; i < 9; i++) { //4.5 мкс
        scp->bytes[i] = ds_read();
    }
//    ets_intr_unlock();
 
Сверху Снизу