Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Модное кулинарное Шоу! Игра в ресторан, приготовление блюд, декорирование домов и преображение внешности героев.

Кулинарные истории

Казуальные, Новеллы, Симуляторы

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Микроконтроллеры + Программирование

С этим тегом используют

Электроника Arduino Своими руками Stm32 Самоделки Радиолюбители IT Программист IT юмор Разработка Python Картинка с текстом Юмор Все
110 постов сначала свежее
128
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?⁠⁠

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!

❯ Как это работает?


Думаю, для многих моих читателей реализация процесса загрузки exe-программ и dll-библиотек в память процесса оставалась эдаким чёрным ящиком, в детали реализации которого вдаваться не нужно. Отчасти это так и есть: современные ОС разруливают процесс загрузки бинарников в память сами, не требуя от программиста вообще ничего, даже понимания того, куда будет загружена его библиотека или программа.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост




Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:

1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.

2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).

3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Где по итогу:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.

И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.

А ведь чаще всего нужно просто загрузить небольшую программу, которой не нужны комплексные загрузчики: немного кода, немного данных и всё. И тут у нас есть три выхода:

  1. Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.

  2. Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.

    Проблемы реализации такого способа: иногда нужно лезть в систему сборки основной прошивки и патчить скрипт линкера так, чтобы он не трогал определенный регион памяти. В случае esp32, например, это требует патча в сам SDK и возможного «откола» от мейнлайн дистрибутива.

  3. Использовать программу с относительной адресацией, однако без сегментов .bss и .data. Самый простой в реализации способ, который к тому же очень экономичен к памяти, позволяет загружать программу в любое место и пользоваться всеми фишками динамического аллокатора и не требует вмешательств в основную прошивку, кроме примитивного загрузчика программ. Именно его я и предлагаю рассмотреть подробнее.


Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!

Однако в таком подходе есть несколько серьезных ограничений:

  • Отсутствие глобальных переменных может стать проблемой при портированиии уже существующего софта, хотя вашим программам ничего не мешает передавать в каждую функцию структуру с глобальным стейтом, который можно при необходимости изменять. Кроме того, нет ограничений на использование C++ (за исключением необходимости ручной реализации new/delete и отсутствием исключений).

  • Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).


Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!

❯ Практическая реализация


Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!

Заголовок нашего бинарника будет выглядеть вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Программа общается с основной прошивкой посредством псевдо-syscall'ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall'ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Собираем нашу программу:

xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,--section-start=.text=0x0

xtensa-esp32-elf-objcopy.exe --only-section=.text --output-target binary a.out run.bin

-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. --section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.

Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.

По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:

  1. Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.

  2. Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.


Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000

Для заливки программы можно использовать соответствующее Partition API, либо parttool.py:

parttool.py --port "COM41" write_partition --partition-name=executable --input "run.bin"

Переходим к загрузчику программы:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Прошиваем ESP32:

idf.py build

idf.py flash

idf.py monitor

И смотрим результат:

SysCall 25

SysCall 35

SysCall 15

Всё работает!

❯ Заключение


Как видите, ничего сложного в выполнении сторонних программ при условии соблюдении некоторых ограничений нет. Да, в таком подходе есть как серьезные плюсы, так и минусы, однако он делает своё дело и позволяет реализовать запуск игр на кастомных игровых консолях, или сторонних программ на самодельных компьютерах. Ну и конечно же не стоит забывать про плагины! Авось в вашем решении нужна возможность расширения функционала устройства, однако предоставлять исходный код или даже объектные файлы нет возможности — тогда вам может пригодится и такая методика.

Пожалуй, стоит упомянуть ещё один… очень своеобразный метод, который я иногда встречаю при реализации самодельных компьютеров. Люди пишут… эмуляторы 6502/Z80 :)
И если такой подход ещё +- применим к ESP32, то в AVR просадки производительности будут слишком серьезными. Так зачем, если можно использовать все возможности ядра на максимум?

Полезный материал?
Всего голосов:
Приходилось ли загружать сторонний код в ваших устройствах?
Всего голосов:
Показать полностью 9 2
[моё] Опрос Гаджеты Программирование C++ Avr Arduino Esp32 Embedded Своими руками Самоделки Esp8266 Assembler Железо Микроконтроллеры Длиннопост
12
122
Vladislav98759
Vladislav98759
1 год назад
Сообщество Ремонтёров

Как я программатор мастерил⁠⁠

Давненько я не публиковал ничего интересного, так что будем это исправлять. Сегодня я расскажу про процесс разработки программатора для калибровки магнитных датчиков угла на макбуках, так же известных как Lid Angle Sensor.

Как я программатор мастерил Apple, Программирование, Ремонт ноутбуков, Ремонт техники, Я у мамы инженер, Macbook, Микроконтроллеры, Видео, Вертикальное видео, Длиннопост

Пару недель назад некая мастерская в Германии открыла предзаказ на устройство nerd.tool.1 для калибровки этих самых датчиков, стоимостью всего в каких-то 169 EUR. При этом программатор состоит из контроллера ESP32, платы и трех разъёмов для подключения. После этой замечательной новости я спросил себя: "А чем собственно я хуже?" И решил запилить собственную версию данного девайса из подручных материалов.

Как я программатор мастерил Apple, Программирование, Ремонт ноутбуков, Ремонт техники, Я у мамы инженер, Macbook, Микроконтроллеры, Видео, Вертикальное видео, Длиннопост

Начнем с того, что такое эти датчики и с чем их едят.
На данный момент Эпл использует 2 разных решения для распознавания положения крышки. В первом случае они используют простые датчики, которые при приближении магнита в крышке к правильному месту на корпусе просто сажают логический уровень на землю. Во втором же случае распознавание текущего положения реализовано с помощью магнитного датчика угла на петле крышки и магнита, расположенного на ответной части. Соответственно второй тип датчика уже гораздо умнее и точнее, если в первом случае ноутбуку доступна только информация закрыта крышка или открыта, то во втором процессор получает уже точную информацию о положении в градусах. Если ставить датчик с донорского устройства проблем обычно не возникает т.к. на заводе Эпл в него уже были записаны нужные калибровки и произведена защита от дальнейшей записи. Проблема возникает тогда, когда ничего не подозревающий ремонтник заказывает у китайцев шлейф с датчиком, а при его получении обнаруживает что тот не работает. И дело не в том, что ему прислали нерабочий датчик, а в том, что этот датчик не откалиброван (Не будем задаваться лишними вопросами, такими как откуда китайцы берут новые шлейфа с датчиками) и попросту не знает как именно он должен работать. На этом введение в особенности датчиков закончено, приступим непосредственно к разработке.

Как я программатор мастерил Apple, Программирование, Ремонт ноутбуков, Ремонт техники, Я у мамы инженер, Macbook, Микроконтроллеры, Видео, Вертикальное видео, Длиннопост

Упоминание производителя этих датчиков уже проскакивало в инженерных чатах, поэтому найти даташит на похожую модель не составило большого труда. Оставалось только собрать всё в кучу. Сперва я варварски отпилил кусок платы с разъёмом от A2141, а затем присандалил на этот огрызок коннектор симлотка c 11 айфона, который по счастливому совпадению является тем же самым разъёмом, что используется на macbook air m2 A2681. После чего я зафиксировал плату с коннекторами на завалявшемся у меня контроллере Node MCU V3 и соединил стандартные SPI линии от контроллера до коннекторов. С распиновкой коннектора на Air пришлось повозиться, так как схемы на него у меня нет, но по аналогии с известными линиями от Proшек нужные пины были найдены путём прозвонки. На этом вся работа с железной частью была завершена, оставалось самое сложное и интересное - код. Сложное для меня, так как я ничего не смыслю в программировании микроконтроллеров, для тех, кто хорошо шарит в контроллерах всё покажется детскими играми. Исходя их сказанного выше для того, чтобы донести мои мысли до контроллера я воспользовался помощью Chat GPT. Инструмент крайне полезный, даже не представить страшно сколько времени он мне сэкономил, но при этом без доскональнейшей постановки конкретного вопроса пользы от него чуть больше чем никакой.

Сперва я разобрался в основах работы с SPI и все в общем и целом шло довольно гладко, пока я не наткнулся на проблему при записи одного из значений, отвечающего за установку направления вращения. Этот параметр просто не записывался в датчик, а без него невозможно было откалибровать сенсор для модели Air в виду особенности расположения датчика. Так как в имеющемся даташите я не нашел возможных причин появления этой проблемы это означало, что Эпл как всегда всё максимально усложняет. Судя по всему под себя они заказали другую модификацию с немного измененными параметрами. Попробовал написать производителю для получения дополнительной информации, но ожидаемо никакого ответа не получил. "Что ж, так еще интереснее" - подумал я и пошел пилить скрипт для брутфорса датчика чтобы понять как обойти защиту записи в этот конкретный регистр. И спустя какое-то время решение в виде записи определенного значения в определенный регистр было найдено. Хотелось бы конечно снять защиту от записи и с датчиков записанных Эпл, но к сожалению у меня пока ничего из этого не вышло (Да и скорее всего в принципе не выйдет, но поковырять в эту сторону еще стоит), так что имеем что имеем. Данный инструмент получил лишь возможность калибровать новые датчики, которые были скомунизжены у Эпл, но и это уже является большим успехом.


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

В итоге программатор имеет 3 режима работы: первый для записи моделей Pro (A2141, A2442, A2485, A2779, A2780), второй для Air (A2681) , третий же для визуализации текущих показаний с датчика. Так же перед записью программатор проверят подключен ли вообще датчик и если он подключен то можно ли вообще в него что-либо записать. Конечно можно было сделать автоматический выбор режима в зависимости от того, в какой разъём вставлен датчик, тогда был бы всего один режим для записи, но у меня уже были прокинуты все линии, так что переделывать было лень.

Как я программатор мастерил Apple, Программирование, Ремонт ноутбуков, Ремонт техники, Я у мамы инженер, Macbook, Микроконтроллеры, Видео, Вертикальное видео, Длиннопост

Статью со всей нужной для самостоятельной сборки информацией и видосом демонстрации работы сей приблуды вы можете найти в справочнике по ремонту всякого разного:
https://logi.wiki/index.php/Macbook_Lid_Angle_Sensor_Calibra...
Вообще крайне полезный ресурс для мастеров, который содержит много интересной и полезной информации по свежим машинам и не только, крайне рекомендую сохранить у себя в заметках.

На этом я с вами прощаюсь, спасибо всем кто дочитал до конца этот поток сознания. Задать вопрос или высказать своё фи вы можете в комментариях.


До новых встреч.

Показать полностью 4 1
[моё] Apple Программирование Ремонт ноутбуков Ремонт техники Я у мамы инженер Macbook Микроконтроллеры Видео Вертикальное видео Длиннопост
8
339
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х?⁠⁠

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



В наше время большинство портативных устройств работает на базе достаточно мощных микроконтроллеров, которые способны запускать даже интерпретируемый код на Lua/Python. Чего уж там говорить — даже современная кофеварка или умный электрочайник может быть в разы мощнее оригинального IBM-PC, не говоря уже о автомобильных бортовых компьютерах, которые зачастую мощнее топовых ПК из начала нулевых. Но давайте вспомним конец 90-х и начало 2000-х, когда разработка собственной электроники была практически недоступна рядовому пользователю, а микроконтроллеры программировались в основном только на ассемблере. Недавно я нашёл некоторую информацию о том, какой процессор вероятно использовался в таких знакомых нам приставках Brick Game, которые мы называли «Тетрисами»! Более того, мне удалось найти полный даташит с описанием всех модулей этого процессора, который гордо можно назвать «система на кристалле». Какой была разработка микроэлектроники в 90-х? Читайте в статье!

❯ Немного о «Тетрисе»


Пожалуй, Тетрис или Brick Game был одной из самых популярных портативных игровых консолей в странах СНГ. Появившись где-то в конце 90-х, этот гаджет быстро стал бестселлером среди детишек благодаря наличию сразу нескольких игр, полноценного ЖК-экрана, звука и невероятной дешевизны. Не знаю, сколько Тетрис стоил в момент выхода, но в нулевых цена на него была крайне низкой — около 100-200 рублей в зависимости от корпуса. Типичный школяр мог накопить на собственный Тетрис за несколько недель, что делало его самым доступным игровым девайсом на рынке.

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Конечно же, на рынке уже были различные консоли с гораздо более богатым функционалом — например GameBoy и даже GameBoy Color с цветным дисплеем, а люди, родившиеся в конце 90-х или начале 2000-х уже застали PlayStation Portable с реально крутой 3D-графикой и телефоны с хорошим игровым потенциалом — как, например, SE K500i. Однако цена на них была непозволительной роскошью для небогатых семей: PSP стоила 250$ (около 7-8 тысяч рублей по тому курсу), плюс каждый UMD-диск с игрой стоил около 1.000 рублей, GameBoy были относительно редкими в России, а телефоны — это всё же прерогатива более юных ребят, да и в нулевых далеко не всем перепадал крутой K500i — чаще всего покупали телефон попроще типа Siemens A55 (грузчика помним?) или Motorola C350 (а мотоциклиста?). Поэтому тетрисы оставались чуть ли не единственным средством развлечения у небогатых ребят.

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Ощутимым плюсом было и то, что Тетрис работал от батареек: они были не слишком дорогими в то время, а если носить с собой в кармане парочку, то можно не бояться, что консоль сядет в долгой дороге и продолжать себя забавлять, да и сам Тетрис работал довольно долго, мне хватало на неделю игры (может и меньше). Несмотря на низкое разрешением всего в 10x20 пикселей, Тетрис обладал достаточно большим монохромным дисплеем без подсветки, на котором было комфортно играть.
Ещё одним немаловажным плюсом консоли была возможность «кооперативной» игры и эдакого азарта: будучи неискушенными детьми, многие из нас пытались поставить рекорды и выбить как можно больший счёт в каждой из доступных игр. Чем больше счёт, тем ты круче среди друзей!

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Но что же у Тетриса «под капотом»? На чём он работал внутри? Недавно я нашёл информацию о том, что потенциально в Тетрисе могла использоваться 4х-битная система на чипеHoltek HT1130, которая использовалась в самой разной носимой электроники: от часов на батарейках, до полноценных игровых консолей. Причём я ничуть не преувеличиваю, это действительно SoC: уже в 90-х, тайваньская компания смогла объединить звуковой модуль, контроллер ЖК-дисплея, ввод/вывод и таймер в один чип! Однако тут важно понять, что 100% сказать, на чём работал Тетрис, нельзя — процессор спрятан под компаундом и у него нет корпуса с маркировкой, лишь «голый» кристалл. Тем не менее, мы можем предположить, что это был один из чипов Holtek и посмотреть, на чём же работала портативная электроника тех лет поближе!

Заранее прошу прощения за отсутствие нормальных фотографий. Под рукой у меня не оказалось «старого» Тетриса, а на новодельных показывать как-то не очень.

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



На данный чипсет есть «утёкший» в сеть даташит с полным описанием регистров микроконтроллера и его ТТХ. Чип был спроектирован так, чтобы не требовать практически никакой обвязки в виде конденсаторов/резисторов и других SMD-элементов — он работал фактически напрямую от пальчиковых батареек и его легко было развести на плате даже начинающему инженеру. Микроконтроллер стабильно оперировал при напряжении от 2.4в до 3.3в, что позволяло просто вставить две последовательно соединенные AA или AAA батарейки с напряжением 1.5-1.6в и получить необходимое питание для работы всей «приставки».

❯ Вычислительное ядро


Саму систему на кристалле можно разделить на несколько соединенных модулей в один чип. Основным, конечно же, является 4х-битное вычислительное ядро неизвестной архитектуры, которое компания Holtek разработала сама или лицензировала как IP-ядро у другой компании для использования в собственном чипе (как, например, MediaTek лицензирует у ARM ядра Cortex). Система команд, по крайней мере, описание мнемоник ассемблера в даташите наводят на мысли о некоторой схожести с микроконтроллером Intel 8051 (однако 8051 был 8-битным) и в целом, напоминают типичную интеловскую архитектуру из 80х. Однако только по мнемоникам точно определить архитектуру невозможно: здесь есть «проприетарные» команды типа SOUND и TIMER.

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост
Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост
Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост


Чип работает на частоте 1мгц от встроенного тактового генератора, большинство команд выполняется за один такт, максимум — два. Если говорить совсем грубо, то даже ATMega328 в Arduino условно в 16-раз мощнее HT1130, хотя это совсем некорректное сравнение.

Длина машинного слова HT1130 — 4 бита, что отсылает нас в начало 70х годов, если мы говорим о компьютерах. Это означает, что процессор «аппаратно» мог выполнять операции только с числами от 0 до 16, хотя при программной реализации мог пересчитывать хоть 32х-битные числа. Ширина шины данных — 12 бит, что позволяло адресовать вплоть до 4Кб встроенной ROM-памяти. Кроме того, в МК было встроено 128 ячеек оперативной памяти (или 64 байта), где в00H..7FHхранились временные данные программы (например, позиция танчиков на экране) и сE0H..FFHхранился «буфер» кадра, который определял текущую на экране. Также у микроконтроллера были следующие регистры:

  1. R0-R4 — регистры общего назначения. Пары из регистров используются для адресации памяти.

  2. ACC — регистр-аккумулятор, который хранит результаты текущей операции.

  3. PC — указатель на текущую инструкцию в ROM, которую выполняет процессор.

  4. Стековый регистр — судя по всему, «невидимая» связка регистров, которую процессор использует для хранения PC при вызове функций. Ограничен максимум двумя адресами, что не даёт возможность писать программы с вложенностью более двух функций.


С стековым регистром всё интересно получается. В отличии от привычных нам архитектур, HT1130 не хранит в этом регистре указатель на память, он сам по себе как-бы является стеком. Пример допустимого и недопустимого кода:

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост

Выбор 4х-битного процессора очевиден — они очень недорогие в производстве и достаточно простые. Примеры использования 4х-битных архитектур можно найти даже в советских играх: например, в игре «Волк и яйца» (клоне Nintendo Game & Watch) использовалась «микроЭВМ» КБ1013ВК1-2.
В встраиваемой и переносной электронике, 4х-битные вычислительные ядра продолжают использоваться и сейчас: в калькуляторах, в пультах для управления техникой, в часах. Связано это с простой и дешевизной подобных решений, да и если честно, реализация этих устройств была готова ещё в прошлом веке. Зачем дополнительно тратить деньги на R&D существующих решений? :)

❯ Графика


HT1130 специально разрабатывался для переносимых устройств с новомодными LCD-дисплеями. В те годы было нормой, когда на дисплейной матрице не было собственного контроллера с распространенным интерфейсом по типу 8080 или MIPI: частенько, драйвер дисплея либо выделялся в отдельный чип, либо реализовывался прямо в системе на кристалле. У Brick Game был дисплей разрешением в 10x20 пикселей, причём кастомизированный — с «захардкоженными» значками и сегментными индикаторами:

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Работа с дисплеем была не особо сложной: один сегмент памяти был отведен специально под эдакий «фреймбуфер» — всё, что мы записывали туда, контроллер дисплея моментально отображал на нашу ЖК-матрицу. Поскольку дисплей был одноцветным, без градаций цвета, память была организована 1 бит — 1 пиксель. Работать со всем этим было как-то так:

MOV A, 0 ; Первая часть адреса (если я не напутал endianness)

MOV R1, A

MOV A, 0b0111 ; Вторая часть адреса. Не удивляйтесь, что по факту получается 224 при 128 байт ОЗУ - часть адресного пространства была как-бы зарезервирована

MOV R0, A

MOV A, 1 ; Закрасим первый пиксель в строке

MOV [R1R0], A ; И запишем это значение в ОЗУ

Частичным доказательством того, что этот чип мог использоваться в Brick Game — это то, что компания Holtek производила готовые «игры на кристалле» — вероятно, уже запрограммированные с завода HT1130 с определенными играми:

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Примечательно, что даташит на готовые игры датируются ноябрём 1998 года, в то время как даташит на HT1130 — 1999. Если у вас появился Тетрис раньше этого времени — напишите пожалуйста в комментариях!

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост

❯ Звук


Помимо этого, чипсет имел собственный генератор звука, или как вы вероятно подумаете — «пищалку». В чип (или SDK, если честно, не особо понятно из даташита) была уже встроена звуковая библиотека — причём половину из них как раз таки для игр, что ещё раз косвенно подтверждает догадки об использовании этого чипа в «Тетрисе». Всего поддерживалось до 16 «каналов», в которых было по 3 тональности. В звуковой библиотеке содержались следующие звуки:

  • Шумы

  • Мелодии

  • Выстрелы

  • Будильники



Управлять звуковым трактом было очень просто — буквально несколькими командами на ассемблере. Команда SOUND <номер канала> выбирала один из предопределенных звуков (причем не совсем ясно, где они хранились — возможно в ROM), а команда SOUND ONE/LOOP воспроизводила его в одном из режимов — один раз или повторяющийся. SOUND OFF же выключала звук совсем. Как-то так:

play:

SOUND A

SOUND ONE

SOUND OFF

CLC ; А если нет, то снова выполняем, пока не переполнится, эта операция очищает флаг переноса

loop:

INC A ; Увеличиваем значение в аккумуляторе

JC play ; Если флаг переноса установлен, то наш "таймер" как-бы переполнился и пора снова проиграть звук

JMP loop;

Совсем немудрено, согласитесь? :)

❯ Порты ввода/вывода и кнопки


Кроме этого, HT1130 имел несколько портов ввода-вывода, которые, однако, назвать GPIO нельзя — было 12 портов для вывода, которые могли читать логический уровень (для кнопок), и 4 пина, который мог задавать логический уровень (например, управлять вибромотором или светодиодом). Настройки портов задавались с помощью флагов: можно было настроить встроенные pull-up резисторы и они могли вызывать прерывания при переходе из высокого уровня в низкий.

Процессор, который использовался в «Тетрисе»: на каких SoC работала недорогая микроэлектроника в 90-х? Гаджеты, Разработка, Тетрис, 90-е, Электроника, Китай, Девайс, Программирование, Микроконтроллеры, Ретро, Микроэлектроника, Embedded, Длиннопост



Выходной порт мог быть сконфигурирован под тип выхода — CMOS или NMOS. Работа с портами шла с помощью команд IN и OUT — как в x86, а обрабатывать их можно было как-то так:

loop: IN A,0b00110010 ; Загрузить в аккумулятор значение порта PM

AND A,0b0001 ; Отсекаем биты состояний других кнопок и проверяем, нажата ли первая кнопка?

JNZ A, btn_pressed ; Если в аккумуляторе не 0 (а значит кнопка нажата) - то переходим на другую метку

JMP loop ; Если нет - то проверяем по новой

btn_pressed:

SOUND 0

SOUND ONE ; Воспроизвести звук при нажатии


❯ Таймер


В чипсете есть встроенный таймер — ну его ж не просто так для часов использовали. :) Основная суть работы аппаратных таймеров заключается в том, что его тактирует какой-либо внешний тактовый генератор с определенным делителем, в нашем случае — от 1 до 6 относительно системного генератора частоты (т.е 1мгц) и с определенной частотой он делает инкремент внутреннего регистра. Как только регистр переполняется — он очищается и вызывается соответствующее прерывание в основном процессоре.

Это позволяет регулировать скорость работы таймера, а посчитать количество тиков в таком случае не особо сложно. Однако учтите, что чем выше делитель таймера (а значит и обратно-пропорционально снижается точность таймера) — тем реже вызываются прерывания и меньше «кушают» наше процессорное время!

❯ Можно ли написать свою программу для Тетриса?


К сожалению, написать какую-нибудь свою игру для этой консоли в домашних условиях невозможно — таких удобных инструментов для прошивки, как у AVR ещё не было. Holtek предлагала собственный SDK, в которое входила IDE, ассемблер и симулятор отладки финальной программы. Однако дабы получить настоящее «хардварное» устройство, необходимо было заказывать у компании Holtek производство кастомизированного чипа с вашей программой на борту.

Чипсет использовал настоящую масочную Read-Only Memory, которая прожигалась один раз и навсегда на заводе. Производитель электроники отсылал скомпилированную программу Holtek, а они в свою очередь производили кастомный чип с прошитой программой. Несмотря на всю простоту ассемблера и устройства в целом, самому под него ничего написать не получится — внешних шин то у него нет. :(

Однако, в наше время можно разработать и собрать «Тетрис» самому: в том числе, с цветным дисплеем и на базе гораздо более мощного железа! Тут тебе и готовые мощные микроконтроллеры, и возможность собрать приставку на базе легендарного процессора Z80, да при желании можно симулировать почти настоящий HT1130 на FPGA!

❯ Заключение


Разработка вычислительной и при этом недорогой электроники в 90-х было весьма веселым занятием. Несмотря на то, что устройства были на первый взгляд достаточно примитивными, в них всё равно крылось много разных нюансов, которые ограничивали программистов во многом.

Однако embedded-разработка тех лет была весьма интересной: когда полноценные игры вмещали в ПЗУ размером пару килобайт, на ремейки Space Invaders на современных движках весом в под сотню мегабайт смотришь с некоторой улыбкой. :)

Спасибо за наводку ресурсу retroscene:
Пост Legnahar, который один из первых опубликовал предположения насчет HT1130 и комментарию =A=L=X= под тем же постом.

Показать полностью 13
[моё] Гаджеты Разработка Тетрис 90-е Электроника Китай Девайс Программирование Микроконтроллеры Ретро Микроэлектроника Embedded Длиннопост
65
78
3Dfsd2021
3Dfsd2021
2 года назад
TECHNO BROTHER

Как GhatGPT умеет общаться с микроконтроллерами⁠⁠

И меня не обошло сие новомодное поветрие. Нашел чат в телеграме с доступом к ChatGPT и стал думать: а что бы такое его спросить? Давайте сначала теста ради что-нибудь простенькое:

Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост

Потрясающе! Но может ли оно объяснить, что там в коде за что отвечает?

Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост

Обалдеть. Оно почти понимает. А вот интересно, оно умеет только стандартный Си?

Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост

Однако. Оно умеет под STM32, причем самым пионерским ардуиновским способом - считая такты процессора. Но, тем не менее, под SPL. Умеет ли оно использовать таймер?

Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост
Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост

Так, и что мы видим? Мы видим, что инициализировать таймер оно умеет. И с правильными значениями. Но в процедуре прерывания оно не использует! И вместо этого вводит дополнительную процедуру, считающую такты процессора.

Таймер же оно использует, чтобы сделать задержку в 1 секунду в главном цикле! Напоминает известный анекдот: как вскипятить пустой чайник? налить воду и поставить на огонь. а если в чайнике уже есть вода? Вылить и тем самым свести условия задачи к предыдущему :) Возможно, робот неправильно меня понял :)

Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост
Как GhatGPT умеет общаться с микроконтроллерами Arduino, Эксперимент, Stm32, Си, Программирование, Микроконтроллеры, ChatGPT, Нейронные сети, Длиннопост

Охренеть. Во-первых, используется совсем другой метод - через флаг, устанавливаемый в прерывании. В самом прерывании оно не захотело вставлять команду переключения выхода. Во-вторых, все-таки необходимо было конкретизировать.

Вердикт - человек пока что пишет программы под STM32 лучше этой штуки. Но эта штука пишет уже лучше ардуиновского пионера. Где-то и такой подход сойдет.

Показать полностью 7
[моё] Arduino Эксперимент Stm32 Си Программирование Микроконтроллеры ChatGPT Нейронные сети Длиннопост
14
12
ndanila
2 года назад
Сообщество Ремонтёров - Помощь

Корректировка значений спидометра приборной панели Daewoo Matiz⁠⁠

Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост

Приветствую всех. На просторах КНР через посредника был приобретён щиток приборов для автомобиля Daewoo Matiz взамен скучного штатного стандартного, такого как у всех. Особенностью данной детали является то, что на борту её имеется тахометр, а также электронный счётчик пробега. На старой панели хоть и отсутствует трос спидометра, но при этом счётчик пробега механический, однако приводится в действие маленьким двигателем. Так вот, какой вопрос у меня возник. Дело в том, что автомобиль, с которого снят этот щиток, разобрали, когда на нем было чуть более 18000 км пробега. На моем щитке сейчас больше 100ки. Хочется откорректировать пробег, чтобы и правде соответствовал, да и ТО по регламенту провести потом. Естественно, я его разобрал, достал модуль со спидометром и понял, что единственный источник, где значение пробега может храниться, это микроконтроллер Atmega8L-8PU в корпусе DIP-28. Имея в хозяйстве программатор TL866 и сползав на сайт производителя, я убедился, что данный контроллер есть в списке поддерживаемых программатором, выпаял его из платы и попытался прочитать. Действительно, контроллер увиделся программатором, и даже считал мне какой-то дамп, но проверяя его, я не нашёл в нём ничего полезного, как не нашёл я и каких-либо значений, похожих на цифры пробега. Стало понятно, что программатор просто не читает ту область памяти, где это значение пробега может в теории быть записано. И тут я вспомнил, что для работы с данными микроконтроллерами используется программа AVR Studio вроде как, и вспомнил даже, что когда-то давно на китайской барахолке приобрёл вот этот чудо-свисток под названием AVR JTAG ICE. На плате спидометра нашёлся разъём (я так понимаю, для программирования данных), и что-то как-то подозрительно ответная часть разъёма от свистка идеально подошла к гребёнке на плате. Ну и … на этом как бы всё. Я в тупике. Понимаю, что двигаюсь в правильном направлении, но не понимаю, что мне делать дальше.
Итак, я прошу помощи. Подскажите пожалуйста, подойдёт ли данный адаптер для чтения этого микроконтроллера, и, если подойдёт, то каким софтом нужно это всё читать и записывать? Я с Atmega столкнулся впервые, а адаптер этот по молодости приобрёл по ошибке вместо USB-COM адаптера.
Прошу сильно не ругать и не пинать, так как в этом деле, по сути, дилетант, несмотря на то, что опыт кое-какой в этих делах имеется. Спасибо.

Показать полностью 4
Atmega8 Программирование Микроконтроллеры Пробег Daewoo matiz Длиннопост
33
53
AlohaChelny
AlohaChelny
2 года назад
Arduino & Pi

Адресная светодиодная лента - вопрос⁠⁠

Вопрос не праздный. Решился я изучить основы работы светодиодной ленты. Типа WS2812b.

Управление у нее имеет весьма высокоскоростной интерфейс аж на 800 кГц, однако это только так кажется. Для управления 1-10 или даже 20 светодиодами нам вполне хватает времени передать данные.

Точнее, для управления одним светодиодом нам надо передать 3 байта данных, а это суммарно 30 микросекунд.

А вот когда светодиодов уже доходит до сотни и больше и мало того, у нас динамическая индикация, то тут уже ресурсы управляющего устройства весьма затребованы.

Для управления последовательностью в 100 светодиодов нам потребуется 3000 мкс или 3 мс, что уже весьма много. В режиме реального времени, что бы сделать к примеру бегущую строку, максимальная скорость будет равна 330 Гц. Что пока терпимо, но уже осязаемо.

Возможно существует аппаратный интерфейс для передачи данных, но я об этом не знаю.

Передача одного бита у нас занимает 0.4+0.85 или 0.45+0.8 микросекунд.

Значится нам надо успеть поднять на выходе 0 или 1 за указанное время.

Изначально я хотел управлять небольшой лентой с помощью микроконтроллера pic12f629 и аналогичных. В нем заявлено максимально тактовая частота 20 МГц, время выполнения простой команды 200 нс.

Адресная светодиодная лента - вопрос Arduino, Электроника, Вопрос, Микроконтроллеры, Программирование, Микрочип, Светодиодная лента, Расчет

Выходит что подать в ленту 0 или 1 я как бы успеваю, ибо 2 команды - это заявленные 0.4 мкс. А вот дробное значение типа 0.85 или 0.45 я никак не могу реализовать. С другой стороны протокол адресной ленты допускает разброс +-0.125 нс. Но я в него все равно не укладываюсь.

Адресная светодиодная лента - вопрос Arduino, Электроника, Вопрос, Микроконтроллеры, Программирование, Микрочип, Светодиодная лента, Расчет

Итог. Микроконтроллер типа pic12 не может выставить нужные сигналы на выходе за указанное время. Даже если бы протокол управления лентой был более лояльным, то максимум что можно было бы добиться от контроллера - передача потока данных, записанных в ПЗУ, а хочется в перспективе большего. И не просто загрузить контроллер передачей данных, что что бы он при этом еще и свю какую то полезную работу выполнял.

Я понимаю, что вариант не морочить голову, взять адруино или типа того было бы очевидным, но стрелять из пушки по воробьям как то не хочется.

Есть варианты управления адресной светодиодной лентой кроме адруино ? Может где внятное описание с примером программ на ассемблере есть ?

Или все же обратить взор на AVR ?

Возможно в расчётах есть неточности, на ходу все писал.

Показать полностью 2
[моё] Arduino Электроника Вопрос Микроконтроллеры Программирование Микрочип Светодиодная лента Расчет
84
6
DELETED
2 года назад

Продолжение поста «PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth»⁠⁠1

Продолжение поста «PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth»
[моё] Микроконтроллеры Lcd дисплей Mp3 FM Своими руками Программирование Видео YouTube Длиннопост Числа Ответ на пост
4
17
DELETED
2 года назад
Рукодельники
Серия PIC

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth⁠⁠1

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

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

В частности, основной идеологией к данной конструкции лежит пост Тест LCD 16bit , ОЗУ, SDCARD на PIC24 , где мною было проведена работа по изготовлению устройства на базе PIC24 и 8bit RAM. Отталкиваясь от прошлых наработок, были добавлены новые элементы схемы и учтены выявленные проблемы. (и получены новые проблемы, много новых проблем, но пост не об этом).


Основными функциями устройства являются:

1. Время (включая интернет-синхронизацию по произвольному GMT);

2. Текущая интернет-погода + Прогноз погоды + Погода с выносного Bluetooth-датчика;

3. FM-радио;

4. MP3 плеер;

5. Календарь (не рассматривается в текущей статье);


В данной конструкции используются:

1. PIC24HJ256GP610A (основной);

2. PIC18F28K20  (дополнительный, используется для mp3);

3. LCD 16bit (NT3551), работа с ним рассматривалась тут

4. RAM 16bit IS61WV102416ALL (1024K), аналогичная ссылка п.3

5. FM-radio (KT0915), радио на данной микросхеме рассматривалось тут.

6. MP3 (VS1053), ранее не применялось.

7. SD, применялось аналогично посту п.3, п.9.

8. ESP12 (на базе ESP8266), применялось тут и тут

9. Bluetooth (HC08), применялось тут (выносной Bluetooth-термометр и  схема его, данной статьей не рассматривается, так как полностью переиспользован из предыдущего проекта)


Корпус напечатан на 3D принтере (на заказ).

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом
PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Фотки готового устройства для масштаба:

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом
PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Одним из усовершенствований схемы, от предыдущих частей данного проекта, заключается в добавлении еще одного контролера PIC18F28K20, для целей выноса на него задач чтения SD и проигрывания MP3, чтобы основной контроллер PIC24 не был занят постоянно циклом.

Целями задачи закладывался больший потенциал схемы, чем сейчас используется и описывается в статье, поэтому сэкономить\упростить задачу у меня не стояло.

Ввиду чего, сопряжение контроллеров и модулей осуществляется посредством CD405xB мультиплексоров, согласованных по определенным принципам работы и управляемых контроллером.

Синхронизация с ПК осуществляется по USB, через микросхему CP2102, где ее uart-выводы также сначала сопрягаются с мультиплексором, а затем с двумя контроллерами, это необходимо, чтобы реализовать функцию bootloader'a., как работать с bootloader для PIC18, я частично рассматривал тут.

На схеме (если ее кто будет смотреть), также имеется зарядка на базе TP4056 для аккумулятора 3.7v и повышающий DC-DC конвертор на базе MC34063, он предназначался для формирования 5v необходимых для схемы, но я просчитался с потреблением схемы, которое оказалось критично высоким и DC-DC попросту сгорел, на готовой плате этот участок схемы остался не распаянным. Если у кого есть примеры DC-DC конвертора (3.7v- > 5v) на нагрузку до 2A, сообщите.

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

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


Само же устройство базируется на контроллере PIC24 и сопряжено с RAM и периферийными устройствами . PIC24 осуществляет манипуляции переключения мультиплексоров, получает ответы от периферийных устройств, читает SD (bmp) и выводит графическую информацию., работает с микросхемой FM-радио.

ОЗУ в проекте требуется для:

1. импорта BMP картинок в ОЗУ, манипуляций с transparent (замещение фона);

2. импорта response от ESP и пост-обработки информации (прогноз);


Дополнительная функция устройства, как было уже обозначено в начале, это чтение и воспроизведение MP3 отдельно от основного PIC24, получается, как два устройства в одном, сопряженных между собой, связь между которыми осуществляется через UART, посредством мультиплексора.

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Плата изготовлена на заказ. Обычно я сам делаю, но в этом случае, это было выше моих сил.

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

На главный экран выводится  основная погода (интернет-погода и информация с выносного bluetooth-датчика), ну и часы само собой. Также, главный экран располагает важной функцией ярлыков - доступов к интерфейсам устройства, в действительности же это картинки, предварительно загруженные в RAM и выведенные с учетом замещения фона.

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


Дальше будет пояснительное видео некоторых функций, но сейчас ряд фотографий:

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом
PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Прогноз погоды на 5 дней, выведенный в разбивке по два часа.

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

MP3-плеер (если у кого были ожидания увидеть тут winamp, как было на ярлыке, то извините, у меня была такая идея сделать, но было некогда ее реализовать).

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Радио

PIC24, LCD, RAM, MP3/FM, SD, ESP, Bluetooth Микроконтроллеры, Lcd дисплей, Mp3, FM, Своими руками, Программирование, Видео, YouTube, Длиннопост, Рукоделие с процессом

Пояснительное видео.

Вот и всё., естественно статья не раскрывает всех особенностей проекта, некоторых деталей управления и прочего. Также, полного кода программы естественно не будет. Но, если кому то до зарезу что-то нужно, то я готов послушать специфику вопросов и потом, возможно сделать отдельный пост. Написано на C++, под XC16 и XC8.

Удачи.


Ссылки на предыдущие части (некоторые уже приводились в статье):

Тест LCD 16bit , ОЗУ, SDCARD на PIC24

Bluetooth термометр или вариации на тему

Радиоприемник на базе цифрового радиочипа и контроллера PIC

Многофункциональное устройство своими руками, часть 2

Многофункциональное устройство своими руками

Часы пикабушника

Часы в деревянном корпусе

Показать полностью 13 1
[моё] Микроконтроллеры Lcd дисплей Mp3 FM Своими руками Программирование Видео YouTube Длиннопост Рукоделие с процессом
4
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии