Запуск программ ЭКВМ… на компьютере!
Долгое время на компьютере можно было создавать программы для «Электроники», но нельзя было их выполнять. Иногда это неудобно. Хочется среди инструментов иметь отладчик — сливая по кабелю в ЭКВМ конечный результат, а не каждый из промежуточных. Также сейчас программы, разработанные для ЭКВМ, ограничены небольшим кругом её владельцев.
Поэтому я начал делать для себя инструмент под названием ВК-6, позволяющий выполнять байт-код МК-161 на разнообразных компьютерах. Надеюсь, это поможет как разработчикам таких программ, так и их пользователям. Да и мне поможет получше изучить любимую «Электронику МК-161». За прошедшие несколько суток удалось урвать немного времени. Уже вырисовывается нечто, что можно начать тестировать и, возможно, даже использовать под условиями GPL v3. Исходный текст на языке Си я выложил здесь (он в кодировке UTF-8):
http://the-hacker.ru/2010/vk6-0.14.zipНе уверен, что смогу уделять много времени проекту. Ваше тестирование поможет расходовать его рационально. Сообщайте об ошибках и пожеланиях. Также буду рад тем, кто возьмётся компилировать, собирать и выкладывать исполняемые файлы ВК-6, под различные операционные системы и устройства — не все умеют это делать самостоятельно. Этот опыт поможет и мне делать код ВК-6 максимально переносимым. Кто знает, в какой тостер нам придётся его вставлять? ;-)
Повторюсь, что это не эмулятор МК-161. В нём нет поддержки внешних устройств, средств ввода программ (F ПРГ), файловой системы, протокола внешнего доступа и т.д. Когда программа будет отлажена, она позволит запускать байт-код вычислительных программ. Это лучшее, на что я надеюсь.
Калькулятор ВК-6 версии 0.14 не поддерживает многие функциональные регистры, включающие графику, звук, часы, опрос клавиатуры, прерывания, электронный блокнот, загрузку файла десятичных данных и т.д. Но все расширенные опкоды МК-161, вроде, должны работать. В нём уже есть поддержка файлов формата MKP. Теперь приступаю к тестированию ВК-6. Буду сообщать о результатах в этой коммуне, но также рад вашей помощи и поддержке.
UPDATE Версия ВК-6 обновлена до 0.14, в которой реализованы R9037, R9038 и исправлена работа R9103. Под катом — успешный полёт «Лунолёта-1» на ВК-6 версии 0.13.
Вот Сергей (а следом и сам Перепёлкин-старший) нажимает большую красную кнопку и мы взлетаем над лунным Центром имени С. П. Королёва: Г 0046 ----------------------- T 400 Z 0 Y 0 X 0 *65 ПП 3 С/П Г 0089 ----------------------- T 127.37037735849 Z 335 Y 0.49452830188679 X 88888888 *С/П Г 0046 ----------------------- T 335 Z -29.43 Y 84.112449056604 X 169.1644561335 *0 ПП 2 С/П Г 0046 ----------------------- T 335 Z -29.43 Y 80.872449056604 X 334.14935424671 *65 ПП 3 С/П ... и, через некоторое время, мягкая посадка: Г 0046 ----------------------- T 0 Z 0 Y -3.6111763061604 X 0 *qКухня.
Ошибка 1: Ноль в степени ноль даёт ноль.
Должно быть: Сообщение об ошибке.
Проверка: 0 В↑ Fxy
Ошибка 2: Ноль делить на ноль даёт ноль.
Должно быть: Сообщение об ошибке.
Проверка: 0 В↑ ÷
Ошибка 3: K ИПРГ выдаёт неверный результат при чтении шага с номером больше 9999.
Должно быть: Содержимое ячейки 9999.
Проверка: 4 F10x КИПРГ FВx 1 - KИПРГ
UPDATE. Сегодня выпущена прошивка МК-161, версия 1.04, в которой указанные недочёты устранены.
Производство
http://val888.livejournal.com/579.html
http://val888.livejournal.com/988.html
http://val888.livejournal.com/1254.html
Товарищи занимаются средствами связи, но принципиальной разницы нет. Интересующиеся могут внимательно ознакомиться.
Снова 8 ферзей
Уважаемые Piotr Piatek и автор сайта Calculator Benchmark обнаружили ошибку в программе, приведённой на странице http://arbinada.com/pmk/node/26
По их данным, она приводила к перебору только 299 вариантов из 876 и вызывала аварийное завершение для некоторых случаев. Кроме того, результаты теста были занижены почти в 1,5 раза для всех моделей, в том числе для МК-52 и МК-61.
Текст новой программы 8queen_benchmark (15632/174) и результаты теста приведены на странице: http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=700
0 1 2 3 4 5 6 7 8 9 00 Cx П 9 П C 8 П B ИП 9 ИП B - F x≠0 52 10 ИП 9 1 + П 9 ИП B K П 9 ИП C 1 + П C 20 ИП 9 П A ИП A 1 - П A F x≠0 05 K ИП 9 K ИП A 30 - F x≠0 40 K |x| ИП A + ИП 9 - F x=0 22 40 K ИП 9 1 - K П 9 F x=0 16 ИП 9 1 - П 9 50 F x=0 40 ИП C С/П
После окончания работы программа выводит число 876.
Результаты тестирования:
МК-52 - 5 час. 00 мин. 00 сек.
МК-61 - 4 час. 45 мин. 00 сек.
МК-152 v1.05 - 14,65 сек.
МК-152 v1.15 - 14,91 сек.
МК-161 v1.03 - 15,28 сек.
В целом, эта программа совпадает с ранее приведённой arvi: http://community.livejournal.com/mk_152/3562.html?thread=40938#t40938
- которая показывает чуть лучший результат, например 14,87 сек для МК-152.
Результат для МК-152,161 получен при помощи встроенного таймера. Приведённая программа запускалась как подпрограмма из программы запуска и вывода значения таймера. Погрешность определения времени работы при этом несущественна.
Различие между быстродействием различных версий ПО МК-152 составляет около 1,7% и объясняется как увеличением разрядности, так и появлением дополнительных функций, в частности, системой прерываний программы пользователя.
Различие в 2,4% между быстродействием моделей ЭКВМ в первую очередь определяется наличием АЦП в МК-161.
Преимущество перед советскими калькуляторами МК-52 и МК-61 в 1100-1200 раз по результатам этого теста сохраняется, поскольку ПМК ранее тестировались по той же программе.
Из-за перемещения с позиций 10,09 и 10,35 на 14,91 и 15,28 ЭКВМ поменялись местами с калькуляторами:
12.9 Z-1GRA C / Unstructured / Bytecode
~11 HP-30B Keystroke / RPN
11.0 HP-41CX Assembly / NUT @ 0.35 MHz
- что не меняет картины в целом.
AVR в Linux - Тропой Кулика.
Я начал эту статью так, потому что Linux невероятно интересная и прогрессивная платформа, но работать в ней человеку пришедшему из мира $MS титанически тяжко... Как в распространенной шутке, собственно, "первые три года тяжело, а потом привыкаешь" :) Вот и я подобно Кулику постоянно предпринимаю попытки найти философский камень в Linux, но всегда оказываюсь перед проблемой недостатка опыта и знаний что бы его найти. :) Отчаявшись приспособиться к линкусовой психологии шарахаешься опять в мир $MS где все привычно - где работают все "программаторы", где нет проблем с Quartus-ом, с VMLab-ом, но при всем при этом нет той понятности и стройности, а главное открытости операционной системы.
Начитавшись до дури статей я приступил: выкачал старого знакомого Ubuntu сменившего за мое отсутствие номер версии, установил и... и начала морочиться. Видимо нормальные люди разрабатывают в IDE, но я же настолько прирос к FAR-у (приятно осознавать что используешь продукт земляка воспитанного тем же ВУЗом, что и ты, с которым можно сказать через одно рукопожатие знаком :)). Ну и поскольку я уже привык к файловому менеджеру то MC меня начал раздражать практически сразу, я его выкинул из головы и перешел на терминал где возни конечно побольше, но хотя бы раздражения не вызывает. Тут надо сказать, что я забыл о великолепном ресурсе, который подготовил Vitasam, специально для тех кто отважился спрыгнуть с Win. Потерял бы меньше времени.
Начать необходимо с avr-binutils, avr-gcc, avr-lib, avrdude как основного и самого необходимого инструментария разработчика.
Затем задуматься над вопросом в чем писать. Vitasam предложил не плохой вариант без нагромождений - Geany. В принципе вариант достойный, единственное что не позволяет создать makefile как это делал например автоматически, VMLab. Страшного в этом ничего нет, те кто работал с WinAVR помнят что в поставке всегда был инструмент MFile. Мне приходилось пользоваться им крайне редко - обычно все решалось копированием имеющегося makefile и изменением содержимого: списка файлов проекта, типа микроконтроллера, опций компиляции. Однако автоматический генератор makefile существует он интерактивный так же как и в Win и он скрипт поэтому требуется небольшая доработка. Сам MFile находится по адресу. Доработка скрипта попила много крови, сперва я не понял почему не стартует скрипт, оказалось что в заголовке файла (который является для Linux исполнимым) прописан не Ubunt-овский интерпретатор Tcl/Tk. Прописывание интерпретатора Tclsh, оказавшимся в Ubuntu не самим файлом, а лишь ссылкой на него (/etc/alternatives/tclsh) ничего не решило. Tclsh интерпретатор не поддерживающий работу mfile в GUI. Но на широких просторах интернета благодаря google отыщется все, а именно то что для запуска mfile нужно использовать wish прописав внутри самого mfiel строчку запуска #!/usr/bin/wish.
После компиляции и сборки обычно необходима симуляция. В Win это либо VMLab, либо AvrStudio, либо Proteus. С тех пор как VMLab стал свободен привык использоваться им, хоть он и вызывает у меня нарекания по навигации в исходнике. Под Wine VMLab устанавливается исключительно, даже под старый WINE 1.0.1, который по умолчанию находится в Ubunt-овском репозитари (sudo apt-get wine). Само собой изменения вносимые на ходу в проект VMLab компилировать toolchain-ом, который находится в Linux не будет. Конечно можно поставить под Wine и WinAVR но получится что-то вроде "масло-масленое". На сайте VMlab есть информация что включением опции Any 3rd party high level lenguage generating COFF при создании проекта производится выбор компиляции и сборки сторонними средствами генерирующими исполняемый файл в формате COFF для отладки его в VMLab. Эта ключевая фраза задала мне жару часа на 4 поиском ошибки makefile при создании COFF.
Рис.1. Использование VMLab для отладки проектов в Linux под WINE.
Благодаря ошибке с COFF возвращаемся к этапу номер один. В комплекте avr-binutils поставляется маленькая, но так необходимая утилитка avr-objcopy собирающая из elf файла coff файл. Попросту конвертор исполняемых форматов который нужен потому, что elf файлы VMlab не приемлет. Запущенный из makefile avr-objcopy при сборке выдает ошибку
avr-objcopy: "имя преобразуемого файла".cof: Invalid bfd target
Благодаря своему не важному знанию языка и не желанию вчитаться в "англицкий" текст хотя бы в течении пяти минут, я минимум три часа провел в бесполезном серфинге. Вот пост рассказывающий как победить ошибку. Все достаточно тривиально для того что бы ошибка была исправлена нужно либо "одеть" на новый avr-objcopy заплатку, либо взять старый файл, в котором этой проблемы еще не существовало. Репозитарий Debian или Ubuntu содержит свежие avr-binutils и ошибка там себя проявляет, а вот распространенный некогда cdk4avr остановился на версии GNU objcopy 2.16.1 + coff-avr-patch (20050630) (CDK4AVR 3.0 2.16.1-20060708) и в нем этой ошибки нет. Однако не спешите ставить это пакет, потому что остальные утилиты из avr-binutils нас устраивают , да и не стоит мешать сапоги с конфетами. Необходим только avr-objcopy нужно его извлечь из пакета cdk-avr-binutils_2.16.1-20060708_i386.deb находящегося на сайте архиватором и поместить, внимание !!! в два места /usr/bin и /usr/bin/lib/avr. Во вторую папку на всякий случай, хоть путь $PATH и указывает на /usr/bin, а вдруг где то жестко в makefile будет прописано /usr/bin/lib/avr для вызова binutils. Кстати копирование под Ubunu в системные места разрешено только "судоерам", так что про sudo перед командой копирования cp забывать не нужно.
#sudo cp avr-objcopy /usr/bin
И так проблем симуляции железа уже решена, но можно чуть расширить ее посмотрев в сторону Code::Block IDE который дает все возможности и по созданию проекта (вплоть до сборки) и по его симуляции с применением avr-dbg и simulavr, все это очень хорошо описано на этой страничке и нет смысла пересказывать. Однако у меня почему то не заладилось с отладкой все переменные были пустые хоть отладчик ходил по веткам кода.
Следующий вопрос является наиболее важным - ЧЕМ ШИТЬ?
Все время до этого пользовался удачным вариантом USB программатора AVR910 USB (разработки prottos).
Программатор хороший но по рассказам на форуме линуксоидов для его использования необходимо пересобирать ядро включив туда изменения для нештатной работы с USB, либо перешивать сам программатор в avr-doper. Перешивать я не стал боясь оказаться без удобного рабочего инструмента (в загашнике на всякий случай есть деревянный PonyProg), а стал искать какой программатор легкий в сборке поддерживается и работает без нареканий в Linux. Таким программатором оказался USBasp. Конструкция похода на AVR910 USB, но для того что бы на сигнальные линии диф-пары USB не попало напряжение питания микроконтроллера (в схеме USBasp VCC равно 5 вольт) использовано два стабилитрона на 3.6В. Такой "выверт" необходим из за того что не во всех материнских платах чипсеты толерантные к уровню TTL и требуют конвертирования уровней. Конструкция AVR910 USB обеспечивает питание микроконтроллера программатора 3.6V, чем координально решает вопрос с попаданием 4..5V уровней на сигнальные линии USB. Падение напряжения после двух диодов приводит к тому что напряжение питание VCC снижается с 5V до приемлемых 3.5-3.6V. Переделка отражена на рис.4., дополнительные детали (два диода и конденсатор) выделены красным цветом, а номинал резистора R3 изменен на 1.5КОм (на USBasp R3 = 2.2КОм).
Рис.2. Часть схемы USBasp обеспечивающая толерантность линий USB к уровню сигналов TTL с AVR.
Рис.3. Решение Prottoss на "корню" ликвидирующее не толерантность линий USB сигналам с AVR.
Рис.4. Изменения вошедшие в USBasp из схемы AVR910 USB.
После сборки и зашивки USBasp его наличие в Linux можно проверить утилитой lsusb вот как это выглядит:
# lsusb
Bus 002 Device 003: ID 16c0:05dc VOTI USBasp AVR Programmer
Bus 002 Device 002: ID 16c0:05e1 VOTI
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Устройство 16c0:05dc это USBasp, а 16c0:05e1 это AVR910 USB. На форуме рекомендуют записать правило (помните про sudo) для определения USBasp утилитой avrdude и другими программами:
# UDEV-style hotplug map for usbasp programmer
# Put this file in /etc/udev/rules.d
SUBSYSTEM=="usb", ATTR{product}=="USBasp", ATTR{idProduct}=="05dc", ATTR{idVendor}=="16c0", MODE="666"
При помощи утилитки avrdude шьется огромная часть AVR и в принципе ее более чем достаточно для работы. Документация на русском Часть 1, Часть 2 также доступна благодаря блогу.
Но под USBasp оказывается есть софт не только для Windows, но и для Linux.
Однако надо сказать софт этот принес мне массу головоломок. После установки (простой распаковки) xAVR необходимо было установить wxGTK, как это рекомендует автор (usblib уже стоял). wxGTK взял с репозитария версии 2.8. Софт для работы с USBasp запускается из под sudo, о чем предупреждает автор. После запуска ./avrprog заявляет, что с библиотеками 2.8 работать не хочет, желает 2.6. Деинсталируем gtklib 2.8 ставим 2.6 - софт выдает уже одну ошибку вместо двух, где требует so-шку из библиотеки 2.8. Предупреждаю сразу ставить 2.8 бессмысленно получим тоже сообщение "с 2.8 несовместимо". Поступил так: выкачал RPM (для RedHart нашел в какой пакет засунуты нужные *.so) и скопировал их по адресу, который от меня требовали /usr/lib. Однако avrprog этого оказалось мало и он сгонял меня за следующим *.so из очередного пакета wxGTK. Под конец потребовав tiff-овскую библиотеку (tiff*.so), ублаженный запустился.
Рис.5. Ублаженный xAVR
Рис.6. Программатор USBasp с небольшими доработками, в работе.
Рис.7. USBasp макетная плата, работы не так уж много.
Рис.7. USBasp макетная плата, оборотная сторона.
Поскольку большинство программ мечтают о запуске через sudo, но не являются при этом терминальными то могу предложить использовать простой алгоритм по их запуску со стола кликом по значку - в созданном текстовом файле на столе располагается скрипт запуска
#!/bin/bash
gksudo /usr/bin/dolphin
Файл сохраняется с нужным именем, и назначается исполняемым выбором крыжика в закладке ПРАВА - позволять исполнения файла как программы. Кликом на это скрипт программа запустится с правами root, запросив при этом пароль.
Работа у нас такая - учить калькулятор летать
http://community.livejournal.com/mk_152/23302.html
http://mk.semico.ru/mkpr_52.htm
..и чуть было не разбился о серые лунные камни, пытаясь повторить тестовую последовательность команд Лунолета-1. Хорошо, запас топлива был, и посадку я делал вручную, на глаз оценивая высоту по тени лунолета на ярко освещенном риголите :-) Откинув купол, я тут же вызвал по рации электрокар и через час в спокойной обстановке в гермо-ангаре, накачанным атмосферным воздухом, неспеша разобрал по винтикам новый кибер-пилот :-)
Есть два момента, на которые я обратил внимание.
1) расчет ускорения
На Лунолете-1 оно расчитывалось, принимая за массу корабля содержимое Р5 + содердимое РД, но до маневра! В Лунолете-XXI сначала происходит уменьшение массы на кол-во выработанного горючего, а уже затем вычисляется ускорение. Паяльником перепаял перемычку в блоке электроники :-) :
A380: ; с адреса 374
RM 8
RM 2
/
RM D
RM 8
-
P X>=0 A67
M D
RM 8
+ ;***** назад к массе топлива до маневра (для совместимости с Лунолет-1)
RM 5
(адреса меток такие как если 1.01 версию загрузить и декомпилировать)
2) расчет времени "без сознания" при перегрузке. В Лунолете-XXI стоит операция выделения целой части секунд. В итоге опять имеем расхождение. Безжалостно заменил датчик перегрузок на старый, но вытащенный из нетронутого ЗИПа для Лунолета со старым киберпилотом:
P X>=0 A107
;***** K INT -> точное значение берем..
K NOP ;**** и оставляем K НОП для возможности быстро восстановить
M 2
С помощью техника опять электрокаром выкатили из гаража оба Лунолета, старичка и нового, и поочередно подняв в лунное небо, остался доволен :)
Лунолет-1: 65 ПП 3 С/П (перегрузки!) С/П - 169,16446 84,112449
Лунолет-XXI: 0 В^ 65 В^ 3 С/П - (перегрузки!) С/П - 169,16449 84,112566
Небольшие отличия связаны с тем, что Лунолет-XXI все же еще и орбитальный киберпилот и учитывает изменение ускорения свободного падения от высоты. В общем ЛКИ прошло успешно!
P.S. Выложил файлы (назвал версия 1.02):
lunolet_xxi_102.mkp
lunolet_xxi_102.mkl
Анимация для МК-152: размышления.
1. Создаём ч/б кадры (не более 128x64) в Гимпе, экспортируем каждый в BMP.
2. С помощью программ BMP2MKI или BMP2MKL (+MKL2MKP) преобразуем кадры в формат, требуемый R9016.
3. Неким образом создаём MKB или MKT-файл, содержащий все полученные кадры. Возможно, MK.EXE позволит сделать MKB-файл из последовательности .DB , полученных от BMP2MKL. Возможно, ряд программ для МК-161 позволит перенести байты из программной памяти в регистры, а MK.EXE считает результат обратно.
4. Заносим в десятичные регистры, начиная с R15, адреса кадров в байтовой памяти ЭКВМ.
5. Проигрываем анимацию, скажем, следующей программой (для 6 кадров):
Cx 2 РРП9010
15 П4 6 П0
Kadr: КИП4 РРП9016 КГРФ FL0 Kadr
В/О
Конечно, по-хорошему надо ещё предусмотреть временную задержку. Благо таймер R9050 есть. Ещё можно будет посчитать максимальное FPS наших машинок. :-)
Если же все картинки строго 128x64, адреса можно не хранить в регистрах, а рассчитывать на ходу по номеру кадра. Адрес_кадра = 1026 * номер_кадра + 1000. К сожалению, таких полноэкранных и не сжатых картинок МК-152 в байтовых регистрах может сохранить лишь шесть. Седьмой кадр чуть-чуть не влезает (14 байт), для него придётся использовать разрешение 126*64. А можно провозгласить стандарт для анимации 127*64 и все кадры делать равными, по 1018 байт.
Ещё девять кадров можно хранить в памяти программ, тогда на проигрыватель остаётся 766 шагов (838 шагов при девяти кадрах 127*64). Вполне достаточно. Итого уже 16 полных кадров! Это мы ещё в электронный блокнот и на электронный диск не заглядывали. :-)
Когда порядок FPS будет ясен, смену кадров можно организовать по прерываниям — основная программа может заняться подгрузкой кадров с внешнего диска и их распаковкой. При этом обработчик будет несколько сложнее. Ведь первые 15 регистров после РР В/О восстановятся, да и за последний кадр заходить нельзя.
Было бы неплохо, если бы двушаговые РП4 в обработчике прерывания действовали с сохранёнными копиями регистров, в отличии от П4. А вдруг так и есть? Жаль, сейчас проверить не могу.
Злобно-модераторское.
Нас покинул уважаемый sfrolov за настойчивое предложение в конференции «альтернатив» МК-161. При указании на недопустимость здесь подобного поведения «питерец» Сергей Фролов не только не удалил свой нарушающий коммент, а стал спорить прямо в коммуне, причём… с модератором! :)
Напоминаю, что сообщество mk_152 предназначено для любителей ЭКВМ. Здесь мы помогаем друг другу (и тем, кто нам не мешает) с изучением и приобретением программируемых калькуляторов МК-152 и МК-161, обмениваемся программами и программистскими трюками, продвигаем родную и знакомую с детства торговую марку «Электроника».
Кто ещё не определился со своими симпатиями, идёт на парижский сайт уважаемого arbinada pmk.arbinada.com, на ленинградский сайт sfrolov'а www.leningrad.su/calc, а также во многие другие увлекательные места Интернета, посвящённые калькуляторам других фирм. Если вы вместо внедрения МК-161 начинаете предлагать наладонники, нетбуки, смартфоны, патефоны, электрические зубные щётки, напёрстки и т.д. — от карающей руки модератора вас не спасёт, что очередная импортная «альтернатива» не есть калькулятор! Если зудит расхваливать или рекламировать нечто в нашем сообществе, выбирайте объектом ЭКВМ, это мы поймём.
Срок наказания — 1 месяц. Это означает, что через месяц sfrolov может подать прошение о восстановлении в правах в коммуне mk_152, если это не произойдёт автоматически. Также напоминаю, что модераториалы обжалуются в личной переписке, а желающие обсуждать политику модерирования делают это вне коммуны.
Всем успехов в изучении наших любимых машинок!
<a href="http://msvk40.livejournal.com
МК-161 - проблемка с подключением к ПК.
Единственная проблема - не могу подключить его к своему ноутбуку. На чужом стационарном компе тестировал - все нормально, подключается. Подключаю через PCMCIA карту (своего COM-a у ноута нет). Карта рабочая - модем через нее работает. Программа же обмена упорно выдает "COM1. МК не обнаружен".
Параметры у компорта карты (В списке устройств он фигурирует как "PCI последовательный порт") все крутил. Может, кто-то поможет советом?
Модель pcmcia карточки - "StLab RS-232 Serial"
«Китайский год», новогоднее издание
http://the-hacker.ru/2009/kitgod.mkl
http://the-hacker.ru/2009/kitgod.mkp
Подробнее про новшества здесь (отдельное спасибо ryururu за каллиграфию):
http://arbinada.com/pmk/node/637
ATMega8515 - Гори гори, моя звезда...
Новый 2010 Год наступает нам на пятки!
Всяк по своему пытается создать атмосферу праздника - украшая, наряжая, размалевывая во все тяжкие. Однако мы же хорошо знаем, что по В.И.Ленину - "Из всех искусств для нас важнейшим является кино». Или по Павлову - первая сигнальная ублажает мозг млекопитающего своей глубинностью и дремучестью. Так всегда было народ со времен Вавилона требовал "Хлеба и зрелищ!".
Предыстория вопроса контроллера гирлянд уходит своими корнями в далекое прошлое когда микроконтроллеры были жутко дорогие и очень слабенькие по функциональным возможностям. В те давние времена получив заказ от высокого руководства, требовавшего "хлеба и зрелищ" в завуалированном виде "что бы во дворике предприятия все мигало, да причем разными цветами" мы с моим хорошим другом стали "отращивать мозг" :) как же бы это реализовать. До этого во дворе по периметру вешали раскрашенные в разные цвета лампочки ватт так на сто пятьдесят. Лампочки сильно грелись цвета выгорали, так что мало того что к следующему "нью еар" нужно было их красить, так еще и от начальства, вернувшегося с новогодних праздников по шапке за поблеклость внешнего вида отхватывали. Предложений было много некоторые хотели на двигатель прилепить группу размыкаемых контактов и таким образом отделаться от назойливой верхушки предприятия. Однако разобрав несколько катодных станций на предмет мощных тиристоров T-160 нами было решено сделать по науке - генератор, счетчик и дешифратор. А что бы с управления мощным тиристором вдруг бы не пришло на логику вольт эдак сотню в качестве дешифратора была выбрана популярная для газоразрядных цифровых индикаторов (от 0 до 9) микросхема высоковольтного десятичного дешифратора К155ИД1. Вся конструкция была упрятана в ящик из фанеры и просуществовали лет эдак пару. Но кто то из электриков это дело благополучно "запалил" по извечной русской "авось". Теперь уже в наших ручках суждено было блеснуть микроконтроллерам, к которым мы подобрались практически вплотную. Задача управления нагрузкой большой мощности встала в полный рост. Лепить на мощных тиристорах стало очень накладно ибо такими мощностями в гирляндах мы не управляли и близко. Тиристоры по проще нужных мощностей (до 400 - 500 ватт) не обеспечивали. Совершенно случайно в одном из журналов по комплектующим были подсмотрены "твердотельные реле" довольно дорогие по тем временам но для нас как возможность реализоваться бесценные. S202T02 - оптосимисторы позволяют управлять нагрузкой в 400-500 ватт и при этом изолировать управляющий интерфейс микроконтроллера от воздействия переменного тока 220 вольт :)
Мы были счастливы как дети и на радостях воплотили идею практически мгновенно. Но как водится, то что делается наспех, почти всегда не долговечно и не реализует всех возможностей. Так и вышло. В этом году дела давно минувших лет аукнулись. На этот раз решено было не допускать соплей при проектировании и сделать на совесть, с возможностью реализовать на 16 линиях управления любую схему коммутации как то "бегущий огонь", "инверсию", "пульсирующую линию" и прочее.
И так хотелось бы:
1. Управлять мощной нагрузкой переменного тока 220В
2. Иметь возможность менять схемы управления "огнем" в любом порядке
3. Сделать систему настраиваемой вплоть до внесения изменений в составленную программу светопреставления "на ходу", без использования средств высокого уровня
4. Обеспечить наглядность прохождения программы и тем самым упростить диагностику в цепях управления и коммутации нагрузки
Одна из "авосечности" и "торопыжничества" предыдущего проекта было отсутствие даже приблизительного расчета по возможному току портов МК и как следствие напрямую, даже без токо-ограничительных резисторов запайка управления непосредственно на линию порта. Если внимательно приглядеться к ДШ по твердотельным реле можно узреть что номинальный ток на открытие 50мА, а это на 10мА больше возможного номинального тока порта. Со временем (3-5 лет) как указано в ДШ на "твердотелки" оптопары реле деградируют имеющегося тока на открытие не хватает - разжечь ветку гирлянды становится не возможно и она начинает мерцать вместо того, что бы гореть. В этот раз из имеющихся под рукой КТ3107 были собраны ключи с током до 100мА (200мА в импульсе) и в качестве индикатора работоспособности каждый ключ нагружен светодиодом визуализатором. Схема ниже.
Для расчета ключей (дабы транзисторы не вошли в насыщение и при этом хватило тока на открытие) моим хорошим другом профессионалом в "радио" была предложена следующая методика расчета.
Справедливости ради нужно сказать что более разумным было бы использование комплементарного КТ3107 транзистора КТ3102, по схеме с разрывом эмиттером общего провода, однако схемотехника уже изготовленного шлейфа для гирлянд подразумевала управление "+" а не "-".
Программа управления построена на чтении инструкции из памяти EEPROM, и предусматривает задержку поступления следующей команды на исполнение. В дальнейшем нужно предусмотреть переход программы управления на любой шаг (пока только в нулевой шаг) и редактирование программы управления средствами контроллера гирлянд. В качестве источника ввода данных неплохо будет смотреться переменный резистор, а так как ATMega 8515 не имеет встроенного АЦП, то для задачи референсного напряжения для сравнения на компараторе можно использовать либо сеть R2R резисторов (ЦАП) либо ШИМ с RC цепочкой. В AppNote AVR400 фактически рассмотрен пример построения ADC на базе встроенного компаратора и ШИМ, с условием правда что измеряемые напряжения до 2/5 VCC.
Application Note AVR400. Применение МК без АЦП для измерения аналогового сигнала.
Application Note AVR400. Таблица значений R,C и тактовой частоты.
Application Note AVR113. Схема включения RC цепи
К моему великому сожалению контроллер отобрали как только я завершил испытания на стенде и обещали вернуть только по прошествии праздников. Так что изыскания будут продолжены :)
Исходные тексты проекта находятся по адресу адресу в Google Code
Пришел МК-161.
Программы BMP2MKL и MKI2BMP
Из файлов BMP, имеющих палитру, для точек изображения ЭКВМ автоматически выбирается наиболее тёмный цвет. Из 16-, 24- и 32-битныхизображений переносятся точки чёрного цвета.
Описание программы: http://mk.semico.ru/bmp2mkl.htm
Программа mki2bmp предназначена для преобразования файлов содержимого графического экрана MKI в файлы BMP. Программа формирует монохромные файлы размера 128x64 или 132x68. Цвет фона выбирается пользователем.
Описание программы: http://mk.semico.ru/mki2bmp.htm
Файлы программ для ОС GNU/Linux, DOS и Win32 с исходными текстами - на странице http://mk.semico.ru/prog.htm
Китайский год
Сегодня мой день рожденья и я решил отметить его публикацией очередной программы для МК-161.
Программа «Китайский год» помогает вычислить восточный (циклический) год по его григорианскому номеру (принятому в России «новому стилю»). Просто наберите номер года и нажмите В/О С/П. Вот, что программа выдаёт для наступающего 2010 года:
Качайте программу с исходным текстом отсюда:
http://the-hacker.ru/2009/kitgod.mkl
http://the-hacker.ru/2009/kitgod.mkp
Традиционный календарь Китая (вики) имеет цикл в 60 лет. То есть «номер года», являющийся комбинацией 10- и 12-летних циклов повторяется каждые 60 лет. Этот календарь — международный, не привязанный к божеству какой-либо религии. Он используется не только в Китае, но и во многих других странах Востока: Японии, Вьетнаме, Корее, Монголии и т.д. Народы вносили лишь косметические изменения, например год быка в разных странах может называться годом коровы, буйвола или вола. Чтобы внести чёткость, в скобках после названия материала и животного стоят их китайские названия.
Кроме названия года, например «Белый металлический тигр», программа выводит численные значения 10- и 12-летних циклов (7/10 и 3/12), а также номер года в 60-ричном цикле (27) и номер самого цикла (78).
К сожалению, существуют разночтения относительно того, какой 60-летний цикл считать первым. Данная программа придерживается летосчисления от первого года царствования легендарного правителя Хуан Ди (вики), то есть 2637 г. до н.э. Чтобы перенести начало летосчисления на 60 лет (или больше) вперёд или назад, исправьте в программе константу 2636 в соответствии с вашей традицией.
Для десятилетнего и двенадцатилетнего циклов даются не только номера, но также китайские имена (Гэн-инь) и общепринятые обозначения-иероглифы (庚 寅), которые иногда сравнивают с европейскими зодиакальными знаками.
Обратите внимание, что китайский традиционный Новый Год наступает не 1 января, а в новолуние между 21 января и 20 февраля. Поэтому будьте осторожны при определении года своего рожденья. Даты, приходящиеся на январь-февраль могут относиться к предыдущему китайскому году.
МК-161 можно купить в Москве.
Вчера съездил в магазин «Электроника», что на Ленинском проспекте, 99 (карта) и обнаружил там в продаже калькуляторы МК-161 и МК-152. Порадовался. Теперь жителям столицы не обязательно обращаться к услугам почты. Достаточно сесть на троллейбус от ст.м.Юго-Западная или Ленинский пр-т и доехать до магазина, известного всем коренным москвичам — там же продавались советские ПМК и персоналки.
( подробнее )
Внешний мультиплексор АЦП для МК-161
то к ЭКВМ можно подключить внешний мультиплексор с управляемым от ЭКВМ переключением каналов. То есть, ЭКВМ по каналу управления мультиплексором переключает каналы в мультиплексоре, и после переключения на канал опрашивает вход внутреннего АЦП. Измеренные значения падают в R9175-R9178.
Максимальное количество управляемых каналов внешнего мультиплексора - четыре? Какой вид сигнала управления мультиплексором - на двух линиях выставляется 00,01,10,11?
Не подскажете схему электрическую принципиальную внешнего мультиплексора?
Радиоприемники
Каким угодно - старым, новым, транзисторным, ламповым, детекторным или на процессорах цифровой обработки сигналов.
ATTiny12 - Позвони мне, позвони...
Дверной звонок - что может быть проще? Как правило об изготовлении дверного звонка никто не задумывается - возьми готовый в магазине. Но приобретение в магазине не окупается моральным удовлетворением от проделанной работы. Не важно как, но старый звонок времен СССР решено было отправить на заслуженный отдых, взамен водрузив что то издающее приятный или уж по крайней мере не режущий ухо звук. Задача в общем не ахти какая сложная, но интересная.
Глаз попремерявщись к имеющимся в заначке микроконтроллерам выбрал восьми ногую ATTiny12. Эх была бы ATTiny11.... или выпущенная недавно ATTiny10... глаз непременно упал бы на нее. Но в наличии только ATTiny12.
И так ознакомимся что же мы имеем в составе ATTiny12. Интервальный таймер, 1024 слова программной памяти, встроенный RC генератор до 1МГЦ, пять линий IO из которых одна линия может работать как внешнее прерывание INT0. Не плохо! Подойдем к задаче творчески. Что бы нам хотелось? А хотелось бы нам, что бы звонок мог проигрывать мелодию! Это означает нужно издавать определенную ноту с определенной длительностью по списку партитуры. Насчет ноты все более менее ясно, имея интервальный таймер ничего не мешает проигрывать ноты, задавая их частотой меандра. Формировать его можно в прерывании по переполнению таймера, в этом случае имеющийся интервальный таймер задает период колебания. А вот с длительностью уже так легко не выйдет, если мы задаем ее через кол-во периодов сигнала - нам становится очень неудобно жить. Периоды будут обязательно не кратные целым числам ms, придется использовать целые числа бОльших разрядностей. Сплошная головная боль да и только. Вот если бы нам еще один таймерок бы в помощь, тогда задавать длительность было бы так просто и однозначно... По счастью AVR снабжен еще одним таймером могущим отрабатывать несколько вариантов задержек - это Watch Dog timer, "сторожевая собака" не дающая AVR впасть в маразм - например бесконечный цикл по вине программиста или помехи из вне. Как правило работа с этим устройством происходит по принципу - взвел таймер на случай ошибки и "виса", а если таковой не случился и процедура отработала нормально - "собаку" вернем в будку на цепь (инструкцией WDR) и пусть опять ждет в будке пока не завершится сторожевой интервал. Если все таки "собаке" вовремя не дали "укорот" - она "кусает" кнопку RESET. В принципе этот сброс ничем не отличается от внешнего, но идентифицировать что именно привело к сбросу возможно. Регистр MCUSR содержит информацию о событии предшествующем сбросу.
рис.1. Схема формирования сигнала RESET для MK AVR фирмы Atmel.
И так возьмем эту собаку в оборот и не станем "дергать ее за цепь" возвращая на место преждевременно - пусть срабатывает как и положено через интервал Twdg который к слову достаточно гибок и может настроиться отдельным делителем на разные интервалы (см. рис.2).
рис.2. Пределитель для "сторожевого пса" MK AVR фирмы Atmel.
Таким образом WATHCDOG будет таймером задатчиком интервала работы основного таймера издающего тональный сигнал. Надо заметить что у данного метода будет один не очень существенный но заметный на слух недостаток - так как WATHCDOG именно сбрасывает МК, то состояние всех портов, в том числе и порта используемого для формирования тонального сигнала будет сбрасываться в логический ноль. Практически это означает, что с определенным периодом задаваемым таймером WATCHDOG будет происходить срыв внутри периода генерации на время восстановления. Время восстановления конечно не значительное, но ухо все равно будет слышать срывы из за их периодичности. На качество инструмента аля "дверной свисток" влияет не сильно :) Можно окончательно избавиться и от этого изъяна отключив WATCHDOG в процедуре обработки прерывания Timer0 (тонального сигнала), тогда интервал работы тона будет слегка варьироваться на половину периода, но никогда не будет обрываться внутри периода тональной посылки. Мне показалось что борьба за чистый и незамутненный звук инструмента достойного Амати, не так уж и важна.
Само собой мелодию надо хранить в виде записи последовательности ДЛИТЕЛЬНОСТЬ, ТОН в памяти программ. Кроме того необходимо отлавливать прерывание от внешнего источника (дверной кнопки) и осуществлять старт проигрыша сигнала. После проигрывания сигнала вполне допустимо уложить контроллер в летаргический сон - дабы минимизировать потребление (а вдруг проще будет менять батарейки чем возиться с источником питания?).
Рис.3. Схема электронного музыкального многотонального программируемого дверного звонка.
Конечно писать программу для такого устройства на Си можно, но невероятно глупо - ибо чего там писать то?
Исходный текст программы на ассемблере AVR.
P.S. Расширение этого устройства может быть весьма забавным - например добавление к имеющимся возможностям атаки звука или вариации звука по громкости в зависимости от установки пользователем. Но это уже совсем другая история.
Рис.4. Автопортрет дверного звонка.
Используемая литература:
1. ATTiny11-ATTiny12 Atmel datasheet.