что такое загрузчик ардуино

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Что такое загрузчик Arduino и как он работает?

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

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

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

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

Но как же работает загрузчик? Загрузчик Arduino поддерживает перепрограммирование памяти программ (или Flash-памяти) через последовательный порт. Без этого вам понадобится специальный аппаратный программатор, например, USBtiny для изменения кода в ATmega328p у Arduino Uno.

Как и многие микроконтроллеры, ATmega328p выделяет часть своей программной памяти для загрузки кода. В случае Uno загрузчик Arduino ждет короткое время, наблюдая за выводами UART. Если загрузчик не получает определенную последовательность байтов по последовательному порту, процессор переходит к разделу «пользовательской» программы для загрузки того, что уже находится в памяти программы. Этот скачок загружает вашу программу (или скетч).

Если предварительно определенная последовательность получена, загрузчик Arduino претендует на роль программатора AVR. В случае Uno используется уникальный протокол программирования, называемый «arduino». Этот «специальный протокол» является вариантом аппаратного программатора stk500. Другие платы Arduino имеют другие типы программаторов, которые они поддерживают.

На этом этапе avrdude начнет отправлять двоичные данные вашей программы по протоколу через виртуальный последовательный порт. Программная память (PROGMEM) ATmega328p сохраняет входящий поток байтов. После завершения чип сбрасывается и запускает новый код.

Повторное программирование Flash-памяти без специального программатора возможно только в том случае, если код работает во время фазы загрузки. Идея состоит в том, чтобы не допустить, чтобы вредоносный код (или какие-то баги) менял содержимое Flash-памяти.

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

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

Оглядываясь на то, как работает загрузчик Arduino, помните, что он задерживает выполнение «реального» программного кода. Этот факт означает, что до запуска основного кода после включения микроконтроллера была задержка.

Если у вас есть код загрузчика, это означает, что теперь выделено меньше объема памяти для вашей программы. Загрузчик optiboot для Arduino Uno занимает 508 байт (512-байтовый блок минус оставшиеся 4 байта). Впрочем, при Flash-памяти в 32 Кб занятие дополнительных 512 байт это не так много.

Поскольку загрузчик Arduino работает до вашего кода, он может устанавливать некоторые регистры не так, как ожидается. Например, у некоторых людей были проблемы со сторожевым таймером при ранних версиях загрузчика Arduino. К счастью, загрузчик optiboot, который сегодня более распространен, решает проблему сторожевого таймера.

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

Источник

Программаторы, ISP, фьюзы

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Загрузка прошивки

В этом уроке мы рассмотрим загрузку прошивки в ардуино через внешние “программаторы”. Давайте вспомним, о чем уже говорили в одном из первых уроков: загрузка прошивки в Arduino возможна двумя способами:

Загрузчик (bootloader)

Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.

Программатор

Помимо записи прошивки во flash память, программатор позволяет:

Программатор – ваш единственный друг при работе с “голым” микроконтроллером, то есть для его низкоуровневой настройки и загрузки прошивки.

USB-TTL (UART)

Этот способ реализован прямо на платах Arduino при помощи USB-TTL (USB-UART) преобразователя, именно поэтому мы можем подключить плату к компьютеру и загрузить код. USB-TTL позволяет только загрузку данных во flash, остальные возможности (как у ISP программатора) ему недоступны. В то же время он ограничен только возможностями загрузчика, но в этом уроке мы рассматриваем только стандартные. Также USB-TTL мост позволяет микроконтроллеру общаться с компьютером по последовательному соединению (тот самый Serial и монитор com порта). Есть платы без бортового USB-TTL, например Arduino Pro Mini. Для работы с ними нужно купить внешний USB-TTL преобразователь. Также загрузка прошивки через UART возможна и в “голый” микроконтроллер при условии наличия там загрузчика, который запишет принятый код во flash. Про запись загрузчика мы поговорим ниже. UART “загружатор” подключается к пинам RX и TX Ардуино (или микроконтроллера), RX->TX и TX->RX, также обязательно подключается земля GND. Если у прошиваемой платы нет своего питания, то подключается и питание. Загрузчик отрабатывает при запуске МК, поэтому непосредственно перед загрузкой прошивки МК должен быть сброшен (перезагружен), и для этого на платах USB-UART есть вывод DTR (Data Terminal Ready), который подключается к пину RST Reset и собственно выполняет сброс перед перед загрузкой прошивки. На платах Pro Mini есть отдельный пин DTR.

USB-TTLArduino
DTRDTR
RXTX
TXRX
GNDGND
VCC/5V/3.3VVCC

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино Китайцы выпускают USB-TTL модули в широком ассортименте, но в целом они все одинаковые по своей сути. Ссылка на результат поиска на aliexpress, и ссылка на все USB-TTL в моём любимом магазине WAVGAT. Что использую я? В основном платку на CP2102. Перед заказом модуля обязательно убедитесь в том, что у него есть выход DTR, иначе этот модуль можно будет использовать только для “общения” с контроллером через COM порт. что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино Для работы с таким преобразователем нужно установить драйвер для чипа, на базе которого собран модуль, это может быть CP2102, CH340/341, FT232, PL2303 и другие. Прошивка загружается как обычно: выбираем порт, на котором сидит преобразователь, версию загрузчика и жмём загрузить, всё! Важный момент: на некоторых китайских версиях плат Arduino Pro Mini не распаян пин DTR, т.е. он не идёт на RST и автоматический сброс перед загрузкой прошивки не выполняется. В этом случае сброс нужно производить вручную, кнопкой RST, непосредственно перед загрузкой прошивки… Загрузка прошивки посредством загрузчика (bootloader) возможна с любого UART устройства, даже через Bluetooth. Но об этом мы поговорим в отдельном уроке.

Фьюзы (Pro)

Фьюзы (фьюз-биты) являются низкоуровневыми настройками микроконтроллера, которые хранятся в специальном месте в памяти и могут быть изменены только при помощи ISP программатора. Это такие настройки как выбор источника тактирования, размер области памяти под загрузчик, настройка отсечки по напряжению и прочее. Фьюз-биты собраны по 8 штук в байты (т.н. байты конфигурации), как типичный регистр микроконтроллера AVR. Таких байтов может быть несколько, они называются low fuses, high fuses, extended fuses. Для конфигурации байтов рекомендуется использовать калькулятор фьюзов (например, вот такой), в котором просто ставятся галочки на нужных битах, и на выходе получается готовый байт в hex виде. Рассмотрим на примере ATmega328p:

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Важный момент: в AVR биты у нас инверсные, то есть 1 это выкл, 0 это вкл. Расставляя галочки в калькуляторе, мы формируем байт, галочка стоит – бит включен, но в результирующем байте включенные биты являются нулями. Об этом стоит задумываться при ручном составлении фьюз-байта, при использовании калькулятора можете об этом даже не вспоминать. Что позволяют настроить биты?

* – прошивка возможна при помощи высоковольтного программатора

Лок-биты (Pro)

Лок-биты (lock-bits) позволяют управлять доступом к памяти микроконтроллера, что обычно используется для защиты устройства от копирования. Лок-биты собраны опять же в конфигурационный лок-байт, который содержит: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (для ATmega328). Калькулятор лок-битов можно использовать этот. BOOTLOCK биты позволяют запретить самому МК запись (самопрограммирование) во flash память (область программы и область загрузчика)

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

А вот локбиты LOCKBIT позволяют запретить запись и чтение flash и EEPROM памяти извне, при помощи программатора, т.е. полностью защитить прошивку от скачивания и копирования:

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Таким образом включив LOCKBIT1 (лок-байт будет 0x3E) мы запретим внешнюю запись во Flash и EEPROM память, т.е. при помощи ISP программатора, а включив LOCKBIT1 и LOCKBIT2 (лок-байт: 0x3C) полностью заблокируем заодно и чтение данных из памяти микроконтроллера. Повторюсь, всё описанное выше относится к ATmega328p, для других моделей МК читайте в соответствующих даташитах.

ISP программатор

USBasp

Дешёвые ISP программаторы также есть в ассортименте у китайцев, рекомендую брать USBasp как самый распространенный. Поискать на алиэкспресс, мне нравится версия в корпусе. USBasp имеет не очень удобный выход 10-пин на шлейфе, поэтому рекомендуется купить также переходник 10-пин на 6-пин, который позволяет сразу подключаться к ISP header’у, который есть на большинстве плат Arduino. Внимание! Очень часто встречается брак в виде непропая контактов, поэтому во избежание проблем рекомендуется пропаять переходник и отмыть флюс (зубная щётка + бензин калоша).

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Решение проблем

Решение большинства проблем с загрузкой через программатор (независимо от того, что написано в логе ошибки):

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

Основные ошибки в логе Arduino IDE

avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor=’www.fischl.de’ product=’USBasp’ Причина – компьютер не видит USB ASP

avrdude: error: program enable: target doesn’t answer. Причина – usbasp не видит подключаемый микроконтроллер

Arduino as ISP

Почти любая другая плата Arduino может стать ISP программатором, для этого нужно просто загрузить в неё скетч ArduinoISP:

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

ISP программатор подключается к четырем пинам микроконтроллера, не считая питания: один из пинов передает сброс, остальные – для передачи данных. Чтобы плата-программатор не сбрасывалась при загрузке, на неё нужно:

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Решение проблем

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

Работа в Arduino IDE

Прошивка загрузчика

Из Arduino IDE при помощи ISP программатора мы можем записать другой загрузчик (по факту загрузчик + фьюзы) и загрузить скетч, а также настроить/прошить фьюзы и лок-биты, но не очень удобным способом. Когда мы выбираем плату в Инструменты > Плата и загрузчик в Инструменты > Плата (загрузчик, bootloader), Arduino IDE автоматически делает “активным” нужный загрузчик. Нажимая Инструменты > Записать загрузчик мы прошиваем загрузчик, соответствующий выбранной плате и её настройкам. Также одновременно с загрузчиком прошиваются фьюзы и лок-биты, соответствующие выбранной плате в Arduino IDE. Как и где их поменять, смотрите чуть ниже. Рассмотрим на примере записи загрузчика для atmega328, стоящей на китайской плате Arduino NANO. На данный момент китайцы прошивают в МК старую версию загрузчика, которая называется old bootloader в меню платы. Оригинальные платы идут с более современным загрузчиком, поэтому при работе с китайскими платами нам приходится выбирать old bootloader для загрузки прошивки через бортовой usb порт. Подключим usbasp по схеме выше, выберем его как программатор в Инструменты > Программатор, выберем плату Arduino NANO, загрузчик для atmega328 (первый в списке). Нажмём записать загрузчик. Всё! Теперь плату можно шить через бортовой usb порт, выбирая первый загрузчик. Он кстати легче, быстрее “прошивает” и сама прошивка быстрее “запускается”.

Как убрать загрузчик?

В стандартном “ядре” Arduino не предусмотрен вариант “без загрузчика”. Для того, чтобы вручную убрать поддержку загрузчика, нужно уметь работать с boards.txt и фьюзами: нужно будет изменить фьюз BOOTRST и подправить максимальный размер скетча. Есть более простой вариант – найти и установить ядро, в котором реализован выбор загрузчика с вариантом “без загрузчика”, например для ATmega328 это miniCore и наше GyverCore. Нужно установить поддержку ядра по рассмотренной ранее инструкции, выбрать плату, указать вариант “без загрузчика” и нажать “Записать загрузчик”. В МК будут прошиты соответствующие фьюзы.

Загрузка скетча

Фьюзы

Файл конфигурации называется boards.txt и найти его можно в папке с ядром Arduino: C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt. Документацию на boards.txt можно почитать здесь. При желании можно вывести нужные фьюзы через калькулятор (читайте выше), изменить их в boards.txt (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Такая работа с фьюзами максимально неудобна, но есть и другие варианты:

Avrdudeprog

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Видео



Источник

Что такое загрузчик ардуино

Среда разработки Ардуино

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

Написание программ

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Verify (Проверить)
Проверить код на ошибки.

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

New (Создать)
Создать новую программу.

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Open (Открыть)
Команда открывает меню со списком всех скетчей, доступных в вашей рабочей папке. После щелчка по файлу его содержимое откроется в текущем окне.

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Save (Сохранить)
Сохранить программу

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Serial Monitor
Открыть программу «Serial Monitor» (для работы с последовательным интерфейсом).

Дополнительные команды находятся в меню: File, Edit, Sketch, Tools и Help. В этих меню всегда активны только те пункты, которые можно применить к текущему элементу или фрагменту кода.

Меню «Edit (Правка)«

Меню «Sketch (Программа)«

Меню «Tools (Инструменты)«

Скетчбук (рабочая папка)

В среде разработки Ардуино используется принцип организации скетчбука: все ваши программы (или скетчи) хранятся в одном месте. Чтобы просмотреть их, необходимо выбрать меню File > Sketchbook или щелкнуть по кнопке Open на панели инструментов. Директория для хранения ваших программ будет автоматически создана при первом запуске среды Ардуино. Ее месторасположение всегда можно изменить в окне настроек программы.

Вкладки, компиляция и работа с несколькими файлами

Прошивка

После выбора используемого порта и платы, необходимо нажать кнопку Upload на панели инструментов или выбрать пункт Upload из меню File. После этого произойдет сброс Ардуино и начнется процесс загрузки программы в память контроллера. В старых моделях (до Arduino Diecimila) функция авто-сброса отсутствует, поэтому перед прошивкой таких устройств необходимо вручную нажать кнопку сброса на плате. В процессе загрузки на большинстве моделей Ардуино будут мигать светодиоды RX и TX. По завершению процесса прошивки, программа выдаст соответствующее сообщение или ошибку.

Библиотеки

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

Инструкции по написанию собственных библиотек см. здесь.

Оборудование сторонних производителей

Дополнительную информацию о создании пакетов для стороннего оборудования можно найти в соответствующем разделе на сайте Arduino Google Code.

Программа «Serial Monitor»

Отображает данные, поступающие от Ардуино на компьютер по последовательному интерфейсу (поддерживается работа как с USB-, так и с обычными версиями Ардуино). Чтобы отправить данные внешнему устройству, достаточно просто ввести текст в окне программы и щелкнуть по кнопке «Отправить» (либо нажать Enter). Из выпадающего списка необходимо выбрать только скорость передачи данных, соответствующую той скорости, которую вы указали в функции Serial.begin() в вашем скетче. Помните, что на Mac- и Linux-системах, Ардуино будет сбрасываться при каждом подключении программы к устройству (соответственно, после сброса скетч будет выполняться заново).

Общаться с Ардуино можно также через Processing, Flash, MaxMSP и пр. (подробнее об этом читайте здесь).

Настройки

Поддерживаемые языки

что такое загрузчик ардуино. Смотреть фото что такое загрузчик ардуино. Смотреть картинку что такое загрузчик ардуино. Картинка про что такое загрузчик ардуино. Фото что такое загрузчик ардуино

Среда разработки Ардуино 1.0.1 переведена более чем на 30 различных языков. По умолчанию, язык IDE выбирается исходя из языковых настроек вашей операционной системы. (Обратите внимание: на Windows и Linux-системах язык IDE определяется по региональным настройкам, отвечающим за формат даты и валюты, а не по языкоу самой операционной системы).

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

Чтобы сбросить языковые настройки среды и вернуть автоматический выбор ее языка по региональным настройкам операционной системы, в выпадающем списке необходимо выбрать пункт System Default. Изменения вступят в силу после перезапуска IDE Arduino. И наоборот, чтобы изменение языковых настроек операционной системы повлияли на текущий язык программы, необходимо просто перезапустить среду Ардуино.

Разновидности плат

Выбирать модель используемой платы в среде Ардуино необходимо по двум причинам:

Ниже перечислены основные пункты меню Boards и дана расшифровка соответствующих им настроек:

Инструкции по добавлению в программу других устройств описаны выше в разделе «Оборудование сторонних производителей». Текст данного руководства опубликован под лицензией Creative Commons Attribution-ShareAlike 3.0. Примеры кода, встречающиеся в руководстве, являются свободным контентом.

Источник

Разработка программы-загрузчика (BootLoader)

Что такое загрузчик?

Обычно микроконтроллеры программируются с помощью программатора. Но есть возможность прошить в микроконтроллер некую программу, которая позволит программировать его без использования внешнего программатора. Такая программа называется загрузчиком.

Если загрузчик не используется

Прошивка загрузчика

Пример по прошивке Arduino Mini

Вот несколько инструкций по прошивке на примере использования Arduino Mini

Версии загрузчика

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

Загрузчик, фактически прошитый на Arduino NG, немного отличается. Он разрешает встроенный подтягивающий резистор на Pin6 и не разрешает встроенное подтягивание на выводе RX. Кроме того, он не прекращает работу после получения недействительных данных, поэтому, если вы отправляете данные сразу после сброса, ваша программа никогда не будет работать.

Загрузчик Arduino BT выполняет начальную настройку модуля bluetooth.

Загрузчик ATmega8 занимает 1 Кбайт флэш-памяти. Он не отключается, когда получает недопустимые данные. Поэтому вам необходимо убедиться, что данные не загружаются на плату в течение 6-8 секунд после запуска загрузчика.

Некоторые очень старые версии загрузчика работают со скоростью 9600 бод (вместо 19200). Чтобы успешно загружать программы на платы с помощью таких загрузчиков, вам необходимо изменить строчку serial.download_rate в файле настроек на 9600.

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

Для загрузчика ATmega8 это:

Для ATmega168 это (где является либо «diecimila», либо «ng»):

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *