June 9th, 2018

Костерок

Детишки, внимательно читайте даташиты!

Чтобы не вышло как у меня! Долго вчера думал, почему в плате контроллера термодатчиков при включении мультиплексора подтяжка I2C с 3.3В падает до ~2.4В. Подозрение пало на стабилитрон MM3Z3V6, который я использовал в качестве супрессора. Выпаял стабилитроны — все ОК. Посмотрел на график из даташита:

и действительно, ток через стабилитрон почти не течет — что там до него дойдет через подтяжку в 4.7кОм? Намного меньше миллиампера! А ток стабилизации равен 5мА!!! Вот такие пироги…
В общем, либо стабилитроны на 5В надо ставить, либо специально рассчитанные на 3.3В супрессоры (в народе — TVS диоды).
Т.к. "голой жопой" наружу торчать нехорошо, заказал 20 супрессоров SMBJ5.0A на алиэкспрессе. Ну, а под конец года, если вдруг у обсерватории появятся деньги, надо не забыть включить в перечень необходимого ESD5Z3.3T5G, да и, возможно, тех же SMBJ5.0A (или SMAJ5.0A — так и не понял, чем B и A отличаются).

P.S. Все-таки, зенеровский пробой — та еще ненадежная гадость! Куда круче пробой лавинный, но проблема в том, что он наступает при напряжении больше 5В, поэтому лавинных стабилитронов на напряжение меньше ~5.6В не существует ☹
promo eddy_em september 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
Костерок

Рукожопие продолжается!

Итак, еще сутки назад я обнаружил, что как-то странно себя ведет контроллер термодатчиков: в режиме конечного автомата, когда идет автоматическое измерение температуры, он постоянно считывает 0 с одного датчика (что интересно, если на шине 2 датчика, то с первого считывалось все нормально). Пришлось даже натыкать уйму диагностических сообщений, но на бешеной скорости автомата непонятно было, где же проблема. Вставил команду принудительного вызова процедуры sensors_process() и увидел на осциллограмме, что при отправлении команды "scan" сразу после ACK сигнал обрывается. Виной этому то, что я не дожидался окончания передачи, а сразу отключал мультиплексор. Поэтому добавил (все равно вызовы блокирующие) ожидание окончания и все стало хорошо.

Что интересно, обнаружил вообще необъяснимую лажу: как только я комментирую вызов sensors_process() здесь, то происходит полный бред! В main() проверка if(usartrx()) всегда возвращает 0, несмотря на то, что данные пришли и переменная была выставлена в 1! Такое впечатление, что глобальная переменная linerdy (которую, собственно, макрос usartrx() и возвращает) становится локальной для main()!!! Повозившись с этим с полчаса я плюнул, и решил лучше заняться более актуальными проблемами. А это списать на волю злых демонов ☺