Мини-компьютер на базе микроконтроллера Parallax Propeller. Бортовой компьютер на AVR микроконтроллере

04.05.2019

Микроконтроллер фирмы Parallax под названием Propeller , в сравнении с «классикой» жанра типа PIC или AVR занимает несколько странную нишу. Про первые два можно сказать, что это архитектуры общего назначения. Создатели же Пропеллера подошли к вопросу «с фланга».

Основные отличительные особенности Пропеллера:

  • 8 независимых ядер, работающих параллельно. Какое-либо разделение времени, необходимое для общих ресурсов типа памяти или портов ввода-вывода не контролируется программистом и «вшито» в кристалл. Это дает предсказуемость во времени выполнения кода. Каждое ядро (cog) имеет 4КБ собственной изолированной оперативной памяти. Также каждое ядро имеет встроенный аппаратный модуль для генерации (внимание!) ТВ или VGA видео-сигнала.
  • Нет понятия прерываний. Вместо это предлагается запускать конкурирующие задачи разных ядрах (cog"ах).
  • Программировать можно либо на ассемблере, либо на особом высокоуровневом языке Spin, который сильно упрощает многоядерное и параллельное программирование. Интерпретатор Spin зашит в кристалл.
  • Почти нет понятия программации или прошивки кристалла. Верхняя половина адресного (ROM) пространства размером в 32КБ прошита интерпретатором Spin и разными системными таблицами. В этом случае при каждом включении требуется загрузка программы извне (например, из среды разработки) в нижнюю область 32КБ (RAM). Но обычно в реальном использовании подключается внешняя I2C микросхема памяти EEPROM, содержимое которой автоматически копируется в RAM при включении кристалла.
  • Процессор заявлен как 32-х битный, так как оперирует со данными этого размера, но адресное пространство 16-и битное (64КБ).
Язык Spin разработан для удобного многопроцессорного программирования, и выглядит как нечто среднее между процедурным и объектно-ориентированным языком.

Вот пример кода на Spin, запускающего функцию крутиться на нескольких ядрах. Код реально простой и понятный.

CON _clkmode = xtal1 + pll16x "Establish speed _xinfreq = 5_000_000 "80Mhz OBJ led: "E555_LEDEngine.spin" "Include LED methods object VAR byte Counter "Establish Counter Variable long stack "Establish working space PUB Main cognew(Twinkle(16,clkfreq/50), @stack) "start Twinkle cog 1 cognew(Twinkle(19,clkfreq/150), @stack) "start Twinkle cog 2 cognew(Twinkle(22,clkfreq/100), @stack) "start Twinkle cog 3 PUB Twinkle(PIN,RATE) "Method declaration repeat "Initiate a master loop repeat Counter from 0 to 100 "Repeat loop Counter led.LEDBrightness(Counter, PIN) "Adjust LED brightness waitcnt(RATE + cnt) "Wait a moment repeat Counter from 100 to 0 "Repeat loop Counter led.LEDBrightness(Counter,PIN) "Adjust LED brightness waitcnt(RATE + cnt) "Wait a moment
Функция cognew запускает задачу на трех ядрах, параметризируя каждую своей частотой и стеком.

Упрощенно Пропеллер устроен следующим образом:

Название «Пропеллер» произошло от его модели передачи приоритета на доступ к разделяемым ресурсам. Модуль Hub, контролирующий разделение времени, делает это по кругу, типа крутящегося пропеллера.

Я не хочу в этой статье углубляется в сам Пропеллер, ибо это большая тема. Для интересующихся в конце есть ссылки на книги, в которых можно получить исчерпывающую информацию об этом микроконтроллере.

Но хочу рассказать об одном интересном проекте, который называется "Pocket Mini Computer ". Это мини-компьютер на базе Пропеллера (P8X32A), использующий evaluation board «P8X32A QuickStart» как основу.

Выглядит это добро следующим образом (фотография с официального сайта):

Фактически, автор продает evaluation board плюс плату расширения, на которой есть VGA, microSD, PS/2, звук и Wii Gameport. Опционально можно поставить микросхему оперативки SRAM на 32КБ.

Фишка проекта в том, что автор разработал интерпретатор Бейсика, который превращает все это в микро-компьютер а-ля 80-е. Бейсик написан на Spin"e (исходники открыты). Диалект весьма ограничен, например, нет массивов, строковых и вещественных переменных, имена переменных только однобуквенные и т.д. Но тем не менее, дается доступ ко всей периферии, включая SD-карту, и также позволяет запускать чисто двоичные файлы, которые могут быть написаны хоть на том же Spin"e, хоть на С (Parallax имеет версию GCC для Пропеллера), хоть на ассемблере.

Почти все запаяно.

Бутерброд в сборе.

Вот небольшая демка, чтобы оценить графические возможности.

Общие впечатления

Пропеллер

Не получается назвать его процессором общего назначения. По моему субъективному мнению, для эффективного использования Пропеллера надо очень хорошо понимать свою прикладную задачу. Например, у Пропеллера нет ШИМ, ЦАП/АПЦ, встроенной флеш-памяти, триггеров, понятия прерываний, и создатели предлагают либо реализовывать необходимое программно, используя силу нескольких ядер, либо использовать специализированные внешние микросхемы. В книгах, приведенных в конце, описано множество примеров работы с дополнительными микросхемами.

Интересно другое. Создатели Пропеллера не забоялись отойти от традиционного подхода и попытались вложить в кристалл конкретные прикладные возможности, почти готовые задачи. Может для каких-то проектов это придется очень кстати. Как я понял, Пропеллер очень удобен для создания разного рода игровых автоматов и приставок, например, из-за встроенной возможности генерировать качественный телевизионный и VGA сигнал.

Вывод : интересная архитектура, определенно заслуживающая внимания.

Конструктор PMC

Опять-таки, двоякое ощущение. Вроде работает, но ресурсов Бейсику явно не хватает, особенно памяти. Например, тот же Maximite на базе PIC32 его на голову превосходит. На нем можно запустить хоть RetroBSD , хоть Радио-86РК . Да и встроенный MMBasic несравнимо мощнее.

Хотя, за 39 долларов США - это отличная игрушка для тех, кто хочет пощупать Пропеллер, имея уже собранное устройство.

На закуску

Книги по Пропеллеру, которые я прочитал, что касаемо архитектуры, и проглядел (что касаемо проектов). Все рекомендую.

Небольшая и очень понятная книга для начинающих. Описаны (с картинками) интересные проекты. Один из соавторов является конструктором PMC.

Getting Started With the Propeller

Крайне грамотная книга в плане архитектуры и понимания сути Пропеллера. В ней рассматривается только программирование на Spin, но с полным объяснением подходов и особенностей микроконтроллера. Прочитав первую главу, вы получите почти полное понимание архитектуры. Далее описаны несколько проектов (это можно пропустить).

В данной статье я опишу создание мною простого бортового компьютера для автомобиля или мотоцикла. Никаких экзотических функций устройство не содержит, но зато в нём есть часы, термометр и вольтметр. Основа, это AVR микроконтроллер ATmega8 с восьми килобайтами флеш память, этого нам как раз достаточно. Часы реализованы на специальной микросхеме (часов реального времени RTC) DS1307, это позволяет идти часам очень точно довольно длительное время, даже тогда когда устройство выключено. Но конечно для работы микросхемы DS1307 требуется дополнительное питание 3 вольта, например батарейка CR2032. Датчик для термометра взял DS1820 работающий по интерфейсу 1-Wire. Все данные выводятся на ЖК индикатор на контроллере . Итак, для сборки устройства понадобятся следующие радиодетали:

1. Микроконтроллер Atmega8 - 1шт.
2. Микросхема DS1307 - 1шт.
3. Датчик DS1820 - 1шт.
4. Панелька DIP-8 - 1шт.
5. Панелька DIP-28 - 1шт.
6. Микросхема LM7805 - 1шт.
7. Микросхема LM7809 - 1шт.
8. Тактовые кнопки - 4шт.
9. Кнопки с фиксацией положения - 2шт.
10. Кварц 14.3 МГц - 1шт.
11. Кварц часовой 32768 Гц - 1шт.
12. Конденсатор керамический 22 пф - 2шт.
13. Конденсатор керамический 100 нф - 4шт.
14. Транзистор КТ315 - 2шт.
15. Конденсатор электролитический 100 мкф - 1шт.
16. Конденсатор электролитический 47 мкф - 2шт.
17. Диод 1N4001 - 1шт.
18. Подстроечный резистор 20 кОм - 2шт.
19. Резистор 1 кОм - 2шт.
20. Резистор 10 кОм - 2шт.
21. Резистор 4,7 кОм - 3шт.
22. Резистор 100 кОм - 1шт.
23. Резистор 20 Ом - 1шт.
24. Резистор 68 Ом - 1шт.
25. Динамик 0.2 Вт - 1шт.
26. ЖК индикатор WH1602 (на контроллере HD44780 или совместимом) - 1шт.
27. Текстолит - 1шт.
28. Корпус пластиковый - 1шт.
29. Отсек для батареек 2xAA - 1шт.
30. Батарея 1.5v AA - 2шт.

Принципиальная схема устройства:

Подстроечный резистор R4 устанавливает контрастность ЖК индикатора, а R12 подстраивает вольтметр до точного значения. Кварц Z2 на 14.3 МГц, его можно найти на старых материнских платах. Кнопка S1 - "Отмена", S2 - "Вниз", S3 - "Ок", S4 - "Вверх". Резистор R3 подтягивает Reset микроконтроллера к плюсу питания чтобы предотвратить случайный сброс. Резисторы R1, R2 и R7 также подтягивают порты микроконтроллера к плюсу питания. Керамические конденсаторы C1 и C2 нужны для стабильной работы кварца Z2. Я собрал устройство на двух печатных платах, на одной содержатся микросхемы LM7805 и LM7809, на другой, всё остальное. Платы рисовал в программе и изготавливал с помощью . Вот готовая плата покрытая сплавом розе:

Плата с запаянными на ней деталями:

С обратной стороны:

Все потроха собрал в корпус, в итоге получилось красиво и компактно.

Фото готового бортового компьютера (вид спереди):

Фото готового бортового компьютера (вид сзади):

Для удобства, спереди я разместил только ЖК индикатор и кнопки управления S1, S2, S3 и S4. Разъём, кнопки включения устройства и выключения звука, подстроечный резистор R12 я разместил сзади корпуса. Прошивку для микроконтроллера писал в среде (исходник прилагается), микроконтроллер прошивал программатором USBtiny с помощью программы SinaProg. После прошивки микроконтроллера нужно установить следующие фьюз-биты:

Правильно собранное и прошитое устройство запускается сразу, и не требует настройки, разве что, точной подстройки вольтметра и настройки часов. Из дополнительный функций присутствует регулировка яркости ЖКИ и часовой бипер (часы подают сигнал в начале каждого часа). При включении устройства на ЖКИ появляется заставка и плавно загорается подсветка индикатора, потом появляется главный экран, где отображается время, дата, температура и напряжение. Если в это время нажать кнопку S3 то вы войдёте в меню настройки времени, S2 - в информационную вкладку, где написана информация о версии устройства и его авторе, S4 - в меню настройки яркости ЖКИ и управления часовым бипером. Кнопка S1 возвращает обратно, на главный экран. Наглядно посмотреть, как управлять устройством вы можете на видео:

В файлах к статье есть исходники программы, прошивка, проект в программе .

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 Часы реального времени (RTC)

DS1307

1 В блокнот
IC2 МК AVR 8-бит

ATmega8

1 В блокнот
VR1 Линейный регулятор

LM7805CT

1 В блокнот
VR2 Линейный регулятор

LM78L09

1 В блокнот
VT1, VT2 Биполярный транзистор

КТ315Б

2 В блокнот
VD1 Выпрямительный диод

1N4001

1 В блокнот
Z1 Кварц 32768 Гц 1 В блокнот
Z2 Кварц 14.3 МГц 1 В блокнот
C1, C2 Конденсатор 22 пФ 2 Керамические В блокнот
C3-C5, C8 Конденсатор 100 нФ 4 Керамические В блокнот
C6, C7 47мкФ 16В 2 В блокнот
C9 Электролитический конденсатор 100мкФ 35В 1 В блокнот
R1, R2, R7 Резистор

4.7 кОм

3 В блокнот
R3, R10 Резистор

10 кОм

2 В блокнот
R4, R12 Подстроечный резистор 20 кОм 2 В блокнот
R5 Резистор

20 Ом

1 В блокнот
R6, R9 Резистор

1 кОм

2 В блокнот
R8 Резистор
Микроконтроллер - компьютер на одной микросхеме. Предназначен для управления различными электронными устройствами и осуществления взаимодействия между ними в соответствии с заложенной в микроконтроллер программой. В отличие от микропроцессоров, используемых в персональных компьютерах, микроконтроллеры содержат встроенные дополнительные устройства. Эти устройства выполняют свои задачи под управлением микропроцессорного ядра микроконтроллера.

К наиболее распространенным встроенным устройствам относятся устройства памяти и порты ввода/вывода (I/O), интерфейсы связи, таймеры, системные часы. Устройства памяти включают оперативную память (RAM), постоянные запоминающие устройства (ROM), перепрограммируемую ROM (EPROM), электрически перепрограммируемую ROM (EEPROM). Таймеры включают и часы реального времени, и таймеры прерываний. Средства I/O включают последовательные порты связи, параллельные порты (I/O линии), аналого-цифровые преобразователи (A/D), цифроаналоговые преобразователи (D/A), драйверы жидкокристаллического дисплея (LCD) или драйверы вакуумного флуоресцентного дисплея (VFD). Встроенные устройства обладают повышенной надежностью, поскольку они не требуют никаких внешних электрических цепей.

В отличие от микроконтроллера контроллером обычно называют плату, построенную на основе микроконтроллера, но достаточно часто при использовании понятия "микроконтроллер" применяют сокращенное название этого устройства, отбрасывая приставку "микро" для простоты. Также при упоминании микроконтроллеров можно встретить слова "чип" или "микрочип", "кристалл" (большинство микроконтроллеров изготавливают на едином кристалле кремния), сокращения МК или от английского microcontroller - MC.

Микроконтроллеры можно встретить в огромном количестве современных промышленных и бытовых приборов: станках, автомобилях, телефонах, телевизорах, холодильниках, стиральных машинах... и даже кофеварках. Среди производителей микроконтроллеров можно назвать Intel, Motorola, Hitachi, Microchip, Atmel, Philips, Texas Instruments, Infineon Technologies (бывшая Siemens Semiconductor Group) и многих других.
Для производства современных микросхем требуются сверхчистые помещения.

Основным классификационным признаком микроконтроллеров является разрядность данных, обрабатываемых арифметико-логическим устройством (АЛУ). По этому признаку они делятся на 4-, 8-, 16-, 32- и 64-разрядные. Сегодня наибольшая доля мирового рынка микроконтроллеров принадлежит восьмиразрядным устройствам (около 50 % в стоимостном выражении). За ними следуют 16-разрядные и DSP-микроконтроллеры (DSP - Digital Signal Processor - цифровой сигнальный процессор), ориентированные на использование в системах обработки сигналов (каждая из групп занимает примерно по 20 % рынка). Внутри каждой группы микроконтроллеры делятся на CISC- и RISC-устройства. Наиболее многочисленной группой являются CISC-микроконтроллеры, но в последние годы среди новых чипов наметилась явная тенденция роста доли RISC-архитектуры.

Тактовая частота, или, более точно, скорость шины, определяет, сколько вычислений может быть выполнено за единицу времени. В основном производительность микроконтроллера и потребляемая им мощность увеличиваются с повышением тактовой частоты. Производительность микроконтроллера измеряют в MIPS (Million Instruсtions per Second - миллион инструкций в секунду).

8 апреля 2015 в 12:32

Передача данных из компьютера в микроконтроллер через монитор

  • DIY или Сделай сам

Увидев о том, как один человек использовал клавиатуру в качестве программатора AVR-микроконтроллеров, я воскликнул: «Да он безумец!». А потом подумал, а чем же я хуже?.. И решил написать эту статейку о безумном способе передачи информации из ПК в микроконтроллер.

Вся суть состоит в том, что на экран выводятся квадраты, которые могут быть окрашены в белый, либо чёрный цвет, то есть иметь два состояния. Как биты. И их восемь штук. Как байт.

Чем отличается чёрный цвет от белого? Забавно, но не цветом, а яркостью, интенсивностью света. Интенсивность белого много больше интенсивности чёрного. В качестве регистратора интенсивности я использовал самое простое специально предназначенное для этого устройство - фоторезистор. Фоторезисторами называют полупроводниковые приборы, проводимость которых меняется под действием света. В моём случае проводимость затемнённого фоторезистора много меньше проводимости освещённого. Подключение фоторезистора к микроконтроллеру выбрал самое простое - между пином и землёй, включив встроенную подтяжку к питанию. Проверил напряжение, которое получает АЦП МК ATMega8: слева фоторезистор смотрит на белый фон, справа на чёрный. Напряжение в вольтах.

Да, да - Arduino IDE. Потому-что там я могу быстро набросать код и сразу залить его в плату нажатием одной кнопки, использовать обкатанные и растолкованные до безумия библиотеки.

Как видно, при считывании в цифровом режиме, мы получим 0 на белом и 1 на чёрном, что несколько идёт в разрез с моими шаблонами (чёрный ноль и белая единица), зададим чёрную единицу в программе на ПК.

Для вывода информации на монитор в необходимом нам представлении была написана простая программа на Си - Opto_Байт. Написал её по моей просьбе сосед по общежитию - kinetik161, за что ему большое спасибо и литр пива молока. Программа имеет ввод значения в десятичной системе счисления от 0 до 255 ((2^8)-1) через поле ввода и через текстовый файл TEXT.txt. Текстовый файл располагается в том же каталоге, что и исполняемый файл, каждое значение вводится с новой строки, при достижении конца списка вывод значений останавливается. Интервал - 1 секунда. Имеется кнопка инверсии.

Использовал микроконтроллер ATMega8, который в DIP28 корпусе имеет два полноценных (8 битных) порта - порт B и порт D. На порте B висит кварцевый резонатор, на D - UART. В итоге, я использовал безумную солянку портов, из которых потом составлял один байт. Подключение фоторезисторов от старшего разряда к младшему, слева направо: PC3, PC2, PC1, PC0, PB2, PB1, PB0, PD7.

Быстренько собрал всё на макетной плате и окончательно проверив работу с отправкой данных обратно по com-порту, я решил подключить знакосинтезирующий ЖК экран для вывода информации. Прилагаю код для Arduino IDE.

Код прошивки МК

#include // Подключаем библиотеки #include LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE); // Настройка подключения дисплея(есть разные) int led = 2; // Указываем пин светодиода byte data = 0; // Полученный байт byte dataold = 170; // Предыдущий байт byte k=0; // Переменная для красивого форматирования байта на LCD void setup() { lcd.begin (16,2); // Инициализация экрана lcd.setBacklight(1); // Включить подсветку lcd.print("Hello, Geektimes"); // Приветствие lcd.setCursor(2, 1); // Сдвиг курсора lcd.print("from NikitosZs"); // Serial.begin(9600); // Инициализация UART DDRC = DDRC & 0b11110000; // Задаём порты ввода/вывода DDRB = DDRB & 0b11111000; DDRD = DDRD & 0b01111111; PORTC = PORTC | 0b00001111; // Включаем подтяжку фоторезисторов PORTB = PORTB | 0b00000111; PORTD = PORTD | 0b10000000; pinMode(led, OUTPUT); // Индикатор приветствия digitalWrite(led, 1); delay(2000); // Держим приветствие на экране lcd.clear(); // Очищаем экран digitalWrite(led, 0); // Индикатор приветствия выключен } void loop() { data = get(); // Присваиваем переменной data текущий байт if(data!=dataold) // Перерисовываем информацию на экране, если байт изменился { // Serial.println(data); // Отправляем байт в терминал lcd.setCursor(1, 0); lcd.print("DEC:"); lcd.setCursor(6, 0); lcd.print(" "); // Очищаем локальную область lcd.setCursor(6, 0); lcd.print(data); lcd.setCursor(1, 1); lcd.print("BIN:"); lcd.setCursor(6, 1); lcd.print("00000000"); // Создаём правильную подложку if(data>127) k=0; // Определяем старший бит для сдвига else if(data>63) k=1; else if(data>31) k=2; else if(data>15) k=3; else if(data>7) k=4; else if(data>3) k=5; else if(data>1) k=6; else k=7; lcd.setCursor(6+k, 1); lcd.print(data, BIN); dataold=data; // Присваеваем значение байта переменной хранящей предыдущее значение } } byte get(){ byte raw=1, rawold=0; // Локальные переменные raw и rawold while(raw != rawold) // Выполняется, пока не равны (для устойчивости значения) { rawold = raw; // Сохраняем старое значение byte data1 = 0b10000000 & PIND; // Считываем солянку из пинов byte data2 = 0b00000111 & PINB; byte data3 = 0b00001111 & PINC; raw = data3 << 4; // Сдвигаем, создаём целый байт raw = raw + (data2 << 1); raw = raw + (data1 >> 7); } return raw; // Возвращаем готовый байт }


Выполним проверку правильной адресации фоторезисторов с битами, закрывая источник света пальцем. Должно получиться следующее:

И так-как всё получилось, то можно прислонять макетную плату с фоторезисторами к экрану компьютера. Длинноногие фоторезисторы, воткнутые в макетную плату, нехотя, но всё же согласились никуда не убегать на время съёмки видео, хотя позиционировать их было не очень просто.

Теперь немного занудства… По сути монитор это управляемый транспарант (матрица световых вентилей, возбуждаемых некоторыми внешними сигналами: электрическими, акустическими, оптическими, магнитными). Каждый квадратик - бит - занимает площадь 60*60 пикселей (50 - сторона квадрата и 10 - промежуток). Я имею монитор с разрешением 1920*1080 пикс, частота 60Гц. 1920/60=32 квадрата по ширине, 1080/60=18 квадратов по высоте, 32*18=576 бит на кадр. Не вдаваясь в тонкости, в секунду мы сможем рисовать 60 кадров, а это 576*60=34560 бит/с или 4320 Байта/с. Сократив размер квадратов до 30 пикселей по стороне, получим четырёхкратный прирост скорости (17280Б/с). К сожалению, если уменьшать дальше, то наши каналы будут засвечивать друг друга.

Конечно же я не собираюсь использовать этот оптоэлектронный канал связи, так-как есть куда более удобные, быстрые и менее затратные способы коммуникации, не занимающие рабочее место на мониторе. Однако, не стоит забывать, что самые обыденные вещи можно использовать совсем непривычным для нас способом.

Похожие статьи