А мы всё жалуемся что в Росси жить плохо, что мы бедные. Зажрались...
Вид для печати
Написал постфиксный ассемблер для КР1878ВЕ1. Хотел попробовать написать ассемблер для микроконтроллера, простоты ради выбрал именно этот. Написал на Forth, поэтому синтаксис у ассемблера соответствующий: вместо instruction <destination> <source> пишется <source> <destination> instruction. Привычный синтаксис только у команд jmp/jnz/jz/... : instruction <label>. Это связано с тем, как ассемблер обрабатывает ссылки вперед.
Не суть важно. Можно это воспринимать просто как аналог ассемблеру от Ангстрема (который TESSA.EXE на их сайте).
- Программа-пример из документации микроконтроллера: test.mic, я скармливал ее TESSA.EXE и сравнивал получившийся результат со своим
- ассемблер вместе с программой-примером, она начинается после комментария "test program", можно сравнить синтаксис с оригиналом: test.fs, запускать на Linux/BSD/OS X под gforth
- несколько слов, опосредованно относящихся к ассемблеру: common.fs, вынес их в отдельный файл
Итак, подхожу к собственно вопросу...
В процессе сравнения результатов заметил несоответствие в обработке инструкции LDR. Согласно документации, она имеет такой формат:
Мой ассемблер, как и в случае с остальными инструкциями, у которых два операнда, генерирует опкод так: операнд2 (в данном случае constant) сдвигается влево на ширину операнда1 (в данном случае register), потом OR их вместе, потом еще раз OR с кодом команды. Следуя этой логике, строка LDR #C,15 должна генерировать такой опкод:Код:0010 0ccc cccc cnnn
constant reg
Вместо этого TESSA.EXE генерит такой код:Код:0010 0000 0111 1010
Я поэкспериментировал, и получается, что для инструкции LDR ассемблер Ангстрема не сдвигает константу влево, и накладывает три бита регистра прямо поверх нее. Еще показательный пример: LDR #A,7. В теории опкод такой:Код:0010 0000 0000 1010
У TESSA.EXE такой:Код:0010 0000 0011 1000
У меня есть сильное подозрение, что это баг или глюк в TESSA.EXE. Но как-то трудно поверить, что программисты в Ангстреме могли его не заметить. Эта инструкция, кажется, четыре раза встречается в программе-примере из официальной документации, и дважды она генерирует неверный код (в моем понимании).Код:0010 0000 0000 0000
Есть ли у кого-нибудь возможность проверить работу программы на реальном микроконтроллере? Может, я что-то неверно понял в логике работы инструкции LDR?
P.S. Насчет самого ассемблера: я таки могу допилить его напильником и сделать менее похожим на полуфабрикат. Как минимум, скомпилировать на Windows в виде отдельного EXE-файла, который будет кушать ассемблерный исходник в STDIN. Если кому интересно, конечно.
[QUOTE=как-то трудно поверить, что программисты в Ангстреме могли его не заметить[/QUOTE]
Многие жаловались на ляпы в документации, так что, вполне возможно, что программисты просто учли фактическое положение дел :-)
Насчет ассемблера - было бы интересно, особенное, если в комплекте с "средой разработки" типа Borland Pascal (городить что-то более навороченное, думаю, смысла нет, а вещицу, которая знает понятие "проект" и позволяет сделать несколько файлов, а заодно скрывает от пользователя командную строку - это то, что надо :-))
Прошу прощения за то, что пытался ввести в заблуждение. Моя вина. Вкурил документацию и увидел там следующее:Это, оказывается, фича языка ассемблера. При загрузке регистров #5, #6, #7 -- нужно сдвигать константу влево. При загрузке регистров #a, #b, #c, #d -- не нужно...Цитата:
Формат команды: ldr #n , значение
где: n - номер служебного регистра
Номер служебного регистра лежит в диапазоне 0-7, определяя один из регистров SR0-SR7. Загружаемое значение может быть константой, меткой или выражением, задающим адрес в памяти данных или памяти команд.
При загрузке регистров SR0-SR3 загружаемое значение является адресом в памяти данных. Константа или выражение, загружаемое в регистр, преобразуется в адрес сегмента путем отсечения младших 3-х разрядов значения.
---------- Post added at 14:19 ---------- Previous post was at 13:34 ----------
Ну, полноценную среду разработки я вряд ли потяну. И, как показали последние события, сам код ассемблера тоже надо проверить на (невольные) неточности.
Когда начнет получаться что-то более-менее похожее на нормальный продукт, я, наверное, отдельную тему открою в этом же разделе.
Синтаксис не смущает? Я-то привык.
Да, я сам обычно только командной строкой пользуюсь.
Ассемблер написан на языке программирования Forth. Я придерживаюсь стандарта ANS, поэтому ассемблер должен запуститься на многих трансляторах Форта. Вот эти два файла и есть весь ассемблер (из моего первого сообщения):Правда, программисту на Си должно быть непривычно, что ассемблер и программа на ассемблере написаны на одном и том же языке и находятся в одном файле. :D
Инструкция по установке:
- Скачайте и скомпилируйте gforth: http://www.gnu.org/software/gforth/
- если установили gforth не в /usr/bin/local, то надо это учитывать: в исходникe ассемблера поправить первую строчку "#! /usr/local/bin/gforth" (пробел необходим)
- я прикрепил к этому сообщению архив с поправленной версией ассемблера. Исходник программы вынесен в отдельный файл. Файл "ras.fs" должен быть исполняемым, если нет, выполните команду "chmod +x ras.fs"
Запускать можно так:Или так:Код:# ./ras.fs < test-program.fs
Ну, или как я делал: располагать программу на ассемблере прямо вместе с ассемблером в одном файле. Результат работы: файл "code.bin" (просто дамп буфера кода).Код:# ./ras.fs
s" test-program.fs" required
bye
На самом деле, полноценно пользоваться этим пока не стоит. Надо добавить примеров кода, ключи командной строки и поддержку форматов файлов для программаторов.
Предложение хорошее, благодарю. :) Только я живу в США, это, наверное, дорого будет.
Когда гуглил информацию по КР1878ВЕ1, нашел этот сайт: https://sites.google.com/site/russianlabyrinth/
На тот случай, если он вдруг пропадет, продублирую тут:
"Ариадна" - программатор для микроконтроллера КР1878ВЕ1 с последовательным интерфейсом RS232.
Почему еще один? Видимо, их так много, что глаза разбегаются :-). Я являюсь счастливым обладателем отечественного МК КР1878ВЕ1, а главное, желания с ним работать :-). Пользовался "Программатором П. Семенова" (гуглится), благо схема исправно работает, но управляющая программа для нее написана для Win9X, что, впрочем, не является большой проблемой, т.к. данной программой можно пользоваться и на установленной посредством Microsoft Virtual PC 2007 виртуальной машине Win9X. Однако, захотелось сделать свой собственный адаптер-программатор, и, соответственно, программу к нему для Windows XP.
Адаптер Minotaurus v.1:
Адаптер построен на распространенных микросхемах MAX232A и КР1533ЛН2. Программирование МК осуществляется в режиме "Bit-Bang". Для двух входных линий используется преобразователь уровней MAX232A, для третьей линии - преобразователь уровней на транзисторе общего назначения. Микросхема КР1533ЛН2 представляет собой 6 инверторов с открытым коллектором, с помощью которых и построено "двунаправленное общение" с МК. В данной версии программатора питание адаптера коммутируется вручную с помощью тумблера. Во время программирование адаптер подает на МК напряжение питания +5 В и программирующее напряжение +12 В, для получения данных напряжений используются микросхемы серий 7805 и 7812 соответственно.
Программа Ariadne v.0.1:
Работает с памятью программ МК. Поддерживает адаптер Minotaurus v.1. Для работы программы необходимы установленные Microsoft .NET Framework 2.0 и Microsoft Visual C++ 2008 Redistributable. Работоспособность программы и адаптера проверена на тестовой прошивке. Схема и ПО поставляются "как есть", использование - на свой страх и риск :-)
Хех, давно ничего не постили :-)
Сам сегодня наконец собрался силами и поставил на частотомер, собранный по схеме Радио №10 2000 супервизор питания. Воткнул DS1813 (пробовал с 1171СП42, но не пошло. Видно, то, что он генерит простой перепад из нуля в единицу, а микроконтроллеру нужен похоже именно импульс). Из изменений в схеме (см. схему из "Радио") - выкинул R5, R7, C3. Супервизор включил по типовой схеме:
Выв. 1 (собственно сброс) к выв. 4 микроконтроллера
Выв. 2 на питание (R5 был заменен перемычкой)
Выв. 3 на землю
Так как в плате R7 и C3 были размещены весьма компактно (R7 стоймя), то микросхему воткнул без проблем - выводы сильно разводить в стороны не понадобилось.
Как знать, может быть, и такое где попробуем :-)
Кто знает где можно скачать эту программу для ZX-Profi:
Вложение 52315
Для этой программы еще должна быть схема программатора, который подключается к ZX-Profi