Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ MCS51 _ aduc845 и PSEN

Автор: Alex_2015 Aug 8 2015, 05:39

Всем доброго дня.
Досталась плата на основе aduc845 для модификации изделия.
Пишу свою простенькую программу для попробовать и всё здорово работает, но не более часа.
Спустя примерно час с момента подачи питания процессор входит в не понятный для меня режим, а именно на PSEN появляется 1 и прекращается генерация кварца.
С некоторой периодичностью (примерно 100мс) PSEN сбрасывается в ноль на короткое время и кварц начинает генерить. PSEN восстанавливается в 1, генерация прекращается.
Программа при этом не работает.
Что это за режим такой и что его может вызывать?
Причём от сложности программы ни чего не зависит. Даже примитивная программа с миганием светодиодом в основном цикле ведёт себя точно также.
Работаю с процессором пока второй день, опыта с ним маловато. Всё больше AVR.

Смущает ещё тот факт, что судя п описанию при работе с внутренней памятью на PSEN должна быть 1, а я наблюдаю 0 при работе программы.
Быть может вокруг этого искать надо. Возможно если при таких условиях он словит помеху по резету, то может свалиться в режим загрузки программы.

Автор: редактор Aug 10 2015, 08:07

На сколько я понмню архитектуру MCS51 PSEN вырабатыватся аппаратно при чтении инструкции из внешней памяти (Programm Strobe ENable)
С этой стороны и надо копать. Либо вызов функции через указатель из-за пределов флеши, либо вывод работы с внутренней флешкой (кажется EA) дребезжит.
PS: Если останавливается кварц - это совсем другое.

Автор: Alex_2015 Aug 10 2015, 14:06

Спасибо за подсказку. Так случилось, что именно в этом направлении я сегодня и копал. Пришёл к этому решению, вспомнив выдержку из даташита о том, что aduc поддерживает работу с внешней памятью и поковыряв стартаповский файл понял, что настройки по умолчанию предопределяют работу именно с внешней памятью, подключаемой через порт 2. А у меня на нём светодиоды зацеплены.
Ситуацию с переходом процессора в "не понятный режим" устранил. Но с PSEN пока непонятка осталась. Буду более подробно изучать организацию памяти. Потому, как на ALE наблюдаю генерацию с изменяемой частотой, будто он на самом деле пытается общаться с внешней памятью. Надо разделение памяти подкорректировать. Там ещё возможна нестыковка с учётом структуры программы.

Автор: редактор Aug 11 2015, 08:03

Сигнал ALE - также имеет отношение к внешней памяти.Если PSEN строб выбора программ, то ALE фиксация адреса (или его младшей части?) как для программ так и для данных при выборке из внешней памяти.
Обращение к внешней памяти данных выполняется инструкциями MOVX.
Часто тип памяти данных (внешняя-внутренняя) по умолчанию зависит от указанной модели при сборке проекта. Так в КЕЙЛ если модель памяти SMALL, то данные по умолчанию во внутреннем ОЗУ. Если LAGE то во внешнем.
Еще, на атмелах и интелах был специальный вывод (EA кажется), который определял вешнее или внутреннее размещение программы (при наличии внутренней ЕЕПРОМ для программ).

Автор: Alex_2015 Aug 11 2015, 12:57

Видимо это было у очень старых атмеловских процессоров или у 51 архитектуры. У арма я такое не припомню.
Но пока я решил остановиться с копанием PSENа. Программа сейчас работает без сбоев и надо уже по основным изменениям отработать. А времени, как всегда, мало, а сделать надо много.
Хотя подозрение возникло. Проверю его чуть позже. Некоторые моменты в описании структуры памяти не совсем однозначно можно толковать.
За подсказки спасибо.

Автор: Alex_2015 Feb 4 2016, 10:55

День добрый.
Хотелось бы в продолжение темы задать ещё один вопрос.
Как мне казалось, с процессором я разобрался, первую версию изделия собрали уже в нескольких экземплярах и всё чудненько работает. Но не бывает всегда всё хорошо.
Сейчас делаем обновлённую версию и я достаточно серьёзно перепахал программу с целью ввести дополнительны возможности в прибор. И на столе всё работает изумительно, а вот в приборе...
Вопрос в следующем. В самом начале основного цикла вставил переключение состояния пина, управляющего светодиодом, для контроля перехода программы через нулевой адрес в процессе работы (было замечено, что при некоторых
внешних условиях программа будто перезапускается) и светодиод действительно переключается. А вот теперь пытаюсь понять, что его на это сподвигает. Проблемы с кодом не вижу.
Подскажите, кто сталкивался, какие внешние события могут приводить к подобному сбою. Быть может это POR так себя проявляет?

Автор: редактор Feb 11 2016, 08:34

Цитата
какие внешние события могут приводить к подобному сбою.

RESET, POR, WDT, JMP 0000

Автор: Igor_K Feb 11 2016, 19:57

- На стек обратите внимание, может в некоторых ситуациях переполняется.
- Ошибки в адресации (вместо памяти программа обращается в SFR).

Автор: редактор Feb 12 2016, 07:16

Цитата
- Ошибки в адресации (вместо памяти программа обращается в SFR).

исключено - адресное пространство разное. Если только не знать принципа работы МК:
к SFR только прямой доступ, к памяти только косвенный.
Еще как вариант - прерывание без обработчика - будет очень похожий эффект.

Автор: Igor_K Feb 12 2016, 14:47

Не слишком самоуверенно?
Любая ошибка в адресации - например хотелось MOV R0,#1 а написалось MOV @R0,#1
Если R0 содержит число в диапазоне 0...127, "будьте любезны?" sm.gif

Цитата(редактор @ Feb 12 2016, 10:16) *
исключено - адресное пространство разное. Если только не знать принципа работы МК:
к SFR только прямой доступ, к памяти только косвенный.
Еще как вариант - прерывание без обработчика - будет очень похожий эффект.


Автор: редактор Feb 15 2016, 08:59

Цитата
вместо памяти программа обращается в SFR

Цитата
хотелось MOV R0,#1 а написалось MOV @R0,#1 Если R0 содержит число в диапазоне 0...127

То можно запортить переменную или стек, но не SFR.

Автор: Igor_K Feb 17 2016, 01:27

Согласен, SFR не взорвется с дымом и разлетающимися во все стороны осколками ADUC-а. Это мой косяк.
Однако, программа все же выполнит не то действие, которое от нее ожидалось? А еще можно почитать из SFR вместо памяти.

Цитата(редактор @ Feb 15 2016, 12:59) *
То можно запортить переменную или стек, но не SFR.

"Запортить стек" не годится чтобы загнать программу неизвестно куда, и хорошо если на рестарт?

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

Автор: Alex_2015 Mar 2 2016, 04:32

День добрый!
Проблема решилась. По всем признакам, формировался резет из-за многочисленных помех (устройство-мощное ЗУ) и проц уходил в загрузчик или что-то похожее (по косвенным признакам).
Добавили кучу фильтров в питание и разделили по питанию процессор и перефирию, скорректировали трассировку нулевого провода.
Хотя на удивление предыдущая версия прибора при тех же технических характеристиках и похожей трассировке платы проблем не доставляла.
Всем спасибо.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)