Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тестирование узлов микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
EugeNNe
Заказчик проекта требует чтобы через определённые промежутки времени по ходу выполнения программы проводилось тестирование основных узлов микроконтроллера, в частности ОЗУ, таймеров, АЦП и что очень интересно Flasha. Схемотехническая часть уже сформирована и не подразумевает наличия каких либо источников тестовых сигналов. Микроконтроллер Mega64, ПО разрабатывается в
среде WinAVR. Может быть кто-нибудь что-нибудь посоветует ?
Andy Mozzhevilov
Flash тестируется просто - дописываешь в конец CRC16, например, и периодически проверяешь, можно в фоне по байту добавлять, чтобы не занимать сразу много времени.
ОЗУ - я делал таким образом (правда для х51, но думаю это не имеет значения):
периодически запрещал все прерывания и тестировал несколько байт памяти, то есть сохранял содержимое в регистрах, записывал в память константы типа 0xAA, 0x55 , потом считывал, сравнивал, выставлял флаг.
Эту функцию вызывал в 1 раз основном цикле. В результате за несколько десятков секунд вся память проверялась в фоновом режиме (я тестировал внешнюю память в 32К).
По поводу АЦП, таймеров, то там по обстоятельствам, минимально тестировать наличие прерываний от соответствующих модулей.
defunct
Цитата(BigBolt @ Apr 4 2006, 06:15) *
Заказчик проекта требует чтобы через определённые промежутки времени по ходу выполнения программы проводилось тестирование основных узлов микроконтроллера, в частности ОЗУ, таймеров, АЦП и что очень интересно Flasha. Схемотехническая часть уже сформирована и не подразумевает наличия каких либо источников тестовых сигналов. Микроконтроллер Mega64, ПО разрабатывается в
среде WinAVR. Может быть кто-нибудь что-нибудь посоветует ?


Помоему тривиальная задача..
RAM тестировать просто - частями. Заполнить участок кодом $FF, прочитать и сравнить с $FF, потом заполнить $00, также прочитать и сравнить. Потом смещенным кодом $80, $81, $82...$FF, 0.. также прочитать и сравнить. Флеш тоже просто. Если программа занимает меньше 50% флеша, то продублировать ее в памяти. Тест будет сводиться к сравнению рабочей части с резервной. АЦП проверить можно, сделав контрольный замер с MUX'ом настроенным на источник Vbg (внутренний ИОН). Таймеры - запустить таймер и параллельно сделать задержку на определенное число тактов. остановить таймер и сравнить значение TCNT с числом тактов, на которое осуществлялась задержка.

Что вызывает у Вас затруднения?
EugeNNe
Цитата(defunct @ Apr 4 2006, 07:51) *
Цитата(BigBolt @ Apr 4 2006, 06:15) *

Заказчик проекта требует чтобы через определённые промежутки времени по ходу выполнения программы проводилось тестирование основных узлов микроконтроллера, в частности ОЗУ, таймеров, АЦП и что очень интересно Flasha. Схемотехническая часть уже сформирована и не подразумевает наличия каких либо источников тестовых сигналов. Микроконтроллер Mega64, ПО разрабатывается в
среде WinAVR. Может быть кто-нибудь что-нибудь посоветует ?


Помоему тривиальная задача..
RAM тестировать просто - частями. Заполнить участок кодом $FF, прочитать и сравнить с $FF, потом заполнить $00, также прочитать и сравнить. Потом смещенным кодом $80, $81, $82...$FF, 0.. также прочитать и сравнить. Флеш тоже просто. Если программа занимает меньше 50% флеша, то продублировать ее в памяти. Тест будет сводиться к сравнению рабочей части с резервной. АЦП проверить можно, сделав контрольный замер с MUX'ом настроенным на источник Vbg (внутренний ИОН). Таймеры - запустить таймер и параллельно сделать задержку на определенное число тактов. остановить таймер и сравнить значение TCNT с числом тактов, на которое осуществлялась задержка.

Что вызывает у Вас затруднения?



Если тест проводится в начале программы до инициализации переменных
то всё просто: пиши и считывай что хочешь,а что делать когда в памяти переменные, стек ?
Aleks17
Выдели в памяти место под тест. Потом поочередно копируй в него участки памяти, тестируй занимаемую ими память и возвращай назад. Разумеется прерывания все запрещены должны быть.



P.S. По-моему ваш заказчик параноик и достаточно вывести на экран надпись "Идёт тестирование..." smile.gif
ruslannd
Цитата(defunct @ Apr 4 2006, 08:51) *
Помоему тривиальная задача..
RAM тестировать просто - частями. Заполнить участок кодом $FF, прочитать и сравнить с $FF, потом заполнить $00, также прочитать и сравнить. Потом смещенным кодом $80, $81, $82...$FF, 0.. также прочитать и сравнить. Флеш тоже просто. Если программа занимает меньше 50% флеша, то продублировать ее в памяти. Тест будет сводиться к сравнению рабочей части с резервной. АЦП проверить можно, сделав контрольный замер с MUX'ом настроенным на источник Vbg (внутренний ИОН). Таймеры - запустить таймер и параллельно сделать задержку на определенное число тактов. остановить таймер и сравнить значение TCNT с числом тактов, на которое осуществлялась задержка.


ОЗУ правильно проверять бегущим нулем и бегущей единицей. Причем, после каждой записи смотреть состояние всего ОЗУ.

ФЛЭШ по CRC однозначно!

А если в целом, то все это бред. И саме главное... как проверить софт самотестирования?
SasaVitebsk
Цитата(defunct @ Apr 4 2006, 08:51) *
Помоему тривиальная задача..
RAM тестировать просто - частями. Заполнить участок кодом $FF, прочитать и сравнить с $FF, потом заполнить $00, также прочитать и сравнить. Потом смещенным кодом $80, $81, $82...$FF, 0.. также прочитать и сравнить. Флеш тоже просто. Если программа занимает меньше 50% флеша, то продублировать ее в памяти. Тест будет сводиться к сравнению рабочей части с резервной. АЦП проверить можно, сделав контрольный замер с MUX'ом настроенным на источник Vbg (внутренний ИОН). Таймеры - запустить таймер и параллельно сделать задержку на определенное число тактов. остановить таймер и сравнить значение TCNT с числом тактов, на которое осуществлялась задержка.

Что вызывает у Вас затруднения?


Задача с ОЗУ и EEPROM отнюдь не тривиальная. В своё время я пытался её реализовать в серийном проекте, но забросил. Если это делается при сбросе или можно на время теста ПОЛНОСТЬЮ остановить работу, то тогда да. А если нет, то тестить достаточно сложно. С FLASH - всё понятно CRC16. Если он нарушился, то дублирование может не помочь. smile.gif

Но вот другой вопрос насколько это нужно. В том проекте о котором я писал, я просто что могу то тестирую, что не могу - то выдаю Ok. smile.gif Заказчик и не догадывается. За 4 года выпуска и более 3 тысяч изделий ни разу не было возврата по причине что тест не проходит. Вообще за 15 лет работы я сделал вывод что МП в изделии - это самая надёжная вещь. smile.gif Может накрыться кондёр кварца, но не МП. И тестить его это просто дополнительный гимор. А заказчик как правило не разбирается в таких вещах. Так зачем его огорчать. Лучше потратить силы на WDT и защиту от сбоев и помех различными протоколами. Вот это даёт значительный выигрышь в стабильности работы изделия.
Miron
Тестирование таймеров, АЦП можно делать поставив счетчик основного цикла
и по достижению расчетного значения оного проверять флаги событий
срабатывания того или иного устройства.
EEPROM однозначно по CRC и по возможности если место позволяет иметь
дубль сохраненных данных для востановления иногда это спасает
Я обычно все это проверяю при включении питания и перезагрузке МК
а так по ходу программы как то не заморачивался дополнительным тестированием.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.