Психологическая зрелость – это понимание того, как много событий в этом мире не нуждаются в твоих комментариях.

Меню навигации для мобильных

Моторола 68HC11

Автор Slabovik, 19 Июль, 2024, 12:55

« предыдущая - следующая »

Slabovik

Возникла задача разобраться.
Суть: процессор 68HC11E1, урождённый Моторола, включен в режиме расширения (активирована шина адреса-данных) совместно с устройством ZPSD302B и ещё имеющимися статическим ОЗУ 512кБ и побайтово записываемой Flash объёмом 128кБ.

PSD302 - устройство старинное, но интересное. Совмещает в себе 512кБ ROM, 16кБ RAM, три порта ввода-вывода и модуль PLA (Programmed Logic Array), организующий логику управления всем этим хозяйством.

Суть проблемы заключается в том, как засунуть имеющуюся прошивку в это хозяйство.
Прошивка для PLD имеется в виде .hex
↓ спойлер ↓
HEX для PLD.png
это конечно не полный hex, а только начало, полный размер порядка 80 кБ
[свернуть]
Что я выяснил.
Всё устройство целиком должно "зашиватсья" через Serial-порт процессора. У процессора есть режим, когда при старте он сам (есть скрытая внутренняя программа размеров 128 байт) читает порт и складывает всё прочитанное начиная с адреса 0000. Как только чтение заканчивается (по таймауту?), управление передаётся на адрес 0000.

Кусок схемы с соединением ЦП и PLD выглядит так
↓ спойлер ↓
Соединение ЦП и PLD.png
[свернуть]
Программирование производится через разъём CN1 через COM-порт компьютера, какая-то терминальная проприетарная программа.
Дампы, которые заливаются этой программой, выглядят так
↓ спойлер ↓
Дамп для 68HC11.png
[свернуть]
Да, это текст. Без пробелов, строк и каких-то маркеров. По-видимому, hex, т.к. никаких других символов внутри нет. Но как его сопоставить с адресами? Ну или хотя бы превратить в обычный бинарник, который можно было бы дизассемблировать?

Вопрос. Как производится программирование PSD?  Возможно ли её программировать непосредственно при помощи процессора, или она программируется отдельно программатором? Является ли ZPSD302B-90JI от ST однократно программируемой? PSD312-A-15 от WSI однозначно однократно программируема т.к. имеет окошко для УФ стирания.

Изначально PSD программируют вот такими программаторами
http://matthieu.benoit.free.fr/261.htm
Однако приобрести как-то никак. Но больше интересует сам алгоритм программирования. Может, кто знает, где его взять?
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

Нашел кое-какое описание ассемблера для 68HC : https://www.clear.rice.edu/elec201/Book/6811_asm.html
Моторола - однозначно! Но этого как-то мало.

На Github есть сырцы ассемблера : https://github.com/JimInCA/motorola-6800-assembler
К сожалению, скомпилированного нет. Инструкция к нему внизу.

Вoт здесь есть ещё : https://github.com/dmancilla85/asm-68hc11
Файл уже скомпилирован, но пока не смотрел, под что именно.

Здесь какие-то примеры : https://github.com/FabianNorbertoEscobar/assembler-ejercicios-68HC11-moto-micro

Ещё один ассемблер http://www.aspisys.com/asm11.htm
И отладчик, работающий под Win (2013 года, но надо попробовать) : http://www.hc11.demon.nl/thrsim11/thrsim11.htm

Пока не могу найти дизассемблер...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Это то, что было на фотографиях, которые присылал?
А hex прошивок как/чем считывал?
Вообще жутко конечно смотреть...  :)

Slabovik

Не, это слегка другое устройство, поплотнее, но этот контроллер в центре, обеспечивает управление и координацию остальных узлов.
Физически 68HC11, как и всё семейство 6800 умеет адресовать только 64 кБ памяти, здесь же в эти 64 кБ всунуто более мегабайта. Значит, это всё виртуализировано, скорее всего страницами, это и по схеме слегка видно - выборка микросхем происходит от разных выводов внешнего порта PSD-шки. Но вот на эти микросхемы все 16 младнших адресных идут напрямую от процессора и только A16-A18 от другого порта PSD. Это озадачивает, потому что если переключение происходит 64-килобайтными страницами, это выглядит странно, т.к. отключенные микросхемы выпадают из области памяти. А архитектура здесь гарвардская, следовательно, есть вопрос:  в каком адресном пространстве при этом происходит работа программы. Она же должна работать. Небольшого собственного ОЗУ контроллеря для этого как-то мало. Тем более, у него есть прерывания, таблица адресов которых торчит в районе 0FFxxh и должна быть там всегда - прерывания ведь приходят внезапно....

В общем, пока зацепился за этот HEX.
Получается, он состоит из двух частей - программы для контроллера, написанной на Си (в этом я уже уверен) и есть небольшая область совершенно отдельных данных (как бы вторым слоем), которая соответствует прошивке PLA-шки. Как раскрутить прошивку PLA пока ещё не понятно, но программа контроллера чётко делится на две части.
Одна часть начинается с адреса 0000 и простирается до 5xxxh, часть объёма занимают выводимые куда-то (наверное в порт) сообщения.
Вторая часть начинается с 0E040h и заканчивается таблицей прерываний, главный вектор Reset которой находится по адресу 0FFFEh - т.е. самые последние два байта.
Есть предположение, что как минимум вот эта "верхняя" часть прошивки никуда при работе не переключается. Задача сейчас понять, как "рассажена" нижняя часть. Сама PSD-шка делит свою память на "полосы", которые её PLA-шкой уже могут распихиваться куда попало. Прошивка с адреса Exxx - это как раз такая полоса...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

А как ты понял что написано на Си?
Задача отреверсить стоит?
Что-то я и 10-ти процентов от вышеизложенного не понял, тут чтобы понять надо сильно вникать...

Slabovik

Задача стоит "дать рецепт, чтобы заработало". Потому что изготовленная новая никак не шьётся. Старая шьётся. В чём дело совершенно не ясно. Проблема в том, что у меня на руках платы нет. Вторая проблема - PSD с однократной записью. Программатора нет. Процедуры программирования нет. Те, кто изготовлял плату, говорят, что программировали её имеющимся .hex'ом (который я и ковыряю). От чтения PSD скорее всего защищена (имеется бит защиты). Из плюсов - новая PSD имеет окошко для стирания УФ светом. Поэтому пока так. Реверс - тоже достаточно интересное занятие. Думаю, что чуда здесь не будет, но моторолу слегка поизучаю. В конце концов STM8 и Z8 - его прямые наследники с такой же архитектурой ядра :)

То, что написано на Си, понятно из способа формирования строк, которые куда-то выводятся и выкрутасами с вызовами процедур, которые на асме так никто не делает, ибо муторно и незачем.

Но в следствие написания программы на Си .hex однако имеет одну приятность - он здорово секционирован. Как раз по процедурам и записям текста. Очень хорошо видны все входы и выходы. Был бы "сплошной" бинарник - было бы намного грустнее.

Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

Рецепта до сих пор нет, как и плат в моих руках.
Удалось выяснить, что неработающие платы находятся в состоянии с "зажатым" Reset и нет сигнала "E".
Линия Reset конечно интересная. Это не просто вход, но и выход, организованный по приципу "открытый коллектор" - процессор самостоятельно формирует на нём низкий уровень при подаче питания, при срабатывании защитного таймера (COP).
ЦитатаPower-On Reset (POR)
A positive transition on VDD generates a power-on reset (POR), which is used only for power-up
conditions. POR cannot be used to detect drops in power supply voltages. A 4064 tCYC (internal clock
cycle) delay after the oscillator becomes active allows the clock generator to stabilize. If RESET is at
logical 0 at the end of 4064 tCYC, the CPU remains in the reset condition until RESET goes to logical 1.
The POR circuit only initializes internal circuitry during cold starts.
Самое простое - это Reset от внешнего устройства - оно просто "прижимает" линию к земле в течение какого-то времени, затем отпускает
ЦитатаExternal Reset (RESET)
The CPU distinguishes between internal and external reset conditions by sensing whether the reset pin
rises to a logic 1 in less than two E-clock cycles after an internal device releases reset. When a reset
condition is sensed, the RESET pin is driven low by an internal device for four E-clock cycles, then
released. Two E-clock cycles later it is sampled. If the pin is still held low, the CPU assumes that an
external reset has occurred. If the pin is high, it indicates that the reset was initiated internally by either
the COP system or the clock monitor.
Самое сложное для выяснения без платы - это COP
ЦитатаComputer Operating Properly (COP) Reset
The MCU includes a COP system to help protect against software failures. When the COP is enabled, the
software is responsible for keeping a free-running watchdog timer from timing out. When the software is
no longer being executed in the intended sequence, a system reset is initiated.
The state of the NOCOP bit in the CONFIG register determines whether the COP system is enabled or
disabled. To change the enable status of the COP system, change the contents of the CONFIG register
and then perform a system reset. In the special test and bootstrap operating modes, the COP system is
initially inhibited by the disable resets (DISR) control bit in the TEST1 register. The DISR bit can
subsequently be written to 0 to enable COP resets.
Тут принцип такой: если система "взведена", по выбегу таймера (который надо сбрасывать при нормальной работе) формируется Reset и удерживается до... А вот до чего он удерживается? Надо вычитать описания всех упомянутых регистров. Но моя логика мне подсказывает, что по подаче питания по-любому должно всё запускаться хотя бы на миг...

Из предположений остались: а) срабатывание COP по каким-то причинам; б) незапуск осциллятора на процессоре.

Пока суть да дело, состряпал схему вычислительного узла на этом процессоре - во вложении.
Поскольку ни портов ни прерываний (имею в виду с передачей данных по шине) тут нет, всё очень просто - единое адресное пространство размером 64 кБ.

Тайминги идеалистично должны выглядеть так
CPU-Timings.png

Всё это на двусторонней плате 120x90 мм.
Верхние 2 кБ памяти - это ПЗУ с бут-лоадером и монитором. Монитор позволит делать простые тесты, бут-лоадер - подгружать программы из двух FLASH. Та, которая 24C предназначена для отлаживаемых программ, поскольку легко достаётся из панельки и программируется любым программатором, в т.ч. и самим монитором. 25С не знаю, зачем воткнул, поскольку эта серия в основном трёхвольтовая, пятивольтовые микросхемы только малого объёма (в данном случае на 128 кБ), но зато быстрая.

Общение с внешним миром через Serial терминал.
В общем, отдал на изготовление в Резонит, дали добро.
Делаю вторую часть - регистры ногодрыга.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

#7
Наконец платы попали в руки.
Первая плата, собранная китайцами.
При включении потребление примерно 25 мА. Но по какой-то причине бывает заброс более чем до 150 мА. Причина пока непонятна.
Сразу же тык осциллографом на генератор. И вот интересно: после подачи питания генератор не запускается. После тычка осциллографом на 7-ю ногу появляется генерация частотой... 75-80 Гц (ГЕРЦ, даже не килогерц). При этом на восьмой ноге сигнал частотой 29 Гц, что совсем непонятно. Вот осциллограммы:

вывод 7
1003_генерация_выв_7.jpg

вывод 8
1005_генерация_выв_8.jpg

По этой причине и Reset остаётся зажат.
Либо закосячен кварц, либо его обвязка.

А это сразу два канала
1005_генерация_выв_7+8.jpg

Получается, частота нифига не стабильна и зависит от параметров подсоединённого к ноге (ногам) проводника (щупа)
Пойду проверять обвязку...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

#8
Лажаю ли я? О, да, я лажаю!
Осциллограммы выше - это fake, сгенерированные воспалённым цифровым разумом осциллографа.
Ну, в общем суть в том, что осциллограф по какой-тио причине при увеличении времени развёртки высокочастотный сигнал превращает из просто размытой полосы, которая по-идее и должна быт на экране, вот в такую осциллограмму.

В общем, выводы о низкой частоте осциллограмм выше неверны - по факту это осциллограммы запустившегося генератора на частоте 4 МГц. Форма сигналов соответствует, тут без обмана.

Вывод о незапуске остаётся. Генератор запускается только после тычка проволочкой (щупом) в ногу EXTAL (вход усилителя генератора).
Внезапное наблюдение: генераторы не запускаются у процессоров ранних годов выпуска, у меня есть 94 года и 92 года.

Внешняя схема генератора, классика, называется "генератор Пирса"
↓ спойлер ↓

Gena.png

XTAL - это выход, EXTAL - это вход.

Есть такое замечание
Цитатачем меньше частота кварца, тем меньше должна быть емкость конденсаторов. Для часовых кварцев конденсаторы можно поставить номиналом в 15-18 пФ. Если используется кварц с частотой от 1 до 10 Мегагерц, то можно поставить 22-56 пФ.

Изменяя ёмкость конденсатора на входе усилителя, можно в небольших пределах регулировать частоту генерации.

Номинал резистора обратной связи в пределах 1-15 Мегаом. Чем меньше частота кварца - тем больше сопротивление резистора
Резистор обеспечивает перевод логического элемента в более-менее линейный режим по постоянному току. При этом схема Пирса актуальна для КМОП логики и не используется в ТТЛ потому что там схемотехника выходных каскадов другая - линейный режим получается дико несимметричным, поэтому там используется другая схема. Поэтому без резистора схема не запустится вовсе.

Полагая, что микросхемы старые и, возможно, по более "толстому" техпроцессу, решил банально уменьшить сопротивление этого резистора. Под руку попался 5,1 МОм. Впаял. Получил стабильный запуск.
Вывод: скорее всего сопротивление резистора было велико и вывод на линейный режим был неполноценным, где-то упиралось в ограничение, а когда так - нет шума/усиления, который мог бы "толкнуть" колебательный контур (кварц). Тычок позволял "с толкача" запустить генерацию - дать энергию в кварц.

А вот так выглядят управляющие сигналы шины

1011_управляющие-сигналы_E_AS.jpg

Довольно размашисто, да тут и частота невелика только 1 МГц, хотя есть поставить кварц 12 МГц частота ядра будет уже 3МГц - более-менее приемлемо. А поскольку я делаю тестовую плату, меня интересуют реальные соотношения фронтов этих сигналов. Жаль, но сигнал R/W посмотреть пока не получается - он на имеющейся прошивке почему-то всегда высокий. Поэтому третий канал зацепил за AD0 - видно, сколько держится сигнал адреса при защёлкивании во внешний регистр. Imho более чем достаточно. По подъёму E шина AD0-AD7 освобождается процессором для чтения, либо процессор выставляет туда байт для записи, сопровождая это опусканием R/W.

Ещё немного осциллограмм для выяснения соотношений.
Как зависит всё от XTAL - это выход усилителя осциллятора

1016_управляющие-сигналы_XTAL.jpg

Если схема синхронизируется от внешнего какого-то генератора, надо учесть, что XTAL является инверсным для входящего EXTAL.

А здесь можно увидеть соотношения актуальных данных, да и сигнал R/W

1020_управляющие-сигналы_запись.jpg

Причём, если вдруг идут подряд два или более циклов записи, R/W не меняется - становится низким в начале первого цикла и сбрасывается только если следующий за последним циклом записи идёт цикл чтения.
А вообще сигнал R/W достаточно редкий т.к. он не выставляется при записи во внутренние ресурсы микросхемы (ОЗУ, порты), а только когда идёт запись именно наружу.

Интересно, что за сигнал присутствует на ModA?

1024_что_на_ModA.jpg

Я бы мог подумать, что это сигнал-индикатор чтения опкода (кода операции). Но это только догадки - надо даташит читать. Так-то ModA и ModB - два входа, по состоянию которые в самом начале работы процессор определяет, в каком режиме он будет работать. Состояние этих пинов запоминается по факту подъёма Reset#, ... а вот дальше я не помню, можно ли на них что-либо выводить...

Да, можно ещё обратить внимание, что сигналы AS и E долбят каждый такт ядра, в то время как самые короткие команды выполняются за три таких такта. Imho здесь косяк проектировщиков, но ничего не поделать...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

#9
Добрался до платы #2
Работала в приборе, но что-то там было не так.
Проверил - проц не запускается, генерации нет. Потребление платы маленькое - где-то 7 мА всего.
Попытка запустить генератор успехом не увенчалась, ничего не помогает. Интересно, что на выводе ModA имеется неясной природы пилообразное напряжение с размахом где-то полвольта.

В загашниках был какой-то проц такого же типа. Заменил. Генерация тут же появилась, потребление в норме: 22-25 мА, внешне работает.
Однако обратил внимание на непонятку: на всех выводах, информационных и управляющих, уровень логической единицы нестабилен, плавает. Плавает на XTAL, плавает на Reset, плавает на адресных и информационных выводах, плавает на сигналах шины. Вот как это выглядит

1027_проблема_плата_2.jpg

Здесь три луча на трёх сигналах: E, ModA и Reset.
Хочется обратить внимание на имеющуюся корреляцию уровня единицы у всех сигналов.
Вопрос: что это? Неисправность чипа? Напряжение питания на выводах процессора стабильное, ровное...

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

Попробовал. Ничего пересаживать не надо - это оказался непропай ноги питания. Нога Ref+, по схеме сидящая на питании, была подпаяна. В общем, проц работал без официальной подачи питания. КМОП-схемы имеют такую фишку.
После пропайки всё стало ОК.

Да, действительно - на вывод ModA после того, как процессор запустился, выводится сигнал низкого уровня, синхронный с загрузкой кода операции в АЛУ
ЦитатаThe four mode variations are selected by the logic states of the MODA and MODB pins during reset. The MODA and MODB logic levels determine the logic state of SMOD and the MDA control bits in the highest priority I-bit interrupt and miscellaneous (HPRIO) register.

After reset is released, the mode select pins no longer influence the MCU operating mode.

In single-chip  operating mode, the MODA pin is connected to a logic level 0.

In expanded mode, MODA is normally connected to VDD through a pullup resistor of 4.7 kΩ. The MODA pin also functions as the load instruction register LIR pin when the MCU is not in reset. The open-drain active low LIR output pin drives low during the first E cycle of each instruction. The MODB pin also functions as standby power input (VSTBY), which allows RAM contents to be maintained in absence of VDD.
У Интела это называется цикл Opcode Fetch, у Z80 аналогично, но обозначается M1

Жаль, но этот ModA запаздывает относительно AS - активируется синхронно с чтением шины.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Цитата: Slabovik от 10 Окт., 2024, 10:56Чем меньше частота кварца - тем больше сопротивление резистора
А не наоборот?

Slabovik

Да вроде нет.
Там на низкоскоростных кварцах бывает нужно ещё последовательно с выходом резистор добавлять, сопротивлением от сотен Ом до десятка килоом. Ты вроде как-то спрашивал о таком резисторе. На мегагерцы он не ставится. А вот тот параллельный кварцу резистор нужен только если он не предусмотрен в схеме. Например, у современных контроллеров всё встроено, понадобится только если на логическом КМОП-элементе генератор надо сделать.

Кстати, глянул на осциллограмму с неровными верхами - imho тоже можно сделать подлый вопрос, да?
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Да, в каком-то аппноуте этот резистор был.
Во, кстати, в крайною схему внедрил на ресет APX809, но пока суть да дело совсем забыл заказать, в воздухе не люблю оставлять, хотя вроде и можно, пришлось навесиком.
Вопросы с непропаем - отдельная категория, ну да можно включить, низ когда гуляет вообще бесит, а забываешь обратить на это внимание. :)

Slabovik

Развл плату ногодрыга.
Всё замедлилось, есть ощущение, что телодвижения были не нужны и задуманное так и останется в состоянии недоделки... А так процик оказался достаточно интересным и лёгким на логику шины
Дупя.png

Ширина платы 20 см. Порты ввода-вывода, 6 штук.
Из интересностей - перекрытие адресации над ОЗУ, по этой причине получилось сделать хранение записанного в защёлки непоредственно в ОЗУ, без организации ещё одних регистров чтения. Суть очень простая: сигнал записи проходит и в регистры и в ОЗУ, а сигнал чтения с этих же адресов проходит только в ОЗУ. Чтение непоредственно пинов происходит со смещением адресов +8 - здесь уже чётко читаются только регистры.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

Slabovik

Пришли платы ногодрыга

TesterLegz.jpg

к сожалению, плат ядра ещё нет. Они изготовлены, но уехали в Нижневартовск, упали там на баланс и нужно выколупывать их оттуда. Как я обожаю это...

Вообще, чем больше я читаю про Моторолу, тем больше недоумеваю, почему в наших краях не получили распространения. Если не брать в расчёт первенцев типа 6505, то например 68НС16 - это очень даже "взрослый" на те годы проц с приятным интерфейсом, а серия 68000 так-то вообще была передовой долгие времена.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Красотки!
ысь. Опрос на резоните с розыгрешем не проходил?
Я прошёл, но ессно не попал в выигрышную пятёрку...

Slabovik

Не успеваю ничего доделать, предновогодняя движуха : On
Ну, зато покатаюсь, посмотрю два города

Билеты.jpg

специально выбирал не самолётом и не через Москву...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

О! Ты у нас будешь!
Если так - не отвертишься - встречу, какое-то подобие экскурсии организую!

Slabovik

В принципе, буду рад пожамкать твою могучую лапу! :)
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Ну ок! Надо договорится про опознание друг-друга.
Получается пол-второго 21-го приезжаешь, и до вечера можно распланировать посещение достопримечательностей.

Slabovik

В субботу днём. Часа четыре светлого времени будет, я полагаю, чтобы пофоткать, что увижу. В Волгограде не был ни разу...
В Данилове будет проще - там городок маленький, хотя глянул историю - для такого размера внушает! Никак не соберусь выложить фотки Тобольска, Ирбита да Алапаевска...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Раз не был - самое главное - на Мамаев Курган - часа два-три это точно займёт, дальше - музей-панорама "Сталинградская битва".
А там на месте определимся.

Slabovik

Спасибо! :)
Выберусь с этого балагана, Мамаев курган - обязательно!
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Пока не за что! :)))

Slabovik

Ну вот, другое дело!

HC11_tester_plates.jpg

Здесь конечно интересно

NJV_winter_view.jpg

особенно там, где много тяжёлых железок, но надо домой, пока совсем не завалило :)

NJV_window&snow.jpg
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.