Перейти к содержанию

    

aduc845 и PSEN

Всем доброго дня.

Досталась плата на основе 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 так себя проявляет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
какие внешние события могут приводить к подобному сбою.

RESET, POR, WDT, JMP 0000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

- На стек обратите внимание, может в некоторых ситуациях переполняется.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
- Ошибки в адресации (вместо памяти программа обращается в SFR).

исключено - адресное пространство разное. Если только не знать принципа работы МК:

к SFR только прямой доступ, к памяти только косвенный.

Еще как вариант - прерывание без обработчика - будет очень похожий эффект.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не слишком самоуверенно?

Любая ошибка в адресации - например хотелось MOV R0,#1 а написалось MOV @R0,#1

Если R0 содержит число в диапазоне 0...127, "будьте любезны?" :)

 

исключено - адресное пространство разное. Если только не знать принципа работы МК:

к SFR только прямой доступ, к памяти только косвенный.

Еще как вариант - прерывание без обработчика - будет очень похожий эффект.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
вместо памяти программа обращается в SFR

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен, SFR не взорвется с дымом и разлетающимися во все стороны осколками ADUC-а. Это мой косяк.

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый!

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

Добавили кучу фильтров в питание и разделили по питанию процессор и перефирию, скорректировали трассировку нулевого провода.

Хотя на удивление предыдущая версия прибора при тех же технических характеристиках и похожей трассировке платы проблем не доставляла.

Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация