Программирование контроллеров Propeller
В прошлой статье мы познакомились с главными особенностями архитектуры ИМС Propeller, поэтому пора перейти к конкретным реализациям. Если вы хотите начать разрабатывать свои Propeller-приложения, советую обратить внимание на фирменную схему PropellerDemoBoard.
Скачать схему можно тут:
Мы видим на ней знакомую EEPROM и PropPlug, а также трехбитный ЦАП комплексного видеосигнала, двубитные резистивные ЦАП для генерации RGB при подключении VGA-монитора. Поскольку порог срабатывания каждой линии чипа равен точно половине питания, поэтому возможно использовать его как компаратор и сделать простой АЦП на измерении времени заряда и разряда емкости, что и продемонстрировано на этой плате с чипом в корпусе LQFP44.
Да, кстати, чип доступен в корпусах DIP40 для лентяев, LQFP44 для любителей SMD, и в QFN44 для особо аццких эмбеддеров, экономящих место на всем и паяющих платы утюгом или феном не боясь перегреть дорогой чип. 🙂 Я же не стал особо себя утруждать и выбрал корпус DIP40. Почему? Все просто. Во первых, выглядит архаично и по-своему эстетично, это, наверное, наиболее мощный процессор в мире в подобном исполнении, да и выводы расположении очень юзерфрендли, запоминается легко, достаточно раз глянуть в даташит. И, что самое главное, цанговая панель, позволяющая вытащить его из отладки и вставить в разработанный прибор без покупки/выпаивания чипа. Это особенно актуально, если вспомнить, что пропеллер — штука отнюдь не дешевая(обычная цена колеблется на уровне 20..25 евро). Что интересно, цена полностью независима от типа корпуса — довольно таки необычно, согласитесь. Пора привыкнуть, что Parallax нарушает все известные стереотипы. 🙂
Отладочная плата не представляет вообще ничего интересного – просто выведенные пины с терминирующими резисторами как это удобно делать в таких случаях если вдруг что-то замкнешь по недосмотру, к тому же резисторы подобраны так, что могут быть использованы для вышеупомянутых ЦАП. На контакты можно одевать разные модули интерфейсов – PS/2 мышь, PS/2 клавиатура, VGA-монитор, комплексный видеовыход.
Самое время сказать пару слов о среде отладки. Первое и самое главное – она очень простая и интуитивно понятная. Рассказывать можно долго о всех возможностях, так что смысла в этом не вижу, ибо в документации и туториалах это все детально расписано, о чем смотрим в качественной русскоязычной документации тут (на нее я еще буду ссылаться):
Следует отметить, что проект выглядит очень просто – это файлы самой программы с расширением «.spin». Никаких дополнительных настроек, никаких «.hex» или «.bin» прошивок. Еще бы, среда создана под один единственный чип с уникальной архитектурой и создана почти что идеально. Программа транслируется в байт-коде непосредственно в ОЗУ, где с ней уже работает Spin-интерпретатор. Язык Spin уникален, как и сам чип, хотя существует компилятор под С, но он не прижился из-за своей неэффективности.
Проект обычно разбит на самодостаточные модули – объекты. При этом необходимо указывать объект, с которого будет начата компиляция, т.н. TopObjectFile, который также станет стартовой точной приложения. Каждый объект состоит из следующих блоков:
CON – Определяет глобальные константы.
VAR – Определяет глобальные переменные.
OBJ – Определяет ссылки на объекты.
PUB – Определяет Public-метод (может быть доступен из другого объекта).
PRI – Определяет Private-метод (доступен только внутри объекта).
DAT – Определяет данные, буферы и код ассемблера.
В объекте могут встречаться несколько блоков каждого типа, распределенных в любом необходимом порядке, но обязательно должен быть как минимум один блок PUB даже если вся остальная программа будет находится в блоке DAT и написана на ассемблере.
Среда Propeller Tool сама окрашивает каждый блок в свой цвет, облегчая чтение, возможны также разные способы отображения как полного кода, так и сокращенного для более легкого чтения. Сама среда очень проста и интуитивно понятна, форматирование текста очень важно, так как операторные скобки в языке Spin как таковые отсутствуют и задаются форматированием текста. На мой личный взгляд, это недостаток, среда подчеркивает что к чему относится, но если .spin-файл смотреть, скажем, блокнотом, или распечатать текст, то суть может теряться. Еще один незначительный по моему мнению недостаток – Propeller Tool в упор не понимает кириллицу, невозможно даже написать комментарий. Поскольку я никогда не пишу комментарии по-русски, этот недостаток был замечен лишь со слов других. Привыкнув работать в Си, нечувствительность к регистру тоже зачислю в «недостатки». 🙂
О среде Propeller Tool детально расписано в вышеупомянутой документации, так что можно перейти к самому примеру кода. А именно – классическая задача «Hello, world!» для микроконтроллера, то бишь, мигание светодиодами, пример из официального туториала от Parallax, немного видоизмененный под мои нужды.
Этот объект мигает светодиодом на ноге Pin с задержкой DelayMS миллисекунд Count раз. В блоке переменных VAR определяется длина стека для нового ядра а также его номер.
Метод Start останавливает уже работавший до этого процессор и запускает новый командой cognew на выполнение метода Toggle, при этом будет использоваться память для стека начиная с адреса Stack (символ @ — взятие адреса). При этом в переменных Success и Cog будет ID (номер) запущенного процессора (1..8) или нуль, если свободного процессора не нашлось. Это используется в методе Stop. Команде cogstop передается номер последнего запущенного процессора, после чего переменная Cog обнуляется (символ ~ означает постустановку в ноль).
В методе Toggle после установки нужного выхода на вывод (значение соответствующего бита в регистре dira устанавливается в единицу) следует цикл, в котором осуществляется переключение вывода и задержка. Команда waitcnt ждет до того момента, пока не осуществится совпадение со значение системного счетчика равным текущее значение сnt плюс количество задержанных циклов. Дальше, используя операцию #> (ограничение по максимуму) реализуется бесконечный цикл, если методу Toggle передано нулевое значение Count (декремент нуля ограничивается -1, что всегда есть «истина»). После выполнения операции процессор остановится, но переменная Cog будет содержать его ID, поэтому она обнуляется для того, чтобы метод Stop не пробовал остановить уже остановившийся процессор, а также чтобы методу Active была передана верная информация о активности cog’а.
Объект Blinker.spin
В блоке констант CON идет определение тактового источника – типа используемого резонатора, его частоты и множитель PLL. В блоке объектов OBJ создается сразу массив из шести объектов, названных LED. Основной метод Main последовательно вызывает метод Start объекта Output для переключения светодиодов с различными частотами при этом метод NextObject ищет и возвращает индекс свободного объекта, или ожидает пока такой не появится.
Вот, собственно, и вся задача, более подробно написано в туториале. Она исполняется действительно параллельно, а также демонстрирует тот факт, что все объекты могут быть заняты и приложение будет ждать до освобождения одного из них. Это можно наблюдать на видео.
Приятен тот факт, что множество объектов уже разработаны или пользователями ИМС Propeller, или инженерами компании Parallax, в том числе самим Сip’ом Gracey, основателем компании. Множество библиотек уже наличествуют в самой среде PropellerTool. В качестве таких примеров – генерация видеосигнала VGA (в том числе высокого разрешения) или монохромного комплексного видео с подключением стандартной PS/2 мыши, что продемонстрировано на картинках и видео. Также показано использование встроенного шрифта Parallax, позволяющего даже рисовать электронные схемы.
Из недостатков этого необычного микроконтроллера – почти полное отсутствие периферии, а хотелось бы иметь I2C (а так имеем, но только для связи с внешней памятью), SPI, USART (есть, но только для связи с хостом, а программный вряд ли сможет дать больше 9600 бод), элементарную аналоговую периферию, как АЦП, ЦАП в качестве разделяемых ресурсов. Внешняя память ничем не защищена от внешнего копирования, отсутствует система отладки. А так, впечатления в целом положительные, прибор и в самом деле очень необычен и стоит того, чтобы уделить ему внимание и поразмять мозги, так как при его программировании действительно надо научиться мыслить в рамках систем реального времени. Возможно, в будущем мной будет реализован девайс для отображения информации с других микроконтроллеров на видео через программный SPI, для отладки, например. А так, Propeller – идеальное решение для создания ПИД-регуляторов, робототехники, но прижился он больше там, где был создан, то есть, на Западе.
Хотелось бы напоследок также вспомнить о самой компании Parallax, так как производство собственного микроконтроллера «с нуля» — неимоверное достижение для компании такого небольшого масштаба. По словам Сip’а Gracey, Propeller был изготовлен чуть ли не с уровня каждого отдельно взятого транзистора и, думаю, есть основания этому верить. Даже PLL и выходные буферы выводов были разработаны ими специально для этого микроконтроллера. Не зря на разработку ушло более чем 8 лет работы команды увлеченных людей. Было закуплено дорогостоящее оборудование и создана своя лаборатория, в которых велась отладка микроконтроллера на открытом кристалле с помощью электронного луча, подобно микроскопическому щупу осциллографа. Смотря на неимоверные затраты на его создание, возникает вопрос – насколько окупился этот проект, учитывая небольшую распространенность продукта? Вопрос риторический, и мне было бы интересно получить на него ответ. Если даже Parallax создал даташит с полными электрическими параметрами не сразу, а только после язвительных шуточек пользователей из-за его отсутствия. 🙂
Впрочем Сip Gracey не скрывает того, что при создании микроконтроллера инженеры компании и он в частности также преследовали и чисто гуманитарную миссию, чтобы дать возможность интересующимся личностям узнать что-то новое и предоставить возможность воплотить свои технические мечты. Скорее всего, именно поэтому существует версия в DIP40 с легко запоминающимся расположением выводов и хороший, детальный мануал, позволяющий начать работу с микроконтроллером даже новичку в разработке встроенных систем.
Так что вывод один. Это стоит того, чтоб хотя бы раз попробовать. 🙂
P.S. Здесь перечислю все ссылки, которые могут быть полезны для работы с микроконтроллером Propeller.
- Сайт компании Parallax: https://www.parallax.com/
- Форум, посвященный чипу Propeller: https://forums.parallax.com/forums/default.aspx?f=25
- Обмен объектами – тут можно найти интересные объекты, или предложить свой: https://obex.parallax.com/
Русскоязычные статьи Игоря Коваленко, посвященные ИМС Propeller:
- https://www.igorkov.org/pdf/propeller1.pdf
- https://www.igorkov.org/pdf/propeller2.pdf
- Русскоязычный перевод документации по ИМС Propeller: www.parallax.com/dl/docs/prod/prop/PM-v1.0-RUS-v1.0.pdf
Удачи в ваших разработках!
Raymond
ОМГ, только заметил — это ты руками диоды под музыку подбирал, али там микрофон присутствует?
Как я упоминал, подключить микрофон несложно, но я этого пока не делал. Заметил совпадение c музыкой случайно когда прослушивал альбом Romantic Tragedy’s Grescendo 1998-го года в исполнении Macbeth, одного из наиболее любимых Gothic-Metal-коллективов. Использовано начало композиции Thy Mournful Lover.
omg, ну и шрифт у них.. если бы ты не сказал, что e, это @, я бы никогда не догадался))
Язык веселый, но это… язык.. Его же отдельно учить надо, при том никаких тебе библиотек, никаких наработок. Все заново. Имхо, это сильно помешает распространению пропеллеров.
А вообще мне понравилось.. Надо бы найти где-то этот чип и покопаться)
Да, конечно, язык учить придется, хорошо хоть хорошие детальные мануалы есть, как по Spin, так и по ассемблеру. Касательно наработок, соглашусь, но тут разработчики позволили легко собирать свои проекты с готовых легкодоступных объектов, поощряя их свободный обмен, тем самым создается что-то сродни комьюнити пропеллерщиков. 🙂
Верно говорят, что Parallax не разрабатывал официальный сишный компилятор для того, чтобы не отпугнуть пользователей неоптимальностью и тормознутостью кода из-за столь специфичной архитектуры микроконтроллера.
Очень интересная весч ! 🙂
А вот на сайте микроконтроллера он стоит 8 $ .
Item code P8X32A-D40
Stock 2858
Price $7.99
Starting from: 20 pieces $7.59
А вы еще прибавьте плату за пересылку. 😉 Я говорил о обычном радиомагазине, в котором можно взять чип «с прилавка».
Хотя да, вижу, Пропеллер подешевел, даже Elfa продает за 13 евро поштучно.
Да я почти заказал на их сайте 2 штуки плюс программатор, но вот там надо визу а у меня в долларах только E-c@rd 🙁 еще хотел набрать солнечных панелей 🙂
А нет оказалось это visa e-c@rd такая 🙂 сняли 169.71 как обещали 🙂
а на ТВ тоже в цвете выводит или только ЧБ?
собрал схему как в даташите, VGA в цвете, а на телевизор всё только в чб выдаётся, использовал демки с сайта пропеллера. в чём тут может быть дело?