Полная версия этой страницы:
Дивайс на mega162.
eastwind
Jul 23 2010, 06:01
Доброе время суток, уважаемые коллеги.
Есть девайс на меге162+ОЗУ 32кБ. Плата двухслойная. Длина линий шины адреса/данных - 40-50 мм. Разводка неплохая, с обеих сторон свободное место залито полигонами.
Тактируется кварцем 16 МГц. Питание 5В подается через тонкий 7 см шлейфик вместе с SPI интерфейсом от головного устройства.
Питание на головном устройстве сделано на MC33063.
Проблема такая: иногда на некоторых редких объектах происходит зависание меги162.
Также иногда на ней же портятся данные во внутренней ЕЕПРОМ и памяти программ.
Встроенные BOD и WDT задействованы. Внешних нет.
Я думаю, что память программ может портиться из за того, что программа перепрыгивает непостижимым образом в область загрузчика, где есть ф-ции работы с SPM. Однако ж там перед программирование проверяются CRC и т.п. Но не смотря на это данные портятся. Иногда даже загрузчик портит сам себя.
Грешу на не очень удачную разводку линий тактирования от кварца: длина проводников 2-3 см, с переходом на нижний слой и обратно, кондеры расположены рядом с кварцем - довольно далеко от проца.
Из решений пока только приходит работа от внутреннего RC-генератора...
Дело осложняется тем, что в условиях лаборатории этих проблем выявить не удалось.. как только не гоняли. Испытания в лаборатории импульсных помех тоже результата не дали.
Поэтому действовать приходится практически наугад.
Может, кто то выскажет свои соображения, пути решения?
777777
Jul 23 2010, 06:41
Цитата(eastwind @ Jul 23 2010, 10:01)

Может, кто то выскажет свои соображения, пути решения?
Теоретически эту проблему никто вам не решит. Нужна "отладочная печать" - махание ножками в ключевых местах программы и наблюдение за ними осциллографом. При зависании можно оценить где выполнялась программа, а затем постепенно суживать место поиска. Это может происходить не только при аппаратном сбое, но и например при выходе из main, при возникновении прерывания, которое в программе не обрабатывается. Правда, я не совсем понимаю, как может зависать программа если в ней работает WDT.
Savrik
Jul 23 2010, 06:58
Ставте "ловушки" - и по питанию, и по сигналам. Поставте еще одно устройство, пусть МК туда пишет лог. Желательно все это синхронизировать.
Цитата(eastwind @ Jul 23 2010, 10:01)

Также иногда на ней же портятся данные во внутренней ЕЕПРОМ и памяти программ.
Возможно - проблемы с питанием.
Встречалась ситуация когда при включении питания устройства слетала прошивка. Оказалось, что источник питания при своём включении давал короткий но приличный по амплитуде импульс повышенного напряжения. Flash этого очень не любит - при напряжении питания выше 6,2V (по памяти, может быть - 6,3) прошивка и EEPROM слетают начисто (стираются), если импульс короткий или меньшей амплитуды - стираются отдельные куски или даже биты...
eastwind
Jul 23 2010, 07:45
Цитата(777777 @ Jul 23 2010, 12:41)

При зависании можно оценить где выполнялась программа, а затем постепенно суживать место поиска. Это может происходить не только при аппаратном сбое, но и например при выходе из main, при возникновении прерывания, которое в программе не обрабатывается. Правда, я не совсем понимаю, как может зависать программа если в ней работает WDT.
Нет необрабатываемых прерываний.
Программа рабочая. На многих объектах модули стоят месяцами и проблем нет.
Ошибки на "проблемных" объектах возникают совершенно хаотично и систематизировать их не получается. Поэтому и начал думать в сторону питания/тактирования.
Цитата(Палыч @ Jul 23 2010, 13:21)

Возможно - проблемы с питанием.
Встречалась ситуация когда при включении питания устройства слетала прошивка. Оказалось, что источник питания при своём включении давал короткий но приличный по амплитуде импульс повышенного напряжения. Flash этого очень не любит - при напряжении питания выше 6,2V (по памяти, может быть - 6,3) прошивка и EEPROM слетают начисто (стираются), если импульс короткий или меньшей амплитуды - стираются отдельные куски или даже биты...
Как решали проблему?
Savrik
Jul 23 2010, 08:06
Ну всплеск можно ограничить любыми средствами, самые простые - стабилитрон на 5,6В, TL431+транзистор, варистор, трансиль..
Цитата(eastwind @ Jul 23 2010, 11:45)

Как решали проблему?
Поскольку импульс повышенного напряжения блок питания давал сразу после подачи на него 220В, решение нашлось простое: низкое напряжение с БП потребителям раздавалось с некоторой, большей по времени чем импульс задержкой после подключения к сети 220.
777777
Jul 23 2010, 08:27
Цитата(eastwind @ Jul 23 2010, 11:45)

Нет необрабатываемых прерываний.
Как? Неужели в системе используются все без исключения прерывания?

Я имел в виду, что не используемые прерывания могли оказаться каким-то образом разрешенными.
Цитата(eastwind @ Jul 23 2010, 10:45)

Нет необрабатываемых прерываний.
Программа рабочая. На многих объектах модули стоят месяцами и проблем нет.
Ошибки на "проблемных" объектах возникают совершенно хаотично и систематизировать их не получается. Поэтому и начал думать в сторону питания/тактирования.
Как решали проблему?
Как дела с фильтрующими кондерами по питанию ?
Какое напряжения питания ?
как вариант сменить бутлоадер или вообще от него отказаться.
eastwind
Jul 23 2010, 09:43
Цитата(777777 @ Jul 23 2010, 14:27)

Я имел в виду, что не используемые прерывания могли оказаться каким-то образом разрешенными.
Я понял, что вы хотели сказать.
Я и имел ввиду, что разрешенных необрабатываемых прерываний нет.
Цитата(Клим @ Jul 23 2010, 14:34)

Как дела с фильтрующими кондерами по питанию ?
Какое напряжения питания ?
как вариант сменить бутлоадер или вообще от него отказаться.
Фильрующие кондеры стоят на всех трех ногах контроллера. Очень близко к выводам.
Напряжение питания указал в первом посте. 5В.
Пробовали отказаться от бутлоадера. Проблема перетирания флэши пропала, но все остальные симптомы остались: ЕЕПРОМ портится, проц виснет, улетает непонятно куда.
А есть электролитик по питанию? сразу после "тонкий 7 см шлейфик" ?
Может это мои предрассудки но я с некоторых пор во всех изделиях стараюсь использовать ТОЛЬКО ВНЕШНИЕ ГЕНЕРАТОРЫ
andrewkrot
Jul 23 2010, 16:55
А чем занимается Ваша плата? На ней нет реле или иных реактивных элементов?
rtfcnf
Jul 23 2010, 18:49
Попробуйте поставить внешний супервизор,
отключив встроенный, генератор при этом оставить как есть. Если писали на ассемблере и включен WDT создайте в самом конце программы что то типа:
Код
nop
nop
;конец не используемой области
error:
nop
jmp error
eastwind
Jul 24 2010, 14:32
Цитата(zombi @ Jul 23 2010, 21:51)

А есть электролитик по питанию? сразу после "тонкий 7 см шлейфик" ?
нет, после шлейфа стоит тантал. электролита нет.
Цитата(andrewkrot @ Jul 23 2010, 22:55)

А чем занимается Ваша плата? На ней нет реле или иных реактивных элементов?
нету ничего такого
kosyak©
Jul 24 2010, 20:31
Цитата(eastwind @ Jul 23 2010, 13:43)

...ЕЕПРОМ портится, проц виснет, улетает непонятно куда.
У коллеги слетала ЕЕПРОМ (первые несколько адресов) когда он начинал "счелкать" питанием платы (даж сделал девайс для этого

) - решилось все включением внутреннего BODa..ну и кондеры "побольше", вроде, поставил...
Простите, пропустил про уже включенный BOD
Цитата(eastwind @ Jul 24 2010, 18:32)

нет, после шлейфа стоит тантал. электролита нет.
Тантал тоже электролит. Аки и любой другой полярный конденсатор.
defunct
Jul 30 2010, 01:37
Очень сомневаюсь, что дело в МК и тем более тактировании или разводке...
Программа в MK наверняка использует ICALL / IJMP, данные для которых берутся из внешней памяти, а внешняя память неподконтрольна BOD'у, отсюда и выполнение случайного кода...
Риторический вопрос:
Сохраняет ли достоверность и работоспособность внешняя память и защелка во всем диапазоне напряжений от Vbod и до номинального VCC?
Советы:
1. Поместить стек и по возможности все критические структуры данных, содержащие адреса callback'ов, во внутреннюю память МК.
2. Поставить порог Vbod самый большой из возможных (4.3V).
3. Экранировать плату на объекте (использовать металлические корпуса).
4. Для защиты секции бутлоадера использовать соответвующую комбинацию BLB LOCK битов, которая просто непозволит туда писать. (это работает 100%).
5. Для защиты eeprom пользовать его исключительно как storage device, применить дублирование и CRC при записи, и восстановление битой копии при чтении.
PS: Из своей практики, имел дело с серийным устройством m162 +32kb с совершенно дебильной разводкой, так вот с примененными выше советами - из пары сотен таких девайсов (а работают они на подстанциях 10-36КВ), ни один не слетел за последние 5 лет. Бутлоадер в них есть, если BOD отключить флеш слетает моментально - достаточно пару раз выключить и включить.
eastwind
Aug 1 2010, 07:47
1. Поставил на проблемном объекте внешние супервизоры на 4,6В, отключил встроенный.
2. Поставил на разъем питания стабилитрон на 5.1 В.
3. Увеличил емкости конденсаторов на плате.
4. Данные в ЕЕПРОМ сделал с резервированием.
5. RSTACK и CSTACK и так были расположены во внутренней памяти контроллера.
Ждем... Обязательно сообщу результат на форуме.
Большое спасибо всем, кто участвует в обсуждении.
ИМХО ключево слово - spi интерфейс идет шлейфиком...
в идеале гальвано развязку уделать если нет возможности, есть
ещё 1 дополнительный контр прием:
повесте на ваши проводки (даже не длинные) ферритовое колечко
проницаемостью чем ниже, тем лучше например 400нм
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.