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