GyverLibs / microDS18B20

Легкая и удобная в обращении библиотека для работы с 1-Wire термометрами DS18B20
MIT License
45 stars 11 forks source link

Не работает при использовании GyverCore #8

Closed ArtemiyKolobov closed 2 years ago

GyverLibs commented 2 years ago

Да, gyvercore слишком быстрая, тайминги уходят

ArtemiyKolobov commented 2 years ago

Есть осциллограф, как будет время - поправлю тайминги для gyvercore.

ArtemiyKolobov commented 2 years ago

Проблему локализовал: Неверно работает перезагрузка линии 1-Wire (функция _oneWire_reset(uint8t pin) в файле microOneWire.cpp) Для исправной работы необходимо выждать между опусканием линии ведущим и замером напряжения линии

...
13. delayMicroseconds(70);//Было 2, стало 70
...

Или

for (uint8_t c = 255; c; c--) {//Увеличим количество попыток считываний 80->>255
        if (!digitalRead(pin)) {
            #ifdef AVR
            SREG = oldSreg;//Зачем это делать здесь?? да ещё много раз?
            #endif
            for (uint8_t i = 255; !digitalRead(pin) && i; i--) {{//Увеличим количество попыток считываний 200->255
                delayMicroseconds(1);
            }
            return false;
        }
        delayMicroseconds(1);
    }

Работает и на GyverCore, и на родном ядре.

GyverLibs commented 2 years ago

SREG = oldSreg.
Безопасного включает прерывания, в отличие от sei(). И там не много раз, оно выполнится один раз перед выходом из функции

GyverLibs commented 2 years ago

На всякий случай переделал на 255, хуже точно не будет, проверить на гуверкоре не было возможности