Интересный баг в STM32F103
Feb. 12th, 2021 01:00 amСижу, разбираюсь, как с датчиком температуры-влажности SI7005 работать на STM32F103. Намучился уже с его кривым I2C (почему-то периодически возникают глюки на пустом месте, а первая попытка запуска I2C вообще не срабатывает, натыкаясь в момент посылки адреса слейва на NACK — а между прочим, некоторые в этом месте не делают проверку таймаута!).
Все более-менее заработало, но вот захотел я средствами МК вычислить точку росы. А там нужен логарифм. Я его, естественно, давай кусочно-линейной интерполяцией вычислять. Правда, оказалось, что точность для формулы нужна приличная (не хуже 0.01, чтобы результат отличался от формулы не больше, чем на ±0.1℃). И вот получилось, что, в отличие от STM32F0xx, здесь проще флоатами воспользоваться.
Однако…
Вообще ненормальная штука: если к элементу массива по вычисленному индексу (например, K[idx]), происходит зависание. А вот если этот же индекс вписать как константу (K[27]) — вопросов ноль!
( Вот он, проблемный участок кода )
Ссылка на код на гитхабе.
Нужно теперь подумать, как победить проблему с I2C (первое обращение абсолютно всегда заканчивается с ошибкой) и как избавиться от флоатов (чтобы на STM32F0x2 тоже это работало). Возможно, опять надо будет сделать целочисленную арифметику, заменив коэффициент на числитель/знаменатель. Или все-таки оставить флоаты.
Все более-менее заработало, но вот захотел я средствами МК вычислить точку росы. А там нужен логарифм. Я его, естественно, давай кусочно-линейной интерполяцией вычислять. Правда, оказалось, что точность для формулы нужна приличная (не хуже 0.01, чтобы результат отличался от формулы не больше, чем на ±0.1℃). И вот получилось, что, в отличие от STM32F0xx, здесь проще флоатами воспользоваться.
Однако…
Вообще ненормальная штука: если к элементу массива по вычисленному индексу (например, K[idx]), происходит зависание. А вот если этот же индекс вписать как константу (K[27]) — вопросов ноль!
( Вот он, проблемный участок кода )
Ссылка на код на гитхабе.
Нужно теперь подумать, как победить проблему с I2C (первое обращение абсолютно всегда заканчивается с ошибкой) и как избавиться от флоатов (чтобы на STM32F0x2 тоже это работало). Возможно, опять надо будет сделать целочисленную арифметику, заменив коэффициент на числитель/знаменатель. Или все-таки оставить флоаты.