Глюки контроллера. Ответ на загадку

by

Если вы не знаете о чем речь, то сначала рекомендую прочитать исходную задачу. Поломайте голову, не читайте комментарии, пишите свои. А потом возвращайтесь сюда.

Итак, девайс глючил. Причем глючил очень и очень характерно для срыва стека. Не зря первая половина поста была про поиск программной ошибки. Что такое срыв (он же переполнение) стека? Это когда стековая область памяти разрастается и начинает затирать область переменных. В результате может начаться полное веселье. Запороло переменные состояний автоматов? Получай наркоманскую логику. Запороло строковые данные — получи бред и кракозябры на экране (мой случай). Запороло видеопамять — здравствуй психоделичные картинки. Впрочем, тут и не в стеке может быть дело. Неправильно обращаясь с указателями можно навертеть такой же поебени. Суть одна — у нас каким то образом похерилась оперативная память. Не зря я полез первым делом проверять код. Но ничего не нашел.

Тут, конечно, можно до посинения отлавливать баги в программе, если бы не одно но — программа не глючила на столе. А глючила в поле. Отсюда первое соображение — виновато железо. Причем не в виде воздействия его на логику работы, ну там с протоколом ошибся или еще как налажал, опять же, в коде. А как то на электрическом уровне. Помехи, наводки и прочие пакости реального мира.

Откуда берутся наводки? Ну тут было очевидно — щелкает реле давления, его контактная группа включает и выключает контактор который дергает магнитный клапан. И контактор и клапан это мощные катушки, которые при размыкании искрят. Любая искра это мощный генератор импульсных помех. Причем помех очень высокочастотных и мощных. На всем, что есть в пределах досягаемости наводятся броски напряжения, молниеносные, но от того не менее геморройные. На осциллографе они выглядят как тоненькие иглы на прямом, как пульс трупа, сигнале. Потому то их и зовут иголками.

И тут второе соображение. По питанию глюки обычно простые. Это перезагрузки, внезапные зависания, сбои записи в еепром или флеш. Я не помню ни одного случая в своей практике, чтобы шум в питании портил оперативку в контроллере. Вот ни разу. Если у кого такое было, поделитесь. И уж тем более иголки не должны дать такого зверского эффекта в шине питания. Во первых, там хватает емкостей на землю. Для иголки конденсатор он практически короткое замыкание и через них они успешно в землю нейтрализуются, во вторых там хватает и разных супрессоров, которые хорошо их подрезают сверху, чтобы не выпендривались. В общем, энергетика помехи по питанию гасится очень неплохо. Должно быть, что то чрезвычайно жуткое, чтобы хоть как-то повлияло.

А вот что почти всегда разрушает логику контроллера изнутри, так это помехи на тактирование. Система тактирования, как нервная система, пронизывает весь контроллер, все его блоки. Она отвечает за все. Мега у нас довольно медленная, 16Мгц ее официальный предел. А теоретический? Что будет если на вход тактирования пролетят иголки, по своей частоте эквивалентные, скажем, тактовой частоте на 100мгц? Как на нее среагирует логика контроллера? Как то да среагирует. Где то триггеры успеют переключиться, где то нет, где то возникнет гонка сигналов, рассинхронизация и черт знает еще что. Это ненормированный режим. Никто не знает какие именно, но будут глюки, гарантированно. И глючить тут может вообще что угодно. У меня, в данном случае, портилась оперативка. Это из самых очевидных и явно наблюдаемых приколов. Еще слетала еепромка, но реже. Иногда просто зависала, до пинка собаки.

А раз так, значит смотрим на кварц и видим ту самую лажу. В результате передвижений дорожек, элементов, чтобы высвободить место под новые разъемы, у меня как-то перераспределилась земля, а я этого не заметил. И образовался хороший такой сквозняк для наводок в аккурат между ног кварца. Т.е. все дерьмо, генерируемое искрящими контактами реле давления, наводилось на подводящие питание провода (жирные такие пятаки слева вверху) красиво лилось сквозь кварц в нижнюю часть платы. Уходя там через провода 1-wire термометра.

http://easyelectronics.ru/img/starters/KompressorEMI/kosyak2_m.png

Увеличить

А проц от этого тихо охреневал и давился. С веселыми последствиями. Проверяется эта идея очень легко и быстро. Берем и перешиваем проц на работу от внутреннего RC генератора. Раз и все работает, ну кроме того, что из-за плавающей частоты RC у нас глючит обмен данными по RS485 шине, т.к. она асинхронная. Кварц нужен. А значит надо вылечить плату. Решение было проще некуда. Берем и перерезаем путь этим помехам:

http://easyelectronics.ru/img/starters/KompressorEMI/kosyak2-2.png

В результате кварц остается в тихом островке своего персонального полигончика. И глюки пропадают. Да, там остаются еще кое какие огрехи. Например, нижний земляной полигон висит на тоненькой ниточке, но это не критично. Т.к. там из всей нагрузки только четыре светодиода от оптронов. Плюс еще кое где надо будет поправить по мелочам. Но это все легкий насморк, по сравнению с эболой, которой был сквозняк по кварцу.

В общем, следите за землей. А лучше сразу же разводите его по чистому на отдельный полигон, не ленитесь это делать. Мало ли какой контактор будет щелкать рядом.