С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Написал постфиксный ассемблер для КР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 (городить что-то более навороченное, думаю, смысла нет, а вещицу, которая знает понятие "проект" и позволяет сделать несколько файлов, а заодно скрывает от пользователя командную строку - это то, что надо :-))
Robotron CM6329.01M - 100%
Robotron K6314 - 95% (не хватает рукоятки прокрутки)
Prasident K6320 Commodore (трэба компутер - а самотест проходит)
D-100M - 80%
Электроника МС6312 - ???
УПЗ - under construction
Электроника МС6313 (нераспакован)
Остальное перечислять не интересно :-)
Прошу прощения за то, что пытался ввести в заблуждение. Моя вина. Вкурил документацию и увидел там следующее:Это, оказывается, фича языка ассемблера. При загрузке регистров #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, поэтому ассемблер должен запуститься на многих трансляторах Форта. Вот эти два файла и есть весь ассемблер (из моего первого сообщения):Правда, программисту на Си должно быть непривычно, что ассемблер и программа на ассемблере написаны на одном и том же языке и находятся в одном файле.
Инструкция по установке:
- Скачайте и скомпилируйте 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
На самом деле, полноценно пользоваться этим пока не стоит. Надо добавить примеров кода, ключи командной строки и поддержку форматов файлов для программаторов.
Предложение хорошее, благодарю. Только я живу в США, это, наверное, дорого будет.
Последний раз редактировалось Adramelek; 11.04.2014 в 01:39.
Когда гуглил информацию по КР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 стоймя), то микросхему воткнул без проблем - выводы сильно разводить в стороны не понадобилось.
Robotron CM6329.01M - 100%
Robotron K6314 - 95% (не хватает рукоятки прокрутки)
Prasident K6320 Commodore (трэба компутер - а самотест проходит)
D-100M - 80%
Электроника МС6312 - ???
УПЗ - under construction
Электроника МС6313 (нераспакован)
Остальное перечислять не интересно :-)
Как знать, может быть, и такое где попробуем :-)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)