• Система автоматизации с открытым исходным кодом на базе 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();
 
Сверху Снизу