Всем доброго дня.
Досталась плата на основе aduc845 для модификации изделия.
Пишу свою простенькую программу для попробовать и всё здорово работает, но не более часа.
Спустя примерно час с момента подачи питания процессор входит в не понятный для меня режим, а именно на PSEN появляется 1 и прекращается генерация кварца.
С некоторой периодичностью (примерно 100мс) PSEN сбрасывается в ноль на короткое время и кварц начинает генерить. PSEN восстанавливается в 1, генерация прекращается.
Программа при этом не работает.
Что это за режим такой и что его может вызывать?
Причём от сложности программы ни чего не зависит. Даже примитивная программа с миганием светодиодом в основном цикле ведёт себя точно также.
Работаю с процессором пока второй день, опыта с ним маловато. Всё больше AVR.
Смущает ещё тот факт, что судя п описанию при работе с внутренней памятью на PSEN должна быть 1, а я наблюдаю 0 при работе программы.
Быть может вокруг этого искать надо. Возможно если при таких условиях он словит помеху по резету, то может свалиться в режим загрузки программы.
На сколько я понмню архитектуру MCS51 PSEN вырабатыватся аппаратно при чтении инструкции из внешней памяти (Programm Strobe ENable)
С этой стороны и надо копать. Либо вызов функции через указатель из-за пределов флеши, либо вывод работы с внутренней флешкой (кажется EA) дребезжит.
PS: Если останавливается кварц - это совсем другое.
Спасибо за подсказку. Так случилось, что именно в этом направлении я сегодня и копал. Пришёл к этому решению, вспомнив выдержку из даташита о том, что aduc поддерживает работу с внешней памятью и поковыряв стартаповский файл понял, что настройки по умолчанию предопределяют работу именно с внешней памятью, подключаемой через порт 2. А у меня на нём светодиоды зацеплены.
Ситуацию с переходом процессора в "не понятный режим" устранил. Но с PSEN пока непонятка осталась. Буду более подробно изучать организацию памяти. Потому, как на ALE наблюдаю генерацию с изменяемой частотой, будто он на самом деле пытается общаться с внешней памятью. Надо разделение памяти подкорректировать. Там ещё возможна нестыковка с учётом структуры программы.
Сигнал ALE - также имеет отношение к внешней памяти.Если PSEN строб выбора программ, то ALE фиксация адреса (или его младшей части?) как для программ так и для данных при выборке из внешней памяти.
Обращение к внешней памяти данных выполняется инструкциями MOVX.
Часто тип памяти данных (внешняя-внутренняя) по умолчанию зависит от указанной модели при сборке проекта. Так в КЕЙЛ если модель памяти SMALL, то данные по умолчанию во внутреннем ОЗУ. Если LAGE то во внешнем.
Еще, на атмелах и интелах был специальный вывод (EA кажется), который определял вешнее или внутреннее размещение программы (при наличии внутренней ЕЕПРОМ для программ).
Видимо это было у очень старых атмеловских процессоров или у 51 архитектуры. У арма я такое не припомню.
Но пока я решил остановиться с копанием PSENа. Программа сейчас работает без сбоев и надо уже по основным изменениям отработать. А времени, как всегда, мало, а сделать надо много.
Хотя подозрение возникло. Проверю его чуть позже. Некоторые моменты в описании структуры памяти не совсем однозначно можно толковать.
За подсказки спасибо.
День добрый.
Хотелось бы в продолжение темы задать ещё один вопрос.
Как мне казалось, с процессором я разобрался, первую версию изделия собрали уже в нескольких экземплярах и всё чудненько работает. Но не бывает всегда всё хорошо.
Сейчас делаем обновлённую версию и я достаточно серьёзно перепахал программу с целью ввести дополнительны возможности в прибор. И на столе всё работает изумительно, а вот в приборе...
Вопрос в следующем. В самом начале основного цикла вставил переключение состояния пина, управляющего светодиодом, для контроля перехода программы через нулевой адрес в процессе работы (было замечено, что при некоторых
внешних условиях программа будто перезапускается) и светодиод действительно переключается. А вот теперь пытаюсь понять, что его на это сподвигает. Проблемы с кодом не вижу.
Подскажите, кто сталкивался, какие внешние события могут приводить к подобному сбою. Быть может это POR так себя проявляет?
- На стек обратите внимание, может в некоторых ситуациях переполняется.
- Ошибки в адресации (вместо памяти программа обращается в SFR).
Не слишком самоуверенно?
Любая ошибка в адресации - например хотелось MOV R0,#1 а написалось MOV @R0,#1
Если R0 содержит число в диапазоне 0...127, "будьте любезны?"
Согласен, SFR не взорвется с дымом и разлетающимися во все стороны осколками ADUC-а. Это мой косяк.
Однако, программа все же выполнит не то действие, которое от нее ожидалось? А еще можно почитать из SFR вместо памяти.
День добрый!
Проблема решилась. По всем признакам, формировался резет из-за многочисленных помех (устройство-мощное ЗУ) и проц уходил в загрузчик или что-то похожее (по косвенным признакам).
Добавили кучу фильтров в питание и разделили по питанию процессор и перефирию, скорректировали трассировку нулевого провода.
Хотя на удивление предыдущая версия прибора при тех же технических характеристиках и похожей трассировке платы проблем не доставляла.
Всем спасибо.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)