Arduino или raspberry pi? микроконтроллер или микрокомпьютер?
Все платы для разработки можно разбить на 2 большие категории:
| Платы на микроконтроллере(MCU, MicroController Unit) | Одноплатные компьютеры(SoC, System on a Chip) |
| Типичный представитель —Arduino Uno | Типичный представитель —Raspberry Pi |
Микроконтроллеры могут одновременно исполнять всего одну задачу и отлично с этим справляются. А одноплатные компьютеры исполняют программы в рамках операционной системы (чаще всего Linux), обладают большей производительностью и широкими мультимедийными возможностями.
Существуют также гибридные платформы, где на одной плате расположен и микроконтроллер и процессор.
Идея в том, чтобы оставить мощному процессору сложные задачи: выход в сеть, обработку медиа, а на микроконтроллер возложить функцию точного управления приводами, реле, сенсорами и другой периферией.
Вы можете создать гибрид и сами, если возьмёте по одной плате из каждого семейства. У всех них найдутся общие интерфейсы, через которые можно организовать их взаимодействие.
И в одном и в другом лагере можно найти специализированные платы, которые сильно выделяются среди прочих какой-нибудь особенностью, но сравнить возможности среднестатистических микроконтроллеров и компьютеров поможет таблица.
| 1 ядро, десятки-сотни МГц, десятки КБ оперативки,десятки-сотни КБ постоянной памяти. | 1 или более ядер, сотни-тысячи МГц, сотни МБ оперативки,гигабайты постоянной памяти. |
| Нет.Но можно эмулировать. | Да.Управляется ОС. |
| ★☆☆Обычно нужны дополнительные модули и глубокое знание протоколов. | ★★★Легко подключается из коробки, сетевой модуль обычно уже на борту. |
| ★★★Потребляет единицы-десятки мА. Возможны недели работы от батареек. | ★☆☆Потребляет сотни-тысячи мА. Заряда большого аккумулятора хватит от силы на десяток часов. |
| ★★★100% контроль над временем и длительностью подачи сигналов. | ★☆☆Из-за многозадачности критический процесс может проспать своё время. |
| ★☆☆Ограниченный. Чаще C/C . | ★★★Python, JavaScript, Bash и десяткии других: любые доступные в ОС. |
| ☆☆☆Не хватит мощности. | ★★★OpenCV, аппаратные видеокодеки, HDMI-выход. |
| ★★☆На мощных микроконтроллерах возможен синтез звука. Для работы с MP3/OGG/WAV нужны дополнительные модули. | ★★★Поддержка MP3/OGG/WAV на уровне ОС. Аудиовыход HDMI и/или разъём 3,5 мм. |
Итак, в зависимости от своей задачи вы определились нужен ли вам микроконтроллер или компьютер. Как решить какая именно плата подойдёт лучше всего?
Так как нет большого смысла сравнивать лицом к лицу микроконтроллеры и микрокомпьютеры, далее мы отдельно приведём преимущества и недостатки конкретных плат в рамках своего семейства.
Быстрее, выше, сильнее
Итак, мы выросли из AVR, но все наши шилды, сенсоры, сервы с нами. И мы не заставим их пропадать, ведь они для Arduino, а не для AVR. Мы также и дальше не будем поддаваться стереотипам, что есть только какой-то ARM, и какой-то Cortex. Все много интереснее!
Каждый студент
, что AVR — это хорошо, а PIC — это плохо. Однако, не стоит это распространять на все семейства МК. PIC32 — вполне нормальный процессор с архитектурой MIPS. А MIPS — одна из лидирующих RISC-архитектур. По сравнению с ARM у нее есть одно достоинство — она не столь медиа-популяризирована, поэтому лицензионные отчисления за MIPS меньше, а процессоры в среднем — дешевле, и лидируют в отельных рыночных сегментах, таких как раутеры. Например,
стоит менее $50 даже в этой стране, ARM’у такое и не снилось. Но сейчас мы рассматриваем Arduino совместимые, и ChipKIT не заставит скучать при частоте 80МГц. 20EUR
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/getpro/geektimes/post_images/651/fbb/8a1/651fbb8a1078baed6bd1453c38e5b0e9.jpg)
Cortex снова подождет. На сцене — классика ARM, ядро ARM7, в лице чипа от любимого вендора AT91SAM7X512-AU. На своих 48МГц он даже щелкает .NET Micro Framework! $35
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/getpro/geektimes/post_images/0a6/e01/260/0a6e01260fc841df483c3bf668aa942d.gif)
Конечно же, в managed коде писать легче, так что парад .NET MF продолжается. Эта плата идет под маркетинговым чипом «USBizi», который на поверку оказывается NXP LPC2387 с соответствующим firmware. На 72МГц он наверное мог бы играть MP3. Только не в .
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](http://www.ghielectronics.com/images/fpn2_features.jpg)
Ну вот добрались и до героя нашего времени — фирмы STMicroelectronics, которая люто-бешено демпингует свои Cortex-M чипы. Новая 16-битная система команд Thumb2 вместо классической 32-битной — это ли тот ARM, каким мы его знаем? Впрочем, не важно, главное, чтобы GCC компилил в него оптимально. А ассемблерный код бывалые допилят ручками. 20EUR
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](http://www.olimex.com/dev/DUINO/OLIMEXINO-STM32/OLIMEXINO-STM32-1.jpg)
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/getpro/geektimes/post_images/c52/b39/93e/c52b3993ef5ca7d994c5b311dc0976d5.jpg)
Надоело баловаться в хардварной песочнице с
микроhttps://www.youtube.com/watch?v=ANmBMSR1Ok4
контроллерами с
микро
памятью и
микро
гигагерцами? Хочется ощутить настоящий процессор, способный работать с настоящей операционной системой, хочется теплых и мягких ха-тэ-эм-элов и джаваскриптов? Chumby Hacker Board все так же примет ваши шилды, если не на грудь, то на обратную сторону платы. $89
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/getpro/geektimes/post_images/92a/cba/d66/92acbad66285db6ceda71eb9875565f7.jpg)
Ссылки:
История развития: первый микропроцессор
Транзисторы, электромеханические реле, сердечники, вакуумные лампы – первые процессоры, старательно выполнявшие несложные арифметические и логические операции, появились еще в далеком 1940 году, но оставались ненадежными, громоздкими, да и неприменимыми в бытовых условиях (основное назначение – государственные разработки, крупные и набирающие обороты перерабатывающие фирмы) – слишком большое выделение энергии, неконтролируемая теплоотдача, низкая скорость обработки данных.
Со временем все изменилось. В 1970 году Эдвард Хофф, представлявший крупнейший отдел разработки компонентов для электронно-вычислительных машин, представил руководителям компании Intel интегральную схему, выполнявшую те же функции, что и чипы ЭВМ, но с маленьким нюансом – плата Эдварда помещалась в руке, обрабатывала 4 бита информации в секунду (конкуренты выдавали мощности в разы серьезнее – до 32 бит одновременно), и стоила в тысячу раз дешевле.
Первые калькуляторы снабжали именно процессором 4004 Эдварда Хоффа, которые появились в продаже в начале 1971 года. С этого момента, как принято считать, и началась эра новых процессоров, изменивших мир.
Дальше история развития микропроцессоров двинулась следующим путем:
- 1 апреля 1974 года. Intel вновь шокирует заинтересованную публику – на закрытых прилавках появилась модель 8080 с 6 тысячами транзисторов на крошечной схеме, объем памяти увеличен до 64 килобайт, проблемы с потреблением энергии решены, теплоотдача – практически нулевая. Чуть позже появился чип 8086, заложивший основы разрядности современных компьютеров.
- Октябрь 1985 года. В центре внимания снова Intel, с еще более неожиданной новинкой – моделью i 32-битная архитектура, новые возможности по управлению памятью, увеличенные мощности, тактовая частота в 16 МГц и общее быстродействие на уровне 6 Mips – мир и представить не мог, насколько быстро меняются возможности тех допотопных компьютеров, неожиданно получивших возможность работать с 4 Гб оперативной памяти и проводить тысячи арифметических действий всего за несколько секунд. А ведь впереди еще больше открытий!
- Осень 1989 года. Микропроцессор i80486DX, уместивший на крошечной плате 1.2 миллиона транзисторов, а еще сопроцессор и кэш-память, позволившая увеличивать текущую работоспособность компьютера путем промежуточного хранения некоторых данных, чисел, команд и действий. Общая производительность увеличилась до 16.5 Mips. Тактовая частота возросла до 16 МГц.
- Начало 1991 года. Появление i80486SX – штатное увеличение мощностей, долгие раздумья разработчиков из Intel на счет внедрения появляющихся чипов в ноутбуки и иные портативные устройства. Как результат – разные версии процессоров, рассчитанные под меняющиеся (иногда вычислительные, порой – контролирующие) нужды. Все эксперименты закончились появлением 2-го поколения МП (вроде i486DX2), поддерживающих новую технологию распределения мощностей между двумя разными ядрами центральной системы.
- Март 1995 года. Мир впервые знакомится с Intel Pentium, поставки чипов в магазинах для обычных пользователей – не за горами. Мощности увеличены до возможного (по тем годам) предела – 1 млрд. Mips.
Далее появились поставки многоядерных процессоров, затем появился Xeon и Intel Core, а после на мировом рынке загорелась новая звезда – модульные процессоры AMD. С тех пор (а именно с 2007 года) между двумя компаниями и ведется беспрерывная война за внимание пользователей.
На текущий момент хотя бы примерно описать состояние рынка МП невозможно – Intel Core представляет новые архитектуры микропроцессора (Coffee Lake, Skylake, Haswell, Kaby Lake) чуть ли не каждый год, а заодно меняет наименования семейства процессоров (Intel Core i3, i5, i7, i9).
Контроллер – популярная робототехника
Микроконтроллер, или контроллер (МК, controller) – это микросхема для управления электронными устройствами. По сути, контроллер является мозгом робота, который получает информацию из внешнего мира с помощью сенсоров и передает управляющие сигналы в актуаторы.
Микроконтроллер с точки зрения схемотехники представляет собой однокристальный компьютер, в состав которого входит процессор, ОЗУ, ПЗУ и интерфейсы периферийных устройств.
Существует множество различных микроконтроллеров, различающихся по типу процессора, объему и типу памяти, составу периферийных интерфейсов, и т.п.
К наиболее распространенной периферии МК можно отнести:
- цифровые и аналоговые порты ввода/вывода (GPIO);
- интерфейсы ввода-вывода, такие как UART, I²C, SPI, CAN, USB, IEEE 1394, Ethernet;
- широтно-импульсные модуляторы (PWM);
- массивы встроенной флеш-памяти.
Широкое распространение получили семейства микроконтроллеров ARM, AVR и PIC, которые применяются в промышленных системах управления, станках с ЧПУ, в современных бытовых устройствах и различных гаджетах.
На микроконтроллерах AVR (реже ARM) основана популярная аппаратная вычислительная платформа Arduino. Это устройство представляет собой плату с микроконтроллером Atmel ATmega, всей необходимой для него обвязкой, регулятором напряжения и USB-UART мостом.
Все выводы платформы выведены на края платы, и как правило уже оборудованы разъемами.
Основные модели Arduino имеют в своем составе 8-битный микропроцессор ATmega. Как правило, для большинства проектов использующих Arduino, такого слабого процессора вполне хватает.
Имеется и версия на основе 32-разрядного ARM Cortex M3 (ATMEL SAM3U), но пока она не получила достаточного распространения среди энтузиастов.
Наиболее популярная версия Arduino Uno базируется на микроконтроллере ATmega328. Имеет 15 GPIO портов, включая 6 ШИМ. Микроконтроллер снабжен 32Кб Flash-памяти и 2Кб RAM. Тактовая частота процессора 16МГц.
Для программирования Arduino не требуется внешний программатор, так как в микроконтроллер уже зашит загрузчик (boot loader). Кроме того, на плате размещается USB-UART мост, который позволяет загружать скетчи при помощи обычного USB интерфейса.
Программный код для Arduino выполняется на языке Processing/Wiring, имеющем синтаксис C . Для составления кода и загрузки его в контроллер используется свободно-распространяемый редактор Arduino IDE.
Именно благодаря этим двум особенностям, Arduino стала самой распространенной платформой для начинающих разработчиков электроники. Стоимость самой дешевой Arduino Uno варьируется в пределах $15-$20.
Поскольку “Arduino” является зарегистрированным товарным знаком, сторонние производители вносящие изменения в архитектуру платформы используют другие обозначения для своих продуктов.
Клоны совместимы с Arduino программно и аппаратно, что означает они могут использовать программы написанные для Arduino и использовать соответствующие дополнительные модули (Shields).
Список клонов достаточно велик и постоянно растет: серия Freeduino (SB, Max Serial, Through-Hole), CraftDuino, Seeeduino, Roboduino, и т.п.
Имеются также специализированные платформы на основе Arduino архитектуры:
Как уже упоминалось, на плате Arduino, помимо самого микроконтроллера, размещается USB-UART мост и понижающий регулятор напряжения. Насколько усложнится работа с платформой, если убрать эти элементы?
Активисты из сообщества Shrimping It задались этим вопросом, и разработали минималистическую версию Arduino, назвав её The Shrimp.
Состоит Shrimp из микроконтроллера ATmega328 (или 168), минимальной обвязки из нескольких конденсаторов, кварцевого резонатора, диода и резистора. Чтобы микроконтроллер смог принимать скетчи Arduino, его необходимо прошить загрузчиком, либо оригинальным, либо аналогом типа OptiLoader.
Чтобы залить скетч через USB, потребуется внешний USB-UART. Такое устройство можно приобрести на ebay за 3-4$. Имея внешний мост можно программировать множество Shrimp-ов.
Нехватка ресурсов Arduino привела к созданию таких же простых в использовании на более мощных платформ для разработки электронных устройств. Одной из таких продвинутых в техническом плане платформ является Maple (текущая ревизия r5), базирующаяся на 32-битном микроконтроллере STM32F103RB с архитектурой ARM Cortex M3.
Тактовая частота использованного микроконтроллера STM32 составляет 72МГц. Maple имеет на своем борту 120Кб Flash памяти и 20Кб SRAM. Для GPIO используются аж 43 вывода, из которых 15 с поддержкой 16-битной ШИМ.
А еще имеется встроенная система заряда LiPo батарей.
Облегченная модель Maple Mini имеет ядро с такой же тактовой частотой и памятью, и отличия заключаются только в количестве выводов. Ведется разработка флагманской Maple Native II, которая будет иметь еще больше выводов чем стандартный Maple и больший объем памяти (512 Flash и 64SRAM).
Для программирования используется свой Maple IDE. Скетчи Maple, за некоторыми исключениями, совместимы с Arduino. Единственной проблемой на текущий момент является весьма ограниченный набор библиотек. По сути их три, это:
- LiquidCrystal – полностью совместимая с Arduino;
- Servo – частично совместимая;
- и начальная версия Wire (I2C).
В целом, платформа представляется весьма интересным устройством для тех кому нужно значительно больше вычислительных ресурсов чем у Arduino и тех кто способен сам дописать нужные библиотеки.
Стоимость Maple rev5 на ebay колеблется в диапазоне $30-35, что совсем не много за такую систему.
Как и Maple, платформа mbed не так популярна как семейство Arduino. Однако, в основе mbed лежит более мощный микроконтроллер NXP LPC1768 с архитектурой ARM Cortex M3. Процессор работает на частоте 96МГц и снабжен 512Кб Flash-памяти и 32Кб RAM.
В официальном репозитории имеется большая коллекция различных библиотек на все случаи жизни. Программирование контроллера осуществляется путем копирования скомпилированного бинарного файла на флеш контроллера и перезагрузка устройства специальной кнопкой в центре платы.
Сами же программы составляются с помощью весьма удобного on-line компилятора.
Конечно, стоимость mbed превышает Arduino в разы и составляет $60 ($45 для упрощенной ARM Cortex-M0 версии), но если вам требуется большие вычислительные ресурсы, скажем для системы маневрирования БПЛА или для интеллектуального анализа изображений, то данная платформа становится достаточно интересной.
Подробный обзор mbed можно найти здесь.Платформы на основе микроконтроллеров ARM имеют достаточно вычислительных ресурсов для работы полноценной операционной системы, и подключения ресурсоемких периферийных устройств.
Одно такое сложное устройство на базе ARM имеется практически у каждого человека, читающего статью – это смартфон.
В 2021 году была создана платформа, объединяющая в себе мощь ARM процессоров и широкие возможности классических платформ для макетирования.
Raspberry PI – это полноценный микрокомпьютер, в составе которого входят:
- процессор Broadcom BCM2835, включающий основное ядро ARM11 и графическое ядро;
- ОЗУ 512Мб или 256Мб;
- 2х USB 2.0 порта;
- Ethernet 10/200 Мбит/с;
- видеовыход HDMI;
- видеовыход композитный;
- аудиовыход jack 3.5;
- GPIO выводы.
В свою очередь, порт GPIO имеет 17 выводов, включая две шины SPI, одну I2C и один интерфейс UART.
Операционная система загружается в память системы с SD флеш карты. Специально для Raspberry Pi, сообществом были адаптированы операционные системы:
- Debian – Raspbian;
- Fedora Core – Pidora;
- RISC OS;
- Arch – ArchLinux.
Стоимость Raspberry PI Type A, с 256Мб ОЗУ составляет около $25. Её старшая версия B, имеющая 512Мб ОЗУ и Ethernet порт уже колеблется в районе $35.
Существует и множество других платформ для разработки микроконтроллерных устройств. На рынке (в основном на китайском) представлено огромное количество подобных систем на основе, например, микроконтроллера STM32. Семейство данных контроллеров базируется на 32-разрядных процессорах ARM Cortex M.
Также часто можно найти и более слабые платформы с контроллерами семейства PIC.Также как и Arduino или mbed, подобные средства разработки включают в себя ряд цифровых и аналоговых выводов, различные кнопки, индикаторы, USB-интерфейс, Ethernet, а также LCD и TFT дисплеи.
В отличие от того же Arduino, составление программ для указанных устройств осуществляется на более низком уровне. Разработка, как правило, ведется в специальной среде.
Например для программирования микроконтроллеров ARM используются коммерческие продукты, такие как Embedded Workbench от IAR Systems, или бесплатные – Eclipse. Установка программы на контроллер обычно производится с помощью специального устройства-программатора.
Таким образом, для работы с подобными платформами потребуется гораздо больше специальных знаний, чем в случае Arduino или mbed.
Стоимость систем на базе STM32 и PIC варьируется от $15 до $200 и более, в зависимости от мощности процессора, количества интегрированных интерфейсов и дополнительных устройств ввода/вывода.
Союз arduino и классического процессора
Ретрокомпьютерщики бывают различной степени привередливости. Одни довольствуются эмуляцией. Другие предпочитают ПЛИС, потому что тогда получается не эмуляция, а воссоздание. Наконец, третьим подавай настоящий процессор.
Но процессору для работы нужно столько всего! Снова дилемма: взять настоящие микросхемы тех же лет, или поместить всё в ПЛИС, оставив снаружи процессор? Впрочем, почему обязательно ПЛИС? Да здравствует союз Arduino и классического процессора!
Подарите своему Arduino «второй мозг» и сделайте его «умнее».
Настоящий восьмибитный микропроцессор выполняет программы, а Arduino эмулирует ПЗУ, ОЗУ и простейшую периферию.
Проектируйте виртуальную периферию в Arduino IDE, а на микропроцессоре запускайте код на ассемблере. Не нужно собирать сложные схемы и прошивать параллельные ПЗУ.
Поддерживаемые микропроцессоры: 6502, 6809 и Z80 (КР1858ВМ1), на подходе — другие.
Шилд с микропроцессором не мешает подключать другие шилды: с ЖКИ, картами памяти, и др.
Помимо самостоятельного программирования на ассемблере, можно попробовать запустить на микропроцессоре какой-нибудь классический код.
Правда, микропроцессор будет работать на очень небольшой частоте — порядка 95 кГц, точное её значение зависит от оптимизации кода эмуляции периферии.
Распределение адресного пространства задаётся программно в скетче. Микропроцессору можно выделить от 4 до 6 кБ ОЗУ из 8 кБ, имеющихся на Arduino Mega. ПЗУ можно выделить более 200 кБ из имеющихся 256.
При помощи последовательного порта Arduino Mega можно эмулировать UART.
Схемы, чертежи плат, Gerber-файлы доступны под CC-BY-SA 4.0 здесь. При этом имеется требование обязательно прикладывать файл README.md, потому что в нём содержится следующее предупреждение:
Не подключайте шилд, пока не залит скетч эмуляции периферии! Иначе возможно закорачивание выходных линий микропроцессора.
Да и в самом скетче что-нибудь переделывать нужно осторожно по той же причине.
Схема устройства на 6502:
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/e0/n8/6k/e0n86kpozlcttklifjihnl51quo.png)
Схема устройства на 6809:
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/qf/yi/kx/qfyikx1tktdjuad0hocivlpsolw.png)
Схема устройства на Z80:
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/ct/uh/qs/ctuhqskjmmp1rvxrhs8abcoqvne.png)
Уже можно запустить:
На устройстве с 6502 — Apple I, Woz Monitor ПЗУ с Бейсиком
На устройстве с 6809 — Аналог самодельного компьютера Simon6809 того же разработчика, учебный монитор с ассемблером и дизассемблером
На устройстве с Z80 — пока только эхо-тест последовательного порта, позволяющий проверить работоспособность виртуального 8251 (КР580ВВ51А).
Прошивки для эмуляции периферии — под лицензией MIT.
Краткие описания принципа действия:
К устройству на 6502
К устройству на 6809
К устройству на Z80 — в процессе подготовки.
Разработчик пытается продавать устройства, но с доставкой только по США. Особого смысла покупать нет, поскольку схема очень простая, повторить её на куске макетки можно за час.
Запланирована разработка аналогичных плат на RCA1802, 68008, 8085 (КР1821ВМ85А), 8088 (КР1810ВМ88). Про К1801ВМ1 не сказано, но можно подкинуть автору такую идею.
Файлы:
К устройству на 6502: инструкция по сборке, шелкография, схема
К устройству на 6809: инструкция по сборке, шелкография, схема
К устройству на Z80: инструкция по сборке, шелкография, схема
Рассмотрим взаимодействие Arduino и устройства на 6502. Arduino периодически меняет уровень на входе микропроцессора, предназначенном для подачи тактовых импульсов, с нуля на единицу и обратно. На каждом такте оно проверяет, что происходит на линиях управления и шине адреса, и, в зависимости от ситуации, считывает информацию с шины данных или отправляет её туда. Arduino может также управлять линиями IRQ и NMI, вызывая прерывания. На рисунке показаны виды данных и направления их передачи:
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/tr/in/je/trinjeibi9cwwrngfq628lm4yns.png)
Соответствие портов Arduino и выводов микропроцессора сконфигурировано в скетче:
/* Digital Pin Assignments */
#define DATA_OUT PORTL
#define DATA_IN PINL
#define ADDR_H PINC
#define ADDR_L PINA
#define ADDR ((unsigned int) (ADDR_H << 8 | ADDR_L))
#define uP_RESET_N 38
#define uP_RW_N 40
#define uP_RDY 39
#define uP_SO_N 41
#define uP_IRQ_N 50
#define uP_NMI_N 51
#define uP_E 52
#define uP_GPIO 53Разобьём каждый такт на следующие события:
CLK меняет состояние с единицы на нуль (спад)
CLK находится в состоянии нуля
CLK меняет состояние с единицы на нуль (нарастание)
CLK находится в состоянии единицы
CLK снова меняет состояние с единицы на нуль…
Что происходит в моменты смены состояний?
6502 получает тактовые импульсы по входу CLK0, буферизует их и отправляет на два выхода: CLK1 и CLK2. Хотя в микропроцессоре все события привязаны к CLK1, будем считать, что задержка невелика, и они привязаны к CLK0 — той линии, по которой здесь микропроцессор получает тактовые импульсы из Arduino. И называть сигнал просто CLK.
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/9i/kq/hc/9ikqhcytwd4sjg6rwjnvmohgkvi.png)
1. CLK меняет состояние с единицы на нуль.
2. Микропроцессор выводит на шину адреса новый адрес, а на выход R/W — сигнал переключения между чтением и записью. Но он ещё не готов к обмену данными.
3. CLK переходит в состояние единицы, и это означает, что обмен данными начался. Если это операция чтения, микропроцессор переводит выводы шины данных в состояние входов и принимает по рим данные, а если операция записи — переводит их в состояние выходов и отправляет данные. А сигнал R/W переключает внешнее устройство в режим записи или чтения, противоположный соответствующему состоянию микропроцессора.
4. CLK переходит в состояние нуля. Теперь на шину даннных ничего не выводят ни микропроцессор, ни устройства ввода-вывода. Микропроцессор может установить в новое состояние линии шины данных и вывод R/W.
Простое объяснение, понятное и ребёнку. Который никогда и не задумается об этих «закулисных интригах», если будет программировать только микроконтроллеры. Даже на ассемблере.
Если нужно подключить своё периферийное устройство, оно должно успевать подготавливать данные до того, как на линии CLK появится единица (время подготовки), а пока там единица — не менять их. Если периферийное устройство не успеет подготовить данные, пока на CLK нуль, или поменяет их, когда там единица, вы будете долго недоумевать, почему ваш код не работает. Поскольку тактовая частота микропроцессора здесь в десять-пятнадцать раз ниже номинальной, соблюсти это требование просто. Но нужно обязательно.
Итак, нужно «научить» Arduino генерировать тактовые импульсы, непрерывно проверяя, что при этом происходит на шине адреса и линии R/W, и соответствующим образом взаимодействуя с шиной данных. Для этого в скетче задействовано прерывание по таймеру timer1, вырабатывающему импульсы с частотой в 95 кГц. Arduino работает значительно быстрее микропроцессора, и потому между его тактами успевает всё и считывать, и подготавливать. Важно проследить, чтобы после модификации скетча это условие продолжало соблюдаться.
Вот выдержка из скетча, по которой понятно, как CLK переходит из нуля в единицу, и что происходит далее:
////////////////////////////////////////////////////////////////////
// Processor Control Loop
////////////////////////////////////////////////////////////////////
// This is where the action is.
// it reads processor control signals and acts accordingly.
//
ISR(TIMER1_COMPA_vect)
{
// Drive CLK high
CLK_E_HIGH;
// Let's capture the ADDR bus
uP_ADDR = ADDR;
if (STATE_RW_N)
//////////////////////////////////////////////////////////////////
// HIGH = READ transaction
{
// uP wants to read so Arduino to drive databus to uP:
DATA_DIR = DIR_OUT;
// Check what device uP_ADDR corresponds to:
// ROM?
if ( (ROM_START <= uP_ADDR) && (uP_ADDR <= ROM_END) )
DATA_OUT = pgm_read_byte_near(rom_bin (uP_ADDR - ROM_START));
else
if ( (BASIC_START <= uP_ADDR) && (uP_ADDR <= BASIC_END) )
DATA_OUT = pgm_read_byte_near(basic_bin (uP_ADDR - BASIC_START));
else
// RAM?
if ( (uP_ADDR <= RAM_END) && (RAM_START <= uP_ADDR) )
DATA_OUT = RAM[uP_ADDR - RAM_START];
else
// 6821?
if ( KBD <=uP_ADDR && uP_ADDR <= DSPCR )
{
// KBD?
if (uP_ADDR == KBD)
{
... // handle KBD register
}
else
// KBDCR?
if (uP_ADDR == KBDCR)
{
... // handle KBDCR register
}
else
// DSP?
if (uP_ADDR == DSP)
{
... // handle DSP register
}
else
// DSPCR?
if (uP_ADDR == DSPCR)
{
... // handle DSPCR register
}
}
}
else
//////////////////////////////////////////////////////////////////
// R/W = LOW = WRITE
{
// RAM?
if ( (uP_ADDR <= RAM_END) && (RAM_START <= uP_ADDR) )
RAM[uP_ADDR - RAM_START] = DATA_IN;
else
// 6821?
if ( KBD <=uP_ADDR && uP_ADDR <= DSPCR )
{
// KBD?
if (uP_ADDR == KBD)
{
... // handle KBD register
}
else
// KBDCR?
if (uP_ADDR == KBDCR)
{
... // handle KBDCR register
}
else
// DSP?
if (uP_ADDR == DSP)
{
... // handle DSP register
}
else
// DSPCR?
if (uP_ADDR == DSPCR)
{
... // handle DSPCR register
}
}
}
////////////////////////////////////////////////////////////////
// We are done with this cycle.
// one full cycle complete
clock_cycle_count ;
// start next cycle
CLK_E_LOW;
// If Arduino was driving the bus, no need anymore.
// natural delay for DATA Hold time after CLK goes low (t_HR)
DATA_DIR = DIR_IN;
}Распределение адресного пространства можно сделать каким угодно, в немодифицированном скетче оно такое же, как в Apple 1 с 256 байтами ПЗУ, 8 килобайтами ПЗУ для Бейсика, 4 килобайтами ОЗУ и устройством ввода-вывода 6821.
// MEMORY LAYOUT
// 4K MEMORY
#define RAM_START 0x0000
#define RAM_END 0x0FFF
byte RAM[RAM_END-RAM_START 1];
// ROMs (Monitor Basic)
#define ROM_START 0xFF00
#define ROM_END 0xFFFF
#define BASIC_START 0xE000
#define BASIC_END 0xEFFF
////////////////////////////////////////////////////////////////////
// Woz Monitor Code
////////////////////////////////////////////////////////////////////
//
PROGMEM const unsigned char rom_bin[] = {
0xd8, 0x58, 0xa0, 0x7f, 0x8c, 0x12, 0xd0, 0xa9, 0xa7, 0x8d, 0x11, 0xd0,
...
0x00, 0xff, 0x00, 0x00
};
// BASIC ROM starts at E000
PROGMEM const unsigned char basic_bin[] = {
0x4C, 0xB0, 0xE2, 0xAD, 0x11, 0xD0, 0x10, 0xFB,
...
0xE0, 0x80, 0xD0, 0x01, 0x88, 0x4C, 0x0C, 0xE0
};ОЗУ эмулируется массивом byte RAM[RAM_END-RAM_START 1]. Два ключевых слова PROGMEM нужны, чтобы содержимое эмулируемых ПЗУ хранилось во флеш-памяти микроконтроллера.
6821 эмулирован в достаточной мере, чтобы через «терминалку» работали виртуальные клавиатура и дисплей. Woz Monitor и Бейсик работают, чего и добивался автор.
Чтобы эмулировать любое периферийное устройство, нужно внимательно ознакомиться с его даташитом и выяснить, какие у него есть регистры, и для чего они предназначены. Удобство эмуляции — в гибкости, с которой можно делать программные аналоги периферии.
Устройства ввода-вывода находятся в адресном пространестве микропроцессора, обращение к ним происходит так же, как к ячейкам памяти. Чтобы использовать «железную» периферию, такую, как ЖК-дисплей, карту памяти, выход звука, нужно выделить им в адресном пространстве место.
Ссылки:
www.6502.org
www.callapple.org/soft/ap1/emul.html
skilldrick.github.io/easy6502
searle.hostei.com/grant/6502/Simple6502.html
wilsonminesco.com/6502primer
SB-Assembler: www.sbprojects.net/sbasm
Переходим к 6809, в нём имеются:
Два восьмибитных аккумулятора A и B, которые могут быть объединены в один шестрадцатиразрядный аккумулятор
Два 16-битных индексных указателя стека
Адресация относительно счётчика команд
Автоматическое прибавление или вычитание числа 1 или 2
Перемножение двух восьмиразрядных чисел без знака
16-битная арифметика
Перенос и обмен данными между всеми регистрами
Запись и чтение всех регистров и любого их сочетания
Микропроцессору 6809E (external) нужен внешний тактовый генератор, у 6809 он внутренний. У Hitachi они называются, соответственно, 6309E и 6309, от обычных они отличаются тем, что внутри операции у них выполняются в 32-разрядном виде, но возможно переключение в режим совместимости с классическим вариантом.
Собственно, весь проект RetroShield потому и начался, что автор хотел модернизировать свой же самодельный компьютер Simon6809 и назвать результат Simon6809 Turbo. Но оказалось, что микросхем стандартной логики для всего, что он хотел там реализовать, потребовалось бы очень много. Поэтому идею RetroShield автор впервые сформулировал именно применительно к 6809, и лишь затем подумал: «а что если и с другими процессорами то же проделать?».
В устройстве, разумеется, применён 6809E, требующий внешнего тактового генератора, чтобы можно было синхронизировать его работу извне. Линии E и Q у обоих процессоров называются одинаково, только у 6809 это выходы, а у 6809E — входы.
С 6809 Arduino взаимодействует так же, как с 6502, но входов тактовой частоты у него два: E и Q, а входов для прерываний — три: IRQ, FIRQ и NMI.
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/0i/uk/dn/0iukdn25vkrhbsvd8spjlhr-s3q.png)
В этот раз соответствие портов Arduino и выводов микропроцессора сконфигурировано так:
/* Digital Pin Assignments */
#define DATA_OUT PORTL
#define DATA_IN PINL
#define ADDR_H PINC
#define ADDR_L PINA
#define ADDR ((unsigned int) (ADDR_H << 8 | ADDR_L))
#define uP_RESET_N 38
#define uP_E 52
#define uP_Q 53
#define uP_RW_N 40
#define uP_FIRQ_N 41
#define uP_IRQ_N 50
#define uP_NMI_N 51
#define uP_GPIO 39Как видно из графиков, сигнал Q сдвинут относительно E на четверть периода:
Обращать внимание на Q мы почти не будем, так как все события привязаны к E. А происходит всё так:
![Arduino Due: распиновка, схема подключения и программирование [Амперка / Вики]](https://habrastorage.org/webt/ao/hj/qv/aohjqvkk89mbouy7_njtjqbz3ku.png)
- E переключается в нуль. Процессор выставляет на шину адреса новый адрес и меняет состояние линии R/W.
- E переключается в единицу, процессор становится готов к обмену данными.
- Неважно, что происходит с шиной данных, пока на E единица, главное, чтобы требуемые данные там присутствовали в момент перехода E обратно в нуль.
- При чтении данных устройство ввода-вывод должно подать на шину данных требуемые данные до перехода линии E из единицы в нуль (минимальная задержка показана числом 17 в кружке).
- При записи устройство ввода-вывода должно зафиксировать данные у себя в каком-нибудь регистре в том виде, в каком они были в момент перехода E из единицы в нуль. Процессор же подаст эти данные на шине даже раньше — в момент перехода Q в единицу (число 20 в кружке).
- После перехода E в нуль всё повторяется.
Всё сказанное выше про 6502 о необходимости выработки периферийным устройством (в т.ч. виртуальным) всех сигналов вовремя касается и 6809.
Генерация сигналов E и Q, как и в случае с 6502, с той лишь разницей, что сигналов два, и переключать их надо в соответствии с графиками. И точно так же подпрограмма, вызываемая по прерыванию, выполняет в требуемые моменты ввод или вывод данных.
Адресное пространство в немодифицированном скетче распределено так же, как в самодельном компьютере Simon6809:
// MEMORY
#define RAM_START 0x0000
#define RAM_END 0x0FFF
#define ROM_START 0xE000
#define ROM_END 0xFFFF
byte RAM[RAM_END-RAM_START 1];
////////////////////////////////////////////////////////////////////
// Monitor Code
////////////////////////////////////////////////////////////////////
// static const unsigned char
PROGMEM const unsigned char simon09_bin[] = {
0x1a, 0xff, 0x4f, 0x1f, 0x8b, 0x0f, 0x36, 0x7f, 0x01, 0xa5, 0x10, 0xce,
...
0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0xe0, 0x00
};ОЗУ и ПЗУ хранятся в массивах так же как в варианте на 6502, с той лишь разницей, что здесь массив с данными ПЗУ — один.
Устройствам ввода-вывода здесь также выделены участки адресного пространства, и они могут быть как виртуальными, так и реальными. Так как Simon6809 — современная машина на винтажной элементной базе, с ПК, на котором запущена «терминалка», она обменивается данными через FTDI. Здесь эмулировано и это.
Ссылки:
Много информации по 6809 на Странице Arto
Статья в Википедии о 6809
SWTPc 6809 systems
Статья в Википедии об операционной системе FLEX
Сравнение микроконтроллеров
Если рассматривать микроконтроллерные платы в отрыве от задач вашего проекта, сложно в двух словах объективно описать преимущества и недостатки разных платформ. То, что в общем является недостатком, в вашем устройстве может не играть роли и наоборот.
Мы попытались сравнить платы, отталкиваясь от возможностей флагманской DIY-платформы Arduino Uno, так как платы именно этого семейства дали невероятный пинок развитию хобби-электроники во всём мире.
Разные компании выпускают модули, сенсоры, платформы, дополнения с шильдами «Arduino compatible», «Designed for Arduino» и т.д.
За этими словами стоит электронная и программная совместимость в первую очередь с Arduino Uno, а уж затем со всем остальным.
Как правило, с помощью ухищрений или дополнительных компонентов можно подключить что угодно, к чему угодно. Но ведь вам хочется сосредоточиться на своём проекте, а не на борьбе с электроникой? Поэтому волей не волей хочется сравнить любую плату на микроконтроллере именно с Arduino Uno. Так и сделаем.
Arduino Uno Процессор на 16 МГц, 32 КБ постоянной и 2 КБ оперативной памяти, 20 портов ввода-вывода, 6 аналоговых входов, 6 каналов ШИМ, 2 аппаратных прерывания, может, и не впечатляют, но без балласта в виде операционной системы и интерпретаторов, они позволяют решать практически любые задачи по точному дирижированию множеством сенсоров и исполнительных устройств.
Тонны документации, уроков и готовых библиотек, огромное сообщество, работа из простой в освоении среды Arduino IDE с языком Arduino C . Всё это просто не даст вам возможности сказать «не осилил».Родное напряжение в 5 вольт, которое является де-факто стандартом и колодки для установки плат расширения, аналоговые входы, всевозможные аппаратные интерфейсы позволяют подключить практически любую периферию, сенсоры и исполнительные устройства.
Arduino Leonardo Та же Arduino Uno, но с другим микроконтроллером, который находится в том же классе, но имеет некоторые отличия положительного характера.Большее количество аналоговых входов (12 против 6) для сенсоров, больше каналов ШИМ (7 против 6), больше пинов с аппаратным прерыванием (5 против 2), раздельные независимые serial-интерфейсы для USB и UART.
Arduino Leonardo может притворяться клавиатурой или мышью (HID-устройством) для компьютера. Это позволяет легко сделать своё собственное устройство ввода.Из-за распиновки чуть отличной от Arduino Uno возможна несовместимость с некоторыми платами расширения.
Такие случаи, однако, редки, и в нашем магазине мы явно их прописываем.Iskra Neo Та же Arduino Leonardo, но произведённая нами, в России.Заметно дешевле оригинала.Arduino Mini Та же Arduino Uno, но в другом форм-факторе.Компактная. Всего 30×18 мм.Из-за форм-фактора нельзя без ухищрений устанавливать платы расширения Arduino.
Предполагается соединение с дополнительными модулями проводами и/или через макетную плату.На плате нет USB-порта, поэтому прошивать нужно через отдельный USB-Serial адаптер.Iskra Mini Та же Arduino Mini, но произведённая нами, в России.Заметно дешевле оригинала.
Есть в варианте с распаянными колодками и с незапаянными отверстиями.Arduino Micro Та же Arduino Leonardo, но в другом форм-факторе.Компактная. Всего 48×18 мм.Из-за форм-фактора нельзя без ухищрений устанавливать платы расширения Arduino. Предполагается соединение с дополнительными модулями проводами и/или через макетную плату.
Arduino Mega Как Arduino Uno, но на базе более мощного микроконтроллера той же архитектуры. Отличный выбор «на вырост» или если Arduino Uno перестала справляться.В разы больше памяти: 256 КБ постоянной и 8 КБ оперативной. В разы больше портов: 60 из них 16 аналоговых и 15 с ШИМ.
Немного длиннее базовой Arduino Uno: 101×53 мм против 69×53 мм.Arduino Due Одна из самых производительных плат от Arduino на микроконтроллере Cortex-M3 по форм-фактору аналогичная Arduino Mega.Процессор на 84 МГц и 512 КБ памяти. 66 пинов ввода-вывода, из которых 12 могут быть аналоговыми входами, 12 поддерживают ШИМ и все 66 могут быть настроены, как аппаратные прерывания.
Встроенный контроллер шины CAN позволяет создавать сеть из Due или взаимодействовать с автомобильной электроникой. Два канала ЦАП позволяют синтезировать стереозвук с разрешением в 4,88 Гц.Родным напряжением для платы является 3,3 В, а не традиционные 5 В.
Необходимо следить, чтобы выбираемая периферия поддерживала работу с этим уровнем или ставить преобразователи уровней напряжения.Iskra JS Плата на ядре Espruino: её программируют на JavaScript.JavaScript — язык высокого уровня. Программы писать проще, они компактнее и выразительнее.
Особенно если речь идёт о многочисленных строковых операциях, массивах данных, веб-интерфейсе.Мощный микроконтроллер Cortex M4 на 168 МГц, 1 МБ флеш, 192 КБ оперативной памяти, десятки портов с ШИМ и аналоговых входов, 2 аналоговых выхода, по нескольку I²C, SPI, UART — всё это даёт подключить и одновременно работать с самыми разнообразными сенсорами и модулями.
Несмотря на то, что родной уровень для платы — 3,3 вольта, пины толерантны к 5 вольтам: подключение пятивольтовой периферии тривиально.Из-за другой среды и экосистемы для программирования, может не существовать готовой библиотеки для выбранной периферии.
Её придётся реализовать самостоятельно.Strela Робототехническая платформа «всё в одном» содержит в себе большинство тех вещей, которые нужны при создании любого лёгкого мобильного робота. Strela, как и любая другая Arduino, программируется из Arduino IDE, а в основе содержит тот же микроконтроллер, что и Arduino Leonardo.
Встроенный драйвер для двух двигателей, 4 разъёма для сервоприводов, 4 кнопки и 4 светодиода свободного назначения, зуммер, слоты для ЖК-экрана и модуля беспроводной связи.Мощный регулятор питания позволяет без ухищрений использовать множество различных аккумуляторов.
11 входов-выходов выведены в виде 3-контактных разъёмов для лёгкого подключения дополнительных датчиков и модулей. ЖК-экран, кнопки и светодиоды подключены через расширитель портов, поэтому они не занимают входы-выходы общего назначения.На плате не предусмотрены колодки для установки плат расширения Arduino.
Из-за изменённой нумерации контактов (в сравнении с базовой Arduino Leonardo), необходимо использовать немного другие функции для работы с пинами платы. Они предоставлены в одноимённой библиотеке.Arduino Yún Уникальный гибрид Arduino Leonardo и микрокомпьютера на OpenWRT Linux.
Отличный выбор для «интернета вещей».Плата оснащена Ethernet и WiFi, через которые можно общаться с устройством и даже перепрошивать платформу удалённо.Мощь Linux позволяет работать с мультимедиа, а его сетевые возможности легко интегрироваться с социальными сетями и другими веб-сервисами.
OpenWRT — это порезанный Linux. На микрокомпьютере можно установить не любой Linux-софт. А в качестве скриптовых языков программирования из коробки можно использовать только Bash и Python.STM32 Nucleo F401RE Плата с мощным микроконтроллером Cortex-M4.
Платформа программируется не через Arduino IDE, а через онлайн-среду mbed.org. Субъективно, она мощнее и стройнее Arduino IDE, хотя и не так распространена. Для пытливого ума — отличный выбор.Процессор на 84 МГц, 512 КБ постоянной и 96 КБ оперативной памяти.
50 портов ввода-вывода, из которых 16 аналоговых и 29 с ШИМ. Родной уровень напряжения — 3,3 В, но все пины толерантны к 5 В, поэтому проблем электронной совместимости с Arduino-периферией возникнуть не должно.Колодки для плат расширения по конфигурации совпадают с Arduino Uno, поэтому на Nucleo можно поставить множество плат расширения от Arduino.
На плате не выведен отдельный SPI-разъём. Платы расширения Arduino, которые используют SPI через ICSP-разъём без ухищрений не будут работать.Из-за другой среды и экосистемы для программирования, может не существовать готовой библиотеки для выбранной периферии.
Её придётся реализовать самостоятельно.Teensy 3.2 Компактная плата с мощным микроконтроллером Cortex-M4. Программируется из привычной Arduino IDE.Меньше Arduino Micro (35×17 мм), но почти столь же мощная, как Nucleo: процессор 72 МГц, 256 КБ постоянной и 64 КБ оперативной памяти, 34 порта ввода-вывода, из которых 21 могут быть аналоговыми, а 12 поддерживают ШИМ.Teensy 3.
1 очень энергоэффективна. У неё нет регулятора напряжения, но входным может являться любое от 3,3 до 5,5 В. Это же напряжение и будет логическим уровнем. В режиме сна плата потребляет всего 0,25 мА, что даёт возможность работать от аккумулятора несколько месяцев.
Встроенный контроллер шины CAN позволяет создавать сеть из Due или взаимодействовать с автомобильной электроникой. Два канала ЦАП позволяют синтезировать стереозвук с разрешением в 4,88 Гц.Плата поставляется с нераспаянными контактами. Вам предстоит самостоятельно впаять штырьковые соединители или проводки.
Из-за большой разницы в архитектуре с классическим Arduino не все библиотеки для сторонней периферии могут работать из коробки.Рабочее напряжение равно входному, а поэтому плывёт по мере разряда батарейки. Это может оказаться важным при выборе периферии, если она рассчитана на какой-то конкретный вольтаж.
Netduino 2 Плата повторяет форм-фактором Arduino Uno, но имеет мощную начинку, достаточную для исполнения программ, написанных на платформе .NET. Netduino программируется на C# или любом другом .NET-языке в привычной любому .NET-разработчику среде Visual Studio.
В качестве стандартной библиотеки предоставляется .NET Micro Framework.В Visual Studio работает автодополнение, подсказки, контекстная помощь в MSDN и полноценный отладчик. Вам доступны breakpoint’ы, пошаговое исполнение кода, наблюдение за переменными.
Отладка происходит без ухищрений, просто с подключённым USB-кабелем. Благодаря всему этому, скорость разработки под Netduino в разы превосходит скорость разработки под любую другую платформу.На плате не выведен отдельный SPI-разъём. Платы расширения Arduino, которые используют SPI через ICSP-разъём без ухищрений не будут работать.
Из-за другой среды и экосистемы для программирования, может не существовать готовой библиотеки для выбранной периферии. Её придётся реализовать самостоятельно.Netduino Plus 2 Как Netduino, только мощнее и с Ethernet на борту. Отличный выбор для реализации проектов интернета вещей.Те же, что и у Netduino 2.






