Полная версия этой страницы:
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, "будьте любезны?"

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