Я использую микрочип dsPIC30F6012a. У меня есть этот чип на нескольких печатных платах, на всех запущено одно и то же программное обеспечение, и наблюдаю одну и ту же проблему на всех них. Это подразумевает системную проблему, а не разовую производственную проблему. Проблема также воспроизводима, подразумевая, что я должен быть в состоянии убить ее, если я знаю, где искать. Но я все еще испытываю удивительные трудности при отладке приложения.
Тестируемая плата принимает напряжение 24 В, которое снижается до 5 В через V7805. Чип работает на своем внутреннем генераторе с 16-кратным ФАПЧ, обеспечивая скорость работы ~ 29,5 MIPS. Соответствующий код на этой плате, по сути, очень прост: просыпайтесь, читайте данные из EEPROM, затем вводите бесконечный цикл. Прерывайте каждую миллисекунду, наблюдайте за некоторыми данными об окружающей среде и записывайте обновленное значение в EEPROM. Происходят другие события, но проблема по-прежнему возникает, даже если не связанный код закомментирован, поэтому я могу быть уверен, что он не имеет отношения к рассматриваемой проблеме.
В общем случае 95% времени плата просыпается с правильным значением в памяти и продолжает свое дело. Остальные 5% времени, однако, просыпаются с неправильным значением. В частности, он просыпается с перевернутой версией данных, которые он должен иметь. Это 4-байтовое беззнаковое длинное, которое я смотрю, и может перевернуться как верхнее, так и нижнее слово long. Например, 10 становится 2 ^ 16-10, что позже становится 2 ^ 32-10. Я могу воспроизвести сбой, вручную включив и выключив несколько десятков раз, но это не очень стабильно, и мой палец переключения изношен.
Чтобы воспроизвести проблему контролируемым образом, я построил вторую плату, которая подает питание 24 В на тестируемую плату. (Другой dsPIC управляет оптопарой Дарлингтона.) Плата тестера отключает напряжение 24 В на 1,5 секунды (достаточно долго, чтобы шина 5 В упала практически до 0 и оставалась там в течение одной секунды), затем включает 24 В на некоторое настраиваемое время , При времени включения около 520 мс я могу воспроизвести этот глюк EEPROM в течение пяти циклов питания, каждый раз.
Шина 5V ведет себя разумно. Он устанавливается при 5 В в течение 1 мс после включения, возможно, с перегрузкой, равной 0,4 В, при условии, что я могу доверять своему прицелу. При выключении он затухает до 0 В по экспоненте, достигая 1 В в течение 50 мс. У меня нет предупреждений о сборке, которые кажутся актуальными, просто неиспользуемые переменные и пропущенные символы новой строки в конце файлов.
Я пробовал несколько вещей:
- Включение / отключение MCLR
- Включение / отключение WDT
- Включение / отключение защиты кода
- Включение / отключение / изменение напряжения обнаружения отключения
- Включение / отключение / изменение таймера включения
- Различные настройки ФАПЧ на основном внутреннем генераторе
- Подключение / отключение моего программатора PICkit 3
- Добавление 470 мкФ емкости к шине 5 В
- Добавление / удаление .1 мкФ через подтягивание 4.7k на моем выводе MCLR
- Отключение всех прерываний в коде и не оставление ничего, кроме обновлений EEPROM в основном цикле
- Добавление 1,5-секундной задержки в мою процедуру запуска, прежде чем я начну читать EEPROM
Я также написал отдельный тестовый код, который ничего не делает, но постоянно записывает значения в EEPROM, а затем считывает их обратно, следя за тем, чтобы значение не изменилось. Десятки тысяч итераций не дали ошибок. Все, что я могу сделать, - это то, что что-то идет не так с чтением или записью ЭСППЗУ, особенно при включении / выключении питания.
Я использую те же библиотеки EEPROM с 2007 года. Я видел случайные сбои, но ничего не воспроизводилось. Соответствующий код можно найти здесь:
http://srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http: / /srange.net/code/writeEEWord.s
Я видел ошибки EEPROM раньше в других приложениях, но всегда как разовые сбои, ничего такого воспроизводимого или непротиворечивого.
Кто-нибудь знает, что происходит? У меня заканчиваются вещи, чтобы попробовать.