Микроконтроллер: определение, задачи, разновидности, применение

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

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

В большинстве случаев достаточно даже просто скачать уже готовую библиотеку, которую можно найти в свободном доступе на нашем сайте.

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

История появления

Работы над изобретением микропроцессора велись с начала 1970-х годов. Первой компанией, разработавшей его, была компания Intel. Уже в 1971 году ее был выпущен первый микроконтроллер 4004, который состоял из 2300 полупроводниковых транзисторов, а по размеру был не больше ладони. Это стало возможным, после того как для микросхемы был специально разработан кристалл процессора.

Несмотря на маленькие размеры, производительность микропроцессора не уступала компьютеру Eniac, имеющему габариты в 85 м3. Особенностью этого устройства было то, что оно могло обрабатывать только 4 бита информации.

В ближайшие полгода еще несколько компаний заявили о создании аналогичных изделий.

К концу 1973 года Intel выпускает 8-зарядный микропроцессор. Он был настолько удачно разработан, что и сегодня считается классикой.

Через несколько месяцев фирма Motorola выпускает свой 8-битовый микропроцессор 6800. Он стал сильным конкурентом интеловской микросхеме, т. к. имел более значительную систему прерываний и одно напряжение электропитания. В 8080 их было три.

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

Оба эти изделия имели как положительные стороны, так и недоработки. Они стали родоначальниками двух больших семейств микропроцессоров – Интел и Моторола, которые конкурируют между собой до сих пор.

В 1978 году Интел выпустила 16-разрядный микропроцессор, который IBM использовала для разработки персональных компьютеров. Моторола не отстала от своего конкурента и тоже выпустила 16-разрядный микропроцессор, который использовали Atari и Apple.

Сейчас существует более 200 разновидностей микроконтроллеров. Количество компаний, их изготавливающих, перевалило за два десятка. Широкое распространение у разработчиков получили:

  • 8-битные микроконтроллеры Pic компании Microchip Technology и AVR от Atmel;
  • 16-битовые MSP 430 фирмы TI;
  • 32-битные ARM от одноименной компании.

В России пользуются популярностью микроконтроллеры Renesas Electronics, Freescale, Samsung.

Микроконтроллеры

Данный раздел посвящен такой современной теме, как микроконтроллеры. В настоящее время без микроконтроллеров, не обходится практически ни одно современное устройство. Если у вас возникли какие-либо вопросы по теме микроконтроллеров, их программированию и т.п., то вы можете посетить форумы: МК для начинающих, AVR-форум, PIC-форум, Arduino и Raspberry Pi, STM32/ARM-форум, программаторы, периферия, ПЛИС, где на ваши вопросы постараются ответить грамотные специалисты и участники форума.

Микроконтроллеры для начинающих:

  • Микроконтроллеры AVR для начинающих. Часть 1 — знакомство с семейством AVR
  • Микроконтроллеры AVR для начинающих. Часть 2 — программаторы и прошивка. Работа с PonyProg
  • Микроконтроллеры AVR для начинающих. Часть 3 — работа с CodeVision AVR
  • Книга по программированию микроконтроллеров AVR
  • Видеокурс (8 уроков, плюс задачи) по AVR с авторской темой поддержки на форуме
  • Обучающее видео по микроконтроллерам для начинающих
  • AVR на C — просто?
  • AVR на C — просто? Часть 2
  • AVR на C — просто? Часть 3
  • AVR на C — просто? Часть 4
  • Фьюзы микроконтроллеров AVR – как и с чем их едят
  • Учимся создавать устройства на микроконтроллерах: «светофор»
  • Учимся создавать устройства на микроконтроллерах: «индикатор заряда аккумулятора»
  • Идеальная программа на С для МК, попробуем написать
  • Идеальная программа на С для МК — продолжение
  • Написание программ на С в Code Vision AVR для контроллеров не имеющих ОЗУ
  • Timer/Counter for AVR для начинающих
  • ШИМ на микроконтроллере Attiny13
  • ШИМ контроллер на МК Attiny2313 (управление вентилятором)
  • ШИМ-регулятор на микроконтроллере ATmega8515
  • Регулятор яркости (ШИМ) для светодиодного драйвера или велофары
  • PWM или ШИМ (широтно импульсная модуляция) на AVR для новичков. Часть 1
  • PWM или ШИМ на AVR для новичков. Часть 2 — программный ШИМ
  • Программный ШИМ на STM8L
  • Работы MCP3421 АЦП 18 бит с микроконтроллером ATmega32
  • Отладочная плата на AT89S52 или изучаем МК с нуля
  • Счётчик с памятью на Attiny2313
  • Управление 595 сдвиговыми регистрами при помощи AVR по SPI
  • Включение и выключение приборов одной кнопкой
  • Включение и выключение устройств одной кнопкой
  • Подключение светодиодов к AVR
  • mikroPascal for AVR. Урок 1. Введение
  • mikroPascal for AVR. Урок 2. АЦП, UART и отображение
  • mikroPascal for AVR. Урок 3. Еще раз UART а также немного о прерываниях
  • mikroPascal for AVR. Урок 4. Прерывания, прерывания и еще раз прерывания. Таймеры
  • mikroPascal for AVR. Урок 5. Использование OneWire. Встроенная библиотека
  • mikroPascal for AVR. Урок 6. Снова работа с OneWire. Расширенная библиотека
  • mikroPascal for AVR. Урок 7. Аппаратный ШИМ
  • mikroPascal for AVR. Урок 8. Программный ШИМ
  • Урок по PWM (ШИМ) для mikroPascal for AVR
  • Урок по mikropascal for AVR.I2C
  • AvrStudio 4. Библиотека для AVR. Модуль для I2C или TWI
  • Algorithm Builder. Урок 1 — Введение
  • Algorithm Builder. Урок 2 — О создании первой программы
  • Использование интерфейса USI для подключения периферии I2C к Attiny2313
  • Работа с I2C и SPI на примере часов реального времени PCA2129T
  • Несколько полезных утилит для микроконтроллеров
  • Библиотека для управления несколькими 1Wire устройствами при топологии точка-точка
  • Расширение количества портов микроконтролера PIC18 через SPI-интерфейс
  • AvrStudio 4. CMSIS для AVR. Структура для GPIO
  • PSoC. Глава 0. Введение. Первый пример
  • PSoC. Глава 1. ADC
  • PSoC. Глава 2. UART
  • PSoC. Глава 3. DAC и UART RX линия
  • PSoC. Глава 4. Таймеры и глобальные прерывания
  • Начинаем работать с FPGA или ПЛИС это просто. Часть 1
  • Начинаем работать с FPGA или ПЛИС это просто. Часть 2
  • Xilinx шаблон модуля на VHDL и TestBench для тестирования
  • Внутреннее устройство ПЛИС (FPGA)
  • FPGA. Просто о сложном — Философия написания конфигураций для ПЛИС
  • FPGA. Просто о сложном — Создание проекта в Quartus II. Сравнение VHDL и Verilog
  • QuickLogic QuickFeather Development Kits
  • Начинаем работать с микроконтроллерами MSP430 от фирмы Texas Instruments
  • Проект виртуального СОМ порта для отладочной платы STM32H107
  • SYS/BIOS: операционная система реального времени для микроконтроллеров MSP430

Уроки по STM32, ARM:

  • IAR и STM32 CORTEX M0. Часть 0x00 (пустой треп и отмазки)
  • IAR и STM32 CORTEX M0. Часть 0x01. Подготовка платформы IAR
  • IAR и STM32 CORTEX M0. Часть 0x02, Начинаем пайку!
  • IAR и STM32 CORTEX M0. Часть 0x03, Программируем без программатора
  • IAR и STM32 CORTEX M0. Часть 0x04 Автоматизация прошивки IAR
  • IAR и STM32 CORTEX M0. Часть 0x05, GPIO — входит и выходит…
  • IAR и STM32 CORTEX M0. Часть 0x06, Таймеры, ШИМ, прерывания
  • ARM – это просто (часть 1)
  • ARM – это просто (часть 2)
  • ARM – это просто (часть 3)
  • STM8. Урок 1. Настройки среды ST Visual Develop
  • STM8. Урок 2. Тактирование контроллера
  • STM8. Урок 3. Описание GPIO и библиотека SPL
  • STM8. Урок 4. Настройка таймера 4. Прерывания таймера
  • STM8. Урок 5. Быстрая настройка среды STVD для STM8S и STM8L
  • STM8. Урок 6. Структура проекта для STM8L и STM8S
  • STM8. Урок 7. Выбор и настройка модели памяти
  • STM8. Урок 8. Ассемблерный вставки в Cosmic. Сдвиги в Си
  • STM8. Cosmic ошибка компилятора «FlexLM No such feature exists»
  • STM32 старт с CMSIS
  • STM32 простой и быстрый старт с CooCox CoIDE
  • ARM. STM32 быстрый старт
  • STM32. Урок 1. Выбор отладочной платы
  • STM32. Урок 2. Порты ввода/вывода
  • STM32. Урок 3. UART
  • STM32. Урок 4. Basic timers
  • STM32. Урок 5. Подключение LCD дисплея WH1602
  • STM32F4. Урок 1 — управление светодиодами
  • STM32F4. Урок 2 — нажатие кнопки
  • STM32F4. Урок 3 — цифровые выходы
  • STM32F4. Урок 4 — цифровые входы
  • STM32F4. Урок 5 — работа с АЦП
  • STM32F4. Урок 6 — работа с дисплеем ST7783
  • STM32F4. Урок 7 — Графическая библиотека для дисплея ST7783
  • STM32F4. Урок 8 — Библиотека шрифтов для дисплея ST7783
  • STM32F4. Урок 9 — Тачскрин ADS7843
  • STM32F4. Урок 10 — Программные таймер и счетчик
  • STM32F4. Урок 11 — Генератор случайных чисел
  • STM32F4. Урок 12 — UART
  • STM32F4. Урок 13 — Работа с SD-картой
  • STM32F4. Урок 14 — АЦП с использованием DMA
  • STM32F4. Урок 15 — Низкоуровневый SPI
  • STM32F4. Урок 16 — Работа с ЦАП MAX5250 по SPI
  • STM32F4. Урок 17 — Управление LIS302DL через SPI
  • STM32F4. Урок 18 — Низкоуровневый I2C
  • STM32F4. Урок 19 — Работа с EEprom M24C02 по I2C
  • STM32F4. Урок 20 — Отображение изображения с SD-карты
  • STM32F4. Урок 21 — АЦП в групповом режиме
  • STM32F4. Урок 22 — Системная проверка
  • STM32F4. Урок 23 — Работа с ЦАП
  • STM32F4. Урок 24 — Работа с ЦАП через DMA
  • STM32F4. Урок 25 — Работа с ШИМ
  • STM32F4. Урок 26 — Передача данных АЦП на ПК
  • STM32F4. Урок 27 — Подключение камеры OV9655
  • STM32F4. Урок 28 — Работа с внешними прерываниями
  • STM32F4. Урок 29 — Работа с PS2-клавиатурой
  • STM32F4. Урок 30 — Работа с PS2-мышкой
  • STM32F4. Урок 31 — Использование USB-OTG как виртуальный COM-порт
  • STM32F4. Урок 32 — Использование USB-OTG в режиме MSC_HOST
  • STM32F4. Урок 33 — Работа с дисплеем SSD1289
  • STM32F4. Урок 34 — Подключение символьного LCD-дисплея 16х2 (HD44780)
  • USB FLASH. Введение и часть 1 — Работа с AT45DB161D
  • USB FLASH. Часть 2 — Периферия USB в STM32F0
  • USB FLASH. Часть 3 — Заключительная. Протокол SCSI
  • FAT32 на STM32
  • Управление текстовыми командами (USART на STM32)
  • Обработка нажатия пользовательской кнопки, используя внешние прерывания
  • Вариант использования упакованного формата времени в STM32
  • Подключение матричной клавиатуры к STM32F4Discovery
  • Библиотека матричной клавиатуры для STM32F4 Discovery
  • Подключение дисплея HD44780 к STM32 в CubeIDE (HAL)
  • Библиотека HD44780 4 строки по 20 символов для STM32
  • Зажигаем на TLC5940
  • IAR EWARM. STM32F030F4P6. Микроконтроллер отсутствует в списке…
  • STM32F030. Не блокирующая реализация I2C
  • Универсальная плата на STM32F405
  • Nucleo-F411RE USB-ADC
  • Работаем с LabVIEW на примере STM32

Уроки по AVR (BASCOM-AVR):

  • Урок 1. Что такое AVR микроконтроллер?
  • Урок 2. Программатор AVR микроконтроллеров
  • Урок 3. Отладочная плата для AVR микроконтроллера Attiy13
  • Урок 4. Порты вывода в микроконтроллере Attiy13
  • Урок 5. Программирование AVR микроконтроллеров
  • Урок 6. Первая конструкция на микроконтроллере AVR
  • Урок 7. Работа с ЖК индикатором на контроллере HD44780 и его аналогах
  • Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR
  • Урок 9. Работа с АЦП на примере ATtiny13 в BASCOM-AVR
  • Урок 10. Работа с UART интерфейсом
  • Урок 11. Работаем с DS1307 микросхемой часов реального времени
  • Урок 12. Работа с компьютерной PS/2 клавиатурой в BASCOM-AVR
  • Урок 13. Аппаратная ШИМ на микроконтроллере
  • Урок 14. Программный UART в BASCOM-AVR
  • Урок 15. Работа с датчиком температуры DS18B20 в BASCOM-AVR
  • Урок 16. Работа с энкодером в BASCOM-AVR
  • Урок 17. Использование бутлоадера в BASCOM-AVR
  • Урок 18. Работа с дисплеем от Nokia 3310
  • Урок 19. Работа с ультразвуковым датчиком расстояния HC-SR04 в BASCOM-AVR
  • Урок 20. Подключение семисегментного индикатора по трём проводам (74HC595)
  • Урок 21. BASCOM-AVR и Arduino

Схемы и устройства на микроконтроллерах:

  • Мини цифровая паяльная станция
  • Цифровая паяльная станция своими руками DSS-1
  • Цифровая паяльная станция 4 в 1 (DSS-2.1)
  • Станция для монтажа и демонтажа BGA и других SMD радио компонентов
  • Зарядное устройство-анализатор NiMh/NiCd аккумуляторов
  • Интеллектуальное зарядное устройство NiMh/NiCd аккумуляторов
  • Тестер АА аккумуляторов
  • Индикатор состояния заряда 12В аккумулятора
  • Два микроконтроллерных регулятора мощности
  • Автосвет — управление внешними световыми приборами авто
  • Бортовой тахометр на PIC16C84
  • Велокомпьютер на PIC16F628A и 4-разрядном LED индикаторе
  • Велокомпьютер своими руками
  • Timelapse выращивания микрозелени на Onion Omega 2+
  • Wi-Fi модули ESP8266 и AVR микроконтроллер
  • Связь МК при помощи RF модулей
  • Радиосвязь между двумя микроконтроллерами с применением RF-модулей
  • Радиореле на модуле NRF24L01
  • Интерфейс связи между GSM модулем SIM300 и микроконтроллером AVR ATmega32
  • Отправка и получение SMS, используя GSM модуль SIM300
  • Как связать микроконтроллер и компьютер по каналу RS-232
  • Радиоуправление тремя нагрузками на «RF модулях» с применением микроконтроллеров
  • Устройство радиоуправления на 12 команд
  • Устройство радиоуправления (радиоключ) на 3 команды
  • Устройство ДУ на 12 команд повышенной мощности
  • Электронные весы на базе HX711
  • Ультразвуковой контроль уровня воды на микроконтроллере 8051
  • Ультразвуковой дальномер
  • Мини радар, измеритель скорости
  • Связь по Bluetooth между STM32 и Android
  • GPS приемник своими руками на модуле EB-500 и AVR
  • Портативный GPS Data Logger
  • Акселерометр ADXL345
  • Акселерометр и гироскоп MPU6050
  • Тестер концентрации алкогольных паров на AVR
  • Простой электронный компас
  • Простейший ландромат
  • Интеллектуальный ландромат
  • Один купюроприемник и четыре аттракциона
  • Простой торговый автомат своими руками
  • Практическая реализация многоканального фазового регулятора на Attiny2313
  • Сопряжение с компьютером цифрового мультиметра серии 830
  • Электронный кодовый замок на ATmega8
  • Кодовый замок на PIC16F628A
  • Индикация места ключа (Часть1)
  • Индикация места ключа (Часть 2)
  • Кодовый замок
  • Переговорное устройство и хаб
  • RFID считыватель транспондеров TIRIS от Texas Instruments
  • Считыватель электронных ключей iButton (DS1990) на МК ATtiny2313
  • Электронный замок с ключами iButton
  • Охранное устройство с ключами iButton и датчиком удара
  • Датчик движения на PIC-микроконтроллере с применением PIR-сенсора
  • Охранное устройство с оповещением по телефонной линии
  • Охранное устройство «Лазерная растяжка»
  • Устройство многокомандного дистанционного управления для проведения пиротехнических шоу
  • Модуль автономного сброса
  • 4-х канальный контроллер нагрузок с управлением по UART
  • Контроллер 8 нагрузок на ATtiny13 с управлением по UART
  • USB устройство ввода-вывода на PIC18F4550 с 16 цифровыми I/O и 8 аналоговыми входами
  • Дата-логгер (регистратор аналоговых данных)
  • Устройство ввода вывода
  • USB Device
  • COM-терминал
  • Подключение и запуск мотора от FDD (JCM5044)
  • Простой тестер униполярных шаговых двигателей на ATtiny2313 и ULN2004
  • Микрошаговый драйвер из старого принтера на микроконтроллере ATmega32
  • Управление двумя шаговыми двигателями по UART
  • Датчик оборотов двигателя для контроллера
  • Отладочная плата для устройств на МК Atmega8/48/88/168/328
  • Отладочная плата для микроконтроллеров ATtiny13/15
  • Универсальная основа для контроллера с графическим интерфейсом на ATmega8 c OLED дисплеем
  • Простая отладочная плата на ATTINY2313
  • Отладочная плата AT90USB162
  • PIC16F877A — Отладочная плата
  • Набор для разработки на основе микроконтроллера PIC18F4520
  • Универсальная отладочная плата для AVR
  • Контроль 15-ти контактов одним входом PIC-микроконтроллера
  • Дисплейно-клавиатурный драйвер TM1638
  • Подключаем PS/2 клавиатуру к PIC
  • Подключение PS/2, AT клавиатуры к микроконтроллеру Attiny2313
  • Интерфейсная плата для связи клавиатуры PS2 с LCD-дисплеем на МК PICAXE
  • Клавиатурный датчик кода Морзе (PS/2 и PIC16F628A)
  • ABCom — компьютер на ATmega1284P
  • Электронные аксессуары для игры S.T.A.L.K.E.R.
  • Ну, погоди! — игра 80-ых
  • Электронная игра «Светодиодные наперстки»
  • Экономичные игральные кости на PIC12F629
  • Электронная игральная кость на ATtiny 2313
  • Игровая консоль на STM32 и LCD Nokia 5110
  • Игровая видеоконсоль на AVR AVGA
  • Контроллер кнопок для игры Brein Ring v2.0
  • USB шутка
  • USB шутка 2
  • Игра «разминируй бомбу»
  • Руль, джойстик и геймпад с обратной связью (Force Feedback)
  • Микроконтроллерный вирус и антивирус
  • USB Password Keeper
  • Почему одни микроконтроллеры надежнее других
  • Переходник ATmega8 TQFP в DIP
  • Вспомогательные модули для отладочных плат
  • Разгон ATmega328 (30 МГц)

Освещение, LED, ЖКИ и LCD:

  • Устройство мультимедиа (Multimedia device)
  • Простой тачскрин (touch screen) интерфейс на PIC
  • Сенсорный модуль на AVR
  • Простой тач-сенсор на AVR
  • Работаем с ЖКИ. Часть 1
  • Работаем с ЖКИ. Часть 2
  • LCD WH1602B компании Winstar
  • Обзор IPS дисплея 80х160 точек с контроллером ST7735
  • Обзор дисплея 128х160 точек с контроллером ST7735
  • Подключение и использование LCD Nokia 3310 (5110) к AVR-микроконтроллеру
  • Подключение дисплея от принтера HP LaserJet P2055 к микроконтроллеру
  • Подключение дисплея от кассового аппарата Меркурий 130К к микроконтроллеру
  • Подключение дисплея от кассового аппарата Элвес-Микро к микроконтроллеру
  • Генератор отрицательного напряжения для дисплея 1602 и подобных
  • Небольшой тест OLED дисплея Winstar WEH001602ALPP5N
  • Подключаем LCD от Siemens C75 и ME75 к STM32
  • Работа с дисплеем LPH8731-3C от телефонов Siemens
  • Особенности работы с дисплеем LPH9157-2
  • Библиотека для дисплея LPH9135
  • Библиотека для символьного дисплея на базе HD44780
  • TFT дисплей 3.2 с открытым исходным кодом
  • Подключаем дисплей Nokia1616 к BASCOM-AVR
  • Подключение графического ЖК-дисплея 128х64 KS0108 к AT89C52
  • Переходник ЖКИ HD44780 в UART
  • Устройство отображения информации на LCD-дисплее 16×2 с контролером HD44780
  • Электронная метка с ЖКИ на микроконтроллере
  • Подключение LCD-дисплея ST7565 к микроконтроллеру MSP430
  • Подключение монохромного дисплея на ST7565 к STM32
  • SSD1331 RGB OLED дисплей
  • Волоконно-оптическая светодиодная лампа на ESP
  • Программная реализация интерфейса управления TM1640 на ATmega
  • Советчик в кармане
  • Нет ЖКИ-драйвера – есть калькулятор!
  • Электронная читалка своими руками на микроконтроллере ATmega32
  • Подключение семисегментного индикатора по UART на ATtiny13
  • Динамическая индикация на светодиодных 7-сегментных индикаторах с программной регулировкой яркости
  • Еще раз о динамической индикации на LED-индикаторах
  • Подключение 4-разрядного LED индикатора всего к 4 портам микроконтроллера
  • Управление RGB-прожекторами
  • Простая мигалка на RGB светодиоде с использованием МК ATtiny2313 (ATtiny13)
  • Управление светодиодами WS2813 с адресацией с помощью ATtiny
  • Управление RGB светодиодом
  • RGB подсветка для чайника
  • Бегущая строка на PIC16F877 на 20 матрицах 8х8 или 160х8 пикселей
  • Бегущая строка 8×80 LED на PIC16F628
  • Бегущая строка 8×80 с набором текста на клавиатуре (PIC16F628)
  • Бегущая строка на PIC контроллере
  • Бегущая строка на ATmega168
  • Контроллер светодиодной ленты на ATtiny13a
  • Светодиодная гирлянда на микроконтроллере
  • Простая светодиодная гирлянда на МК Attiny13
  • POV — Светодиодная подсветка велосипедных колес на MSP430
  • Бегущая строка с механической разверткой
  • DMX512 Контроллер на 40 каналов
  • PixelPOI
  • Светодиодная матрица – МОДЖЕТ
  • Эффект Fade Out для LED при помощи ШИМ (PIC)
  • 3-х канальный ШИМ регулятор на Attiny2313
  • Многоканальный фазовый регулятор на ATtiny2313
  • ШИМ-регулятор на AVR
  • Регулятор яркости подсветки на датчике BH1750
  • Светофор своими руками
  • Устройство имитации работы светофора на микроконтроллере PIC16F84A
  • Светофор на PIC12F629 с «неправильной» программой
  • Светофор на ATtiny13
  • Имитация светофора
  • Управление светодиодом на МК Attiny13
  • Эффект горящей свечи на ATTiny
  • АЦП на TINY13 и 16 светодиодов
  • Новогодняя лампа-ночник из RGB-светодиодов на плате LaunchPad MSP-EXP430, управляемая ИК-пультом
  • Ночник на микроконтроллере
  • ИК пульт на MSP430 Lanchpad
  • Доработка китайского налобного фонарика
  • LED светильник с ШИМ и таймером
  • Контроллер люстры с 6 лампами
  • Адаптер двухканального светового шнура
  • Контроллер двухцветного светового шнура Flexilight
  • Прокачай свой монитор. Собери интерактивную фоновую подсветку

Аудио:

  • Анализатор свиста на Cortex-M4 или включение нагрузки по свистку
  • Передача звука по радиоканалу с использованием кодека Speex
  • Визуализация аудио сигнала на Nokia 3310 LCD
  • Аудио анализатор спектра на Atmega32
  • Простой SD аудио-плеер
  • MMC/SD WAV стерео плеер на ATmega32 с пультом управления от ТВ
  • SD WAV плеер с управлением по UART
  • Воспроизведение видео на цветном ЖК-дисплее Nokia с помощью 8 битного AVR микроконтроллера Atmega32
  • Вторая жизнь Creative Sound Blaster
  • MP3 плеер своими руками
  • Воспроизведение нот на PIC
  • Воспроизведение звука на PIC
  • Пианино на микроконтроллере PIC18F4550
  • Эффект эхо (echo) на микроконтроллере Atmega32
  • MMC/SD диктофон на PIC16F877A
  • Музыкальный звонок с тайной кнопкой
  • Музыкальный звонок на МК Attiny13
  • Музыкальный звонок с возможностью замены мелодий без использования программатора
  • Музыкальный звонок, который умеет всё (Z80)
  • Дверной звонок

Часы и таймеры:

  • Говорилка mp3. Ламповые часы
  • Часы на газоразрядных индикаторах
  • Часы на газоразрядных индикаторах V2.0
  • Nixie Clock «King Size»
  • Электронные часы-будильник на газоразрядных индикаторах и МК
  • ИВ-11 — часики с эффектами
  • Часы на газоразрядных индикаторах с ATmega8
  • Часы в стиле стимпанк на газоразрядных индикаторах
  • Часы на ВЛИ индикаторе ИВ-18
  • Часы на индикаторе ИВ-18
  • Радио, о радио! А так же ИН-18
  • ИВ-9. Часы, эффекты, боль и кое что еще
  • Делаем светодиодные часы CxemWatch-v1 на ATmega328p
  • Наручные часы на ГРИ (по проекту Bars)
  • Многофункциональные часы-термостат с дистанционным управлением
  • Музыкальные часы с термометрами на PIC16F873A
  • Шахматные часы — сувенир
  • Многофункциональные наручные LED часы
  • Говорящие часы
  • Часы/календарь на МК ATTiny2313 и RTC DS1305
  • Часы ATtiny 2313, DS1302, TM1637 на ассемблере
  • Часы на DS3231 и AVR-микроконтроллере
  • Часы на PCA21125 и AVR-микроконтроллере
  • Часы – суточный таймер с коррекцией хода
  • Часы на кварцевом резонаторе 4МГц
  • Часы на PIC16F877A
  • Часы на PIC16F628A и FYQ3641A
  • Компактные часы со светодиодными индикаторами
  • Часы на PIC-микроконтроллере
  • Часы с автоматической регулировкой яркости, сенсорными кнопками и т.д.
  • Часы на Attiny2313
  • LED часы на Attiny2313 и DS1307
  • Часы на ATtiny2313, DS1307 и ЖКИ индикаторе 8*2
  • Часы с несколькими функциями на AVR
  • Будильник радио
  • Часы-будильник с термометром
  • Часы — календарь
  • Говорящие часы — термометр с календарем
  • Цифровые часы на RTC DS12C887 и 8051
  • RTC на STM8L-Discovery
  • Библиотека для работы с шиной I2C и с часами реального времени PCF8583
  • Часы на PCF8523 и AVR-микроконтроллере
  • Часы Detonator Clock
  • Двоичные часики на ATmega8
  • Простые бинарные часы
  • USB счетчик посещений на микроконтроллере AVR ATtiny25
  • Система автоматической подачи звонков на AVR
  • Реле времени
  • Таймер 0…9999 секунд для засветки фоторезиста на ATtiny13
  • Бытовой таймер на PIC-микроконтроллере
  • Простой таймер на PIC16F84A
  • Таймер на PIC
  • Таймер обратного отсчёта на МК Attiny2313
  • Таймер обратного отсчета на МК ATmega8 + ЖКИ 8х2 или 16х1
  • Таймер обратного отсчета на 0-9999 секунд на PIC12F683
  • Многофункциональный циклический таймер
  • Устанавливаем в корпус многофункциональный циклический таймер

Измерение температуры, термостаты и терморегуляторы на микроконтроллерах:

  • Метеостанция на STM32
  • Комнатная метеостанция
  • WiFi ESP8266 — новый шаг в проектировании домашних устройств с беспроводным интерфейсом
  • Обмен данными датчика BME280 c ПК
  • Беспроводной измеритель температуры и влажности с USB-интерфейсом
  • Измеритель влажности и температуры
  • Датчик температуры и относительной влажности с адаптивной регулировкой яркости индикатора
  • Простой измеритель температуры
  • LCD-термометр
  • USB термометр
  • Bluetooth термометр
  • Bluetooth термометр на AVR (Arduino)
  • Термометр на PIC
  • Термометр на датчике SE97B и AVR-микроконтроллере
  • Цифровой термометр на датчике LM75AD
  • Подключение датчика температуры окружающей среды DS18B20 к микроконтроллеру
  • Термометр на DS18B20
  • Термореле с цифровым датчиком температуры
  • Сдвоенный цифровой термометр на ATmega8 и DS18B20
  • Простой термометр для дома с двумя датчиками DS18B20
  • Термометр на МК Attiny13 и датчике DS18B20
  • Необычный термометр на ATtiny13 и DS18B20
  • Декоративный термометр на микроконтроллере
  • Термометр на AT89C2051 и DS18B20
  • Универсальный двухканальный термометр на AVR
  • Многоточечный термометр
  • Термометр на STM8L-Discovery
  • XControl
  • LAN Control — система удаленного управления через локальную сеть, интернет и ПДУ
  • Электронный термостат и сигнализатор температуры на PIC16C84
  • Термостат на PIC16F877A и LCD NOKIA 3310
  • Простой терморегулятор
  • Терморегулятор с предварительной установкой 4-х температур контроля для термометра помещения
  • Терморегулятор на PIC
  • Программируемый термостабилизатор
  • Барометр на AVR
  • Часы, термометр, термостат, будильник, система удалённого управления
  • Часы + термометр на PIC16F628A и LED индикаторах

Измерения, генераторы:

  • 30В вольтметр на MSP430
  • Многоканальный дистанционный вольтметр
  • Малогабаритный частотомер-цифровая шкала до 200 МГц с ЖКИ дисплеем
  • Частотомер до 16 МГц на микроконтроллере
  • Самодельный осциллограф на микроконтроллере AVR
  • Осциллографический пробник на ATmega8
  • Цифровой LCD-осциллограф
  • USB-осциллограф
  • Генератор сигналов на МК ATtiny2313
  • Функциональный DDS-генератор
  • DDS генератор
  • Определитель цвета
  • Цифровой дозиметр Гамма_1

Программаторы, восстановление МК, прошивка:

  • Клон AVR JTAG ICE
  • Китайский JTAG ICE для AVR и установка драйверов
  • Клон PICkit 2
  • PURPIC, переносной клон PICkit2
  • Простой USB программатор PIC
  • Простейший программатор для PIC
  • Простой программатор PIC-контроллеров с использованием PicPgm
  • Программатор для PIC-контроллеров
  • Сохранение калибровочной константы для контроллеров PIC 12F629 и 12F675
  • Как сделать простой программатор для PIC-ов и AVR-ов
  • Программатор для микроконтроллеров AT89C51/52/55
  • Простой программатор
  • USBasp — USB программатор для микроконтроллеров Atmel AVR
  • Доработка программатора USBasp
  • VUSBTiny программатор
  • USB программатор параллельных Flash и EEPROM микросхем памяти
  • USB программатор параллельных Flash и EEPROM микросхем памяти. Продолжение
  • Универсальный USB программатор для МК AVR, I2C EEPROM и SPI Flash 25ХХ
  • Универсальный USB-программатор
  • Адаптер ZIF SOIC для программатора
  • Универсальный адаптер-программатор
  • Универсальный адаптер для Atmel STK500
  • Компактный программатор USBTiny-MkII SLIM (клон AVRISP-MKII)
  • Программатор ATtiny84 USBtiny AVR ISP
  • AVR-программатор ULTI-SP
  • USB программатор микроконтроллеров AVR и AT89S, совместимый с AVR910
  • Программатор Громова для ATmega8A-PU
  • AVR-программатор на PIC
  • Универсальный программатор
  • Исправление фузов AVR
  • Устройство оживления микроконтроллеров Atmel
  • SinaProg + ATmega328P исправляем прошивку фьюзов
  • Программатор для КР573РФ5
  • Модуль оптронной изоляции для внутрисхемной отладки и SPI-программаторов
  • Внутрисхемное программирование и отладка микроконтроллеров Microchip
  • Программирование микроконтроллеров AVR в Ubuntu
  • Программирование микроконтроллеров AVR в Ubuntu-2 (GUI)
  • STM32F4DISCOVERY: Работа с ARM Cortex M4

Что такое микроконтроллер

Микроконтроллер по сути является микросхемой, который состоит из:

  • Центрального процессора. В него входят блок управления, регистры, ПЗУ (постоянное запоминающее устройство).
  • Периферии, которая включает порты ввода-вывода, контроллеры прерываний, таймеры, генераторы различных импульсов, аналоговые преобразователи и подобные элементы.

Зачастую микроконтроллер называют микропроцессором. Но это не совсем так. Последний осуществляет только определенные математические и логические операции. А в состав микроконтроллера входит и микропроцессор с другими элементами, являясь лишь частью МК.

Что такое регистр?

Регистр (англ. register) – это устройство, расположенное внутри ядра микроконтроллера (или процессора), для хранения n-разрядных двоичных данных и выполнения преобразований над ними. Скорость их работы очень высока. Регистр представляет собой упорядоченный набор триггеров, или переключателей (англ. trigger), способных принимать значение «0» (потенциал равен 0 вольт) или «1» (потенциал равен рабочему напряжению для внутренностей МК, в нашем случае это 1,8 вольта). Число триггеров n соответствует числу разрядов в слове. В свою очередь, машинное слово — платформозависимая величина, измеряемая в битах (или байтах) и равная разрядности регистров процессора и/или разрядности шины данных. Так, например, наш микроконтроллер является 32-разрядным, а это значит, что слово состоит из 32 бит (или из 4 байт). Специальные регистры — это часть RAM-памяти. Их функции определены производителем и не могут быть изменены. Все биты (триггеры) такого регистра подсоединены к определенным цепям внутри микроконтроллера, т. е. изменение состояния триггера напрямую влияет на работу микроконтроллера (отдельных его частей/цепей). Например, записав «0» в ячейку памяти регистра, отвечающего за порт ввода/вывода, вы определяете его функцию: будет он работать на вход (т. е. принимать сигналы) или на выход (т. е. посылать сигналы).

Так как мы будем использовать язык программирования Си, то будет правильно напомнить некоторые операции, которые позволят нам быстро и удобно настраивать необходимые биты в регистре. Первое, что стоит вспомнить – это операции побитового смещения. Допустим, нам нужно получить число 8. Мы уже знаем что 810 равно 10002. Таким образом, чтобы получить 8, нам всего-то нужно передвинуть в памяти «1» на три позиции влево. Сделать это можно так:

xxxxxxxxxx

mask = 1 << 3; // mask = 8

Бит, который хотим изменить, мы будем называть маской. Маска позволит нам обращаться к нужному биту регистра непосредственно.

Однако нам также потребуются побитовые логические операции «И», «ИЛИ» и «НЕ». Для того, чтобы записать «1» в нужный бит регистра, мы можем побитово воздействовать на регистр маской, применяя операцию «ИЛИ». Вспомним таблицу истинности:

ABA | B
000
011
101
111

Как видно, если в бите регистра была «1», то мы не затрем её своей маской и изменим только интересующий нас бит. Сделать это можно так:

xxxxxxxxxx

uint32_t mask = 1 << 3;

// reg = 0000 0000 0000 0000 0000 0000 0000 0100; reg = reg | mask; // reg = 0000 0000 0000 0000 0000 0000 0000 1100;

или так:

xxxxxxxxxx

reg |= mask;

Для того чтобы записать «0» в необходимый бит, нам потребуется операция «И», таблица истинности которой изображена ниже:

ABA & ¬B
000
010
100
111

Как видно, мы сотрем все биты, где не содержится «1». Перед тем как мы применим эту операцию, нужно инвертировать маску (т. е. применить операцию «НЕ»):

xxxxxxxxxx

mask = mask;

// mask = 0000 0000 0000 0000 0000 0000 0000 1000 // ~mask = 1111 1111 1111 1111 1111 1111 1111 0111 reg = reg & (~mask);

Теперь применим операцию «И» к регистру, используя модифицированную маску:

xxxxxxxxxx

// reg = 0000 0000 0000 0000 0000 0000 0000 1100;

reg = reg & (~mask);

Короткая запись выглядит так:

xxxxxxxxxx

reg &= ~mask;

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

Принцип работы микроконтроллера

Несмотря на сложное устройство принцип работы микроконтроллера очень прост. Он основан на аналоговом принципе действия. Система понимает лишь две команды («есть сигнал», «нет сигнала»). Из этих сигналов в его память вписывается код определенной команды. Когда МК считывает команду, он ее выполняет.

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

В зависимости от содержащихся в МК набора программ, они делятся на:

CISC – комплекс большого числа базовых команд;

RISC – только необходимые команды.

Большинство контроллеров содержит RISC набор. Объясняется это тем, что такой МК проще изготовить, он дешевле и больше пользуется спросом у разработчиков электронной техники.

Как работает микроконтроллер

Ну вообще вы можете об этом узнать, если внимательно прочитаете руководство на конкретный микроконтроллер. Но если сказать упрощённо, то микроконтроллер работает примерно так:

  • При включении питания выполняется сброс всех модулей микроконтроллера в исходное состояние, а программа загружается в оперативную память и начинает выполняться. Обычно программа выполняется в цикле. То есть все команды выполняются последовательно одна за одной. После выполнения последней команды вновь выполняется первая и так до бесконечности — пока не будет отключено питания или выполнен сброс.
  • Тактовый генератор задаёт тактовую частоту. Это позволяет синхронизировать по времени все процессы, происходящие внутри микроконтроллера. Например, если тактовая частота 1000 Гц, то это означает, что за одну секунду генератор выдаёт 1000 тактовых сигналов.
  • Каждый микроконтроллер имеет определённый набор команд (инструкций), из которых и состоит программа. Например, есть команда для чтения входа, есть команда для установки выхода, есть команды для выполнения арифметических операций и т.е.
  • Выполнение каждой команды программы занимает один или несколько тактов. Например, если команда занимает 2 такта, то это означает, что при тактовой частоте 1000 Гц она выполняется за 1 / (1000 / 2) = 0,002 с. Если в нашей программе будет 100 таких команд, то это будет означать, что вся программа будет выполнена за 0,002 * 100 = 0,2 секунды. Это, конечно, упрошённо. Но суть, я думаю, вы уловили.
  • Программа, как правило, считывает какие-то входные значения, обрабатывает их, и выдаёт на выходы сигналы в соответствии с логикой программы. Например, у нас есть новогодняя гирлянда с двумя режимами работы (пусть это будут “бегущий огонь” и “бегущая тень”), которые устанавливаются переключателем. Тогда микроконтроллер, в зависимости от того, на какой вход замкнут переключатель (какой режим выбран), будет через определённые промежутки времени поочерёдно подавать сигнал на выходы (зажигать светодиод — бегущий огонь), или снимать сигнал с выхода (гасить светодиод — бегущая тень). Временные промежутки также программируются при создании программы.

То есть упрощённый принцип работы МК такой:

  • Прочитать входы
  • Обработать полученные данные
  • Установить выходы

Назначение и область применения микроконтроллера

Благодаря тому, что микроконтроллеры AVR очень просты в использовании, обладают высокой способностью интегрирования и низкой потребляемой мощностью, области их применения разнообразны:

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

Это не полный перечень областей применения МК.

Основное назначение МК – контролировать все процессы, которые происходят на его платформе. От включения или выключения света по хлопку до поднятия штор при изменении освещенности на улице. По сути, МК осуществляет контроль за состоянием неких переменных и изменение системы в динамических условиях.

Пример применения микроконтроллера Ардуино

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

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

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

Питание микроконтроллера

Для работы микроконтроллеру, как и любому электронному устройству, необходима энергия. Напряжение МК Atmel AVR находится в диапазоне 1.8–5.5 Вольт и зависит от модели и серии. Большинство приборов работает от 5 Вольт. Но встречаются и низкочастотные модели (Attiny 2313), нижняя граница у которых от 1,8 В.

Кроме того, на работу МК влияет и частота поступающего тока. Низкое напряжение требует и низких пределов частот. Чем выше частота, тем быстрее работают определенные модели.

Так, чтобы обеспечить работу контроллеров серии AVR, на все плюсовые входы нужно подавать 5 В, а нулевой заземляют.

Если у модели несколько вводов и выводов питания, то подключать их нужно все.

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

Кроме того, необходимо установить и конденсаторы, лучше керамические, из расчета 1 на 100 нанофарад.

Электроника для всех

Микроконтроллер

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

Но, если сильно все упростить, то основной функцией микроконтроллера является «дрыганье ножками». Т.е. у него есть несколько выводов (от 6 до нескольких десятков в зависимости от модели) и на этих выводах он может выставить либо 1 (высокий уровень напряжения, например +5вольт), либо 0 (низкий уровень напряжения, около 0.1 вольта) в зависимости от программного алгоритма зашитого в его память. Также микроконтроллер может определять состояние сигнала на своих ножках (для этого они должны быть настроены на вход) — высокое там напряжение или низкое (ноль или единица). Современные микроконтроллеры также почти поголовно имеют на борту Аналогово Цифровой Преобразователь — это штука подобная вольтметру, позволяет не просто отследить 0 или 1 на входе, а полноценно замерить напряжение от 0 до опорного (обычно опорное равно напряжению питания) и представить его в виде числа от 0 до 1024 (или 255, в зависимости от разрядности АЦП)

Из него можно сделать и умный дом, и мозги для домашнего робота, систему интеллектуального управления аквариумом или просто красивое светодиодное табло с бегущим текстом. Среди электронных компонентов МК это один из самых универсальных устройств. Я, например, при разработке очередного устройства предпочитаю не заморачиваться на различного рода схемотехнические извраты, а подключить все входы и выходы к микроконтроллеру, а всю логику работы сделать программно. Резко экономит и время и деньги, а значит деньги в квадрате.

Микроконтроллеров существует очень и очень много. Практически каждая уважающая себя фирма по производству радиокомпонентов выпускает свой собственный контроллер. Однако и в этом многообразии есть порядок. МК делятся на семейства, все их я не перечислю, но опишу лишь самые основные восьмиразрядные семейства. MSC-51

Самое обширное и развитое это
MSC-51
, старейшее из всех, идущее от
intel 8051
и ныне выпускаемое массой фирм. Иногда кратко зовется
С51
. Это 8-ми разрядная архитектура, отличается от большинства других восьмиразрядников тем, что это
CISC
архитектура. Т.е. одной командой порой можно совершить довольно сложное действие, но команды выполняются за большое число тактов (обычно за 12 или 24 такта, в зависимости от типа команды), имеют разную длину и их много, на все случаи жизни. Среди контроллеров архитектуры
MSC-51
встречаются как динозавры вроде
AT89C51
, имеющие минимум периферии, крошечную память и неважнецкое быстродействие, так и монстры вроде продукции
Silicon Laboratories
имеющие на борту весьма мясистый фарш из разнокалиберной периферии, огромные закрома оперативной и постоянной памяти, мощные интерфейсы от простого
UART
‘a до
USB
и
CAN
, а также зверски
быстрое ядро
, выдающее до 100 миллионов операций в секунду. Что касается лично меня, то я обожаю архитектуру С51 за ее чертовски приятный ассемблер на котором просто кайфово писать. Под эту архитектуру уже написаны гигабайты кода, созданы все мыслимые и немыслимые алгоритмы.

Atmel AVR

Вторым моим любимым семейством является
AVR
от компании
Atmel
. Вообще
Atmel
производит и
MSC-51
контроллеры, но все же основной упор они делают на
AVR
. Эти контроллеры уже имеют 8-ми разрядную
RISC
архитектуру и выполняют одну команду за один такт, но в отличии от классического
RISC
ядра имеют весьма развесистую систему команд, впрочем не такую удобную как у С51, за что я их недолюбливаю. Но зато
AVR
всегда снаряжены как на войну и просто напичканы разной периферией, особенно контроллеры подсемейства
ATMega
. А еще их очень легко прошивать, для этого не нужны ни специализированные программаторы, ни какое либо другое сложное обрудование. Достаточно лишь пяти проводков и компьютера с
LPT
портом. Простота освоения позволила этому контроллеру прочно запасть в сердца многих и многих радиолюбителей по всему миру.

Microchip PIC

. Еще один 8-ми разрядный
RISC
микроконтроллер, отличается весьма извратской системой команд, состоящей всего из пары десятков команд. Каждая команда выполняется за четыре такта. есть ряд достоинств, в первую очередь это низкое энергопотребление, и быстрый старт. В среднем
PIC
контроллере нет такого количества периферии как в AVR, но зато самих модификаций
PIC
контроллеров существует такое количество, что всегда можно подобрать себе кристалл с периферией подходящей точно под задачу, не больше не меньше. На
PIC
‘ax традиционно построены бортовые компьютеры автомобилей, а также многочисленные бытовые сигнализации.

Какое же семейство выбрать? О, это сложный вопрос. На многочисленных форумах и конференциях по сей день идут ожесточенные бои на тему какое семейство лучше, фанаты AVR

грызутся с приверженцами
MSC-51
, попутно не забывая пинать по почкам
PIC
‘овцев, на что те отвечают тем же.

Ситуация тут как в Starcraft :) Кто круче? Люди? Зерги? Протоссы? Все дело в применении, масштабах задач и массе других параметров. У каждого семейства есть свои достоинства и недостатки. Но лично я бы выбрал AVR и вот по каким причинам:

  • 1. Доступность в России. Эти контроллеры заслуженно популярны и любимы народом, а значит наши торговцы их охотно возят. Впрочем, как и PIC. С MSC-51 ситуация хуже. Морально устаревшие AT89C51 достать не проблема, но кому они нужны? А вот современные силабы это уже эксклюзив.
  • 2. Низкая цена. Вообще низкой ценой в мире славится PIC, но вот ирония — халявы начинаются только если брать его вагонами. На деле же, на реальном прилавке, AVR будет процентов на 30-40 дешевле чем PIC при несколько большем функционале. С MSC-51 ситуация ясна еще по первому пункту. Эксклюзив это не только редко, но и дорого.
  • 3. Очень много периферии сразу. Для серийного устройства это скорей недостаток. Куда лучше иметь только то, что надо в текущей задаче, а остальное чтобы не мешалось и не кушало зря энергию. Этим славится PIC со своим развесистым модельным рядом, где можно найти контроллер в котором будет нужное и не будет ненужного. Но мы то собираемся изучать и делать для себя! Так что нам лучше чтобы все, сразу и про запас. И вот тут AVR на голову выше чем PIC, выкатывая раз за разом все более фаршированные контроллеры. Купил себе какую-нибудь AtMega16A и все, можешь все семейство изучить.
  • 4. Единое ядро. Дело в том, что у всех современных AVR одинаковое ядро с единой системой команд. Есть лишь некоторые различия на уровне периферии (и те незначительные). Т.е. код из какой нибудь крошечной ATTiny13 легко копипастом перетаскивается в ATMega64 и работает почти без переделок. И почти без ограничений наоборот. Правда у старых моделей AVR (всякие AT90S1200) совместимость сверху вниз ограниченная — у них чуть меньше система команд. Но вот вверх на ура. У Микрочипа же существует целая куча семейств. PIC12/16/18 с разной системой команд. 12е семейство это обычно мелочь малоногая (вроде Tiny в AVR), а 18 это уже более серьезные контроллеры (аналог Mega AVR) И если код с 12го можно перетащить на 18, то обратно фиг.
  • 5. Обширная система команд контроллеров AVR. У AVR около 130 команд, а у Microchip PIC всего 35. Казалось бы PIC в выйгрыше — меньше команд, проще изучить. Ну да, именно так и звучит микрочиповский слоган, что то вроде «Всего 35 команд!». Только это на самом деле фигня. Ведь что такое команда процессора? Это инструмент! Вот представь себе два калькулятора — обычный, бухгалтерский и инженерный. Бухгалтерский куда проще изучить чем инженерный. Но вот попробуй посчитать на нем синус? Или логарифм? Нет, можно, не спорю, но сколько нажатий кнопок и промежуточных вычислений это займет? То то же! Куда удобней работать когда у тебя под рукой куча разных действий. Поэтому, чем больше система команд тем лучше.
  • 6. Наличие бесплатных кроссплатформенных компиляторов Си. Конечно, кряк всегда найти можно. Где где, а в нашей стране это проблемой никогда не было. Но зачем что то воровать если есть халявное? ;)
  • 7. Ну и последний аргумент, обычно самый весомый. Наличие того, кто бы научил и подсказал. Помог советом и направил на путь истинный. Я выбрал для себя AVR и на этом сайте (по крайней мере пока) досконально будет разбираться именно это семейство, а значит выбора у тебя особого нет :))))))

Ой, но этих же AVR целая прорва. Какой взять???

Интересный вопрос. Вообще МК лучше выбирать под задачу. Но для изучения лучше хапнуть что то фаршированное.

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

ATmega16А — 16PI

  • AT
    — сделано в Atmel
  • Mega
    — вид семейства. Существует еще Tiny и Xmega (новая — фаршу жуть, полный вертолет). Вообще задумывалось, что Тини это, вроде как, малобюджетное с малым количеством фарша и вообще ущербная, а Мега наоборот — все и сразу. В реальности, разница между семействами Тини и Мега по фаршу сейчас минимальная, но в Тини меньше памяти и корпуса у нее бывают с числом выводов от 6 до 20.
  • 16
    — количество памяти флеша в килобайтах. Вообще тут не все так просто. Числом памяти является степень двойки. Так что Mega162 это не контроллер со 162КБ флеша, а своеобразная Мега16 модификации2 с памятью 16кб. Или вот Мега88 — не 88кб, а 8кб флеша, а вторая 8 это вроде как намек на то, что это дальнейшее развитие Мега8. Аналогично и Мега48 или Мега168. Тоже самое и семейством Тини. Например, Тини2313 — 2килобайта флеша. А что такое 313? А хрен знает что они имели ввиду :) Или Тини12 — 1кб Флеша. В общем, фишку просек.
  • А
    — префикс энергопотребления (обычно). Этой буквы может и не быть, но в новых сериях она присутствует почти везде. Например, V и L серии — низковольтные, могут работать от 2,7 вольт. Правда за низковольтность приходится платить меньше частотой. Но оверклокинг возможен и тут, ничто человеческое нам не чуждо :) A и P имеют новые серии AVR с технологией PicoPower т.е. ультраэкономичные. Разницы по фаршу и внутренней структуре с их безиндексовыми моделями нет, тут все различие в работе всяких спящих режимов и энергопотреблении. Т.е. Mega16A легко меняется на Mega16 без А. И ничего больше менять не нужно.
  • 16
    — Предельная тактовая частота в мегагерцах. В реальности можно разогнать и до 20 ;)
  • P
    — тип корпуса. Важная особенность. Дело в том, что далеко не всякий корпус можно запаять в домашних условиях без геморроя. Рекомендую пока обратить внимание на P — DIP корпус. Это громоздкий монстр, но его легко запаять, а, главное, он легко втыкается в специальную панельку и вынимается из нее обратно. Корпуса вида SOIC (индекс S) или TQFP (индекс A) пока лучше отложи в сторонку. Без хорошего опыта пайки и умения вытравить качественную печатную плату к ним лучше не соваться.
  • I
    — Тип лужения выводов. I — свинцовый припой. U — безсцвиновый. Для тебя никакой совершенно разницы. Бери тот что дешевле.

Рекоменую следующие модели:

  • ATMega16A-16PU — недорогой (около 100-150р), много выводов, много периферии. Доступен в разных корпусах. Прост, под него заточен мой учебный курс и все дальнейшие примеры.
  • ATTiny2313-20SU — идеальный вариант для изготовления всяких часов/будильников и прочей мелкой домашней автоматики. Дешев (рублей 40), компактен. Из минусов — нет АЦП.
  • ATmega48/88/168 любой из этих контроллеров. Компактен (в корпусе tqfp является самым тонким и мелким из AVR), дешев (рублей 100-150), фарширован донельзя.
  • ATmega128 для искушенных. Большой, мощный, дофига памяти. Дорогой (около 400р)

Подключение

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

Ethernet – это набор стандартов IEEE 802.3, которые описывают разнообразные технологии локальных сетей: общий канальный уровень и набор технологий физического уровня, включающий в себя для передачи информации оптоволокно, витую пару, коаксиал с различными скоростями.

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

  1. Физический. Состоит из витой пары, драйверов и трансформаторов, по которым происходит передача данных.
  2. Канальный. Через него передаются Ethernet-фреймы между узлами локальной сети.
  3. Сетевой. По нему происходит передача пакетов. Они могут передаваться через несколько сетей, различающихся по технологиям физического и канального уровней.
  4. Транспортный. Связывает узлы между собой. Перед отправкой данных транспортный уровень представляет их в виде пакета сетевого уровня и передает другому узлу. Он может отправлять и группы пакетов одновременно. Если используется протокол с установкой соединения, то перед отправкой транспортный уровень устанавливает соединение, контролирует его качество, а только потом передает пакет данных.
  5. Прикладной. Решает прикладные задачи, те, ради которых создавался. С внешним миром он обменивается данными по стандартному или эксклюзивному протоколу.

Каждый из последующих уровней обслуживается предыдущим или нижележащим. Так образуются вертикальные межуровневые связи. Особенности обслуживания каждого уровня скрыты от остальных.

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

Управление микроконтроллером

Управление МК может осуществляться двумя способами:

  1. Проводной путь. Управление исполнительными механизмами происходит через электропроводное соединение управляющих цепей и исполнительных механизмов. Включение — по нажатию кнопки на диспетчерском пункте или кнопочном пульте.
  2. Беспроводной путь. Такой способ управления не требует проводного соединения. С передатчика или пульта дистанционного управления (ПДУ) передается сигнал, который идет на приемник.

Сигналы беспроводного соединения могут быть:

  • Оптическими. Подобными сигналами управляется домашняя бытовая техника: телевизоры или кондиционеры.
  • Радио. Есть несколько вариантов: Wi-Fi, Bluetooth и др.

Развитие современных средств связи позволяет управлять контроллерами как через ПДУ, находясь в непосредственной близости к прибору, так и по интернету из любой точки мира через локальную сеть.

Обеспечивает поддержку cети Wi-Fi МК ESP 8266. В продаже он может быть в виде микросхемы или распаян, как arduino. У него 32-битное ядро, программировать его нужно через последовательный порт UART. Бывают более продвинутые платы с возможностью прошивки по USB – это NodeMCU. Они могут хранить информацию, записанную, например, с датчиков. Такие платы работают с различными интерфейсами, в т. ч. SPI, I2S.

Поддерживает большое число функций:

  • планировщик задач;
  • таймер;
  • канал АЦП;
  • формирование на выходе ШИМ сигнала;
  • аудиопроигрыватель и многое другое.

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

Структурная схема AVR микроконтроллера

Посмотрим на рисунок ниже и разберемся из каких блоков состоит микроконтроллер и как они связаны между собою:

Рис. 2. Структурная схема AVR микроконтроллера.

Рассмотрим кратко что изображено на блоках в схеме:

  • JTAG Interface (Joint Test Action Group Interface) — интерфейс внутрисхемной отладки (4 провода);
  • FLASH — перепрограммируемая память для сохранения программы;
  • Serial Peripheral Interface, SPI — последовательный периферийный интерфейс (3 провода);
  • EEPROM (Electrically Erasable Programmable Read-Only Memory) — перепрограммируемое ПЗУ, энергонезависимая память;
  • CPU (ЦПУ) — центральный процессор управления, сердце микроконтроллера, 8-битное микропроцессорное ядро;
  • ALU (АЛУ) — арифметико-логическое устройство, основа блока CPU;
  • RAM (Random Access Memory) — оперативная память процессора;
  • Program Counter — счетчик команд;
  • 32 General Purpose Registers — 32 регистра общего назначения;
  • Instruction Register — регистр команд, инструкций;
  • Instruction Decoder — декодер команд;
  • OCD (On-Chip Debugger) — блок внутренней отладки;
  • Analog Comparator — аналоговый компаратор, блок сравнения аналоговых сигналов;
  • A/D Converter (Analog/Digital converter) — аналогово-цифровой преобразователь;
  • LCD Interface (Liquid-Crystal Display Interface) — интерфейс для подключения жидко-кристаллического дисплея, индикатора;
  • USART (Universal Asynchronous Receiver-Transmitter), UART — универсальный асинхронный приемопередатчик;
  • TWI (Two-Wire serial Interface) — последовательный интерфейс с двухпроводным подключением;
  • Watchdog Timer — сторожевой или контрольный таймер;
  • I/O Ports — порты вода/вывода;
  • Interrupts — блок управления и реакции на прерывания;
  • Timers/Counters — модули таймеров и счетчиков.

Тактирование микроконтроллеров

Тактовая частота МК – это количество тактов за секунду, выполняемых контроллером. Чем она выше, тем большее количество операций он может выполнить.

Существуют несколько способов тактирования МК. Они зависят от использования:

  • Внутреннего RC-генератора. Он может работать только на частоте 1, 2, 4, 8 МГц. Если нужна другая частота, то он не подойдет. При необходимости использования точных временных интервалов тоже нельзя пользоваться этим методом, т. к. его задающая частота колеблется в зависимости от температуры.
  • Внешнего кварца. Этот способ имеет более сложное подключение. Емкость конденсатора должна находиться в интервале 15–22 пФ. Один выход присоединяется к резонатору, а другой заземляется.
  • Внешнего генератора. Этот генератор также нестабилен при разной температуре, как и внутренний.
  • RС-цепочек. Для данной схемы подойдет конденсатор емкостью от 22 пФ, резистор 10–100 кОм.

Для простейших микроконтроллеров подойдут внутренний или внешний генератор и RC-цепочки. Для проектирования более точных МК потребуются стабильные источники тактирования.

Подробнее о внутренних блоках микроконтроллера

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

JTAG Interface — важный интерфейс который позволяет производить внутреннюю отладку прямо в чипе используя блок внутренней отладки (OCD), без использования эмуляторов. Можно сказать что JTAG — это интерфейс для «железной» отладки микроконтроллера. Через JTAG-адаптер микросхема напрямую подключается к программному комплексу для программирования и отладки.

Используя данный интерфейс можно в пошаговом режиме выполнять программу прямо в микроконтроллере, смотреть как изменяется содержимое регистров, как мигают индикаторы и светодиоды что подключены к микроконтроллеру после каждого шага и т.п. Для подключения к JTAG интерфейсу достаточно 4-х проводников: TDI(Test Data In), TDO(Test Data Out), TCK(Test Clock), TMS (Test Mode Select).

JTAG интерфейс доступен далеко не во всех микроконтроллерах AVR, как правило таким вкусным дополнением обладают чипы у которых 40 и более лапок, а объем памяти доступен в размере не менее 16КБ. Для серьезных задач — серьезные материалы и инструменты. )

FLASH — память программ, энергонезависимое ПЗУ(постоянное запоминающее устройство) что выполнено по технологии FLASH. Здесь хранится программа, которая будет исполняться блоком ALU микроконтроллера. Флешь-память чипа можно многократно перезаписывать, тем самым меняя или дополняя программный код для выполнения. Данный тип памяти может сохранять записанные в нее данные в течение 40 лет, а количество возможных циклов стирания/записи может достигать 10000.

В зависимости от модели микроконтроллера размер FLASH-памяти может достигать 256 KБ.

Serial Peripheral Interface, SPI — последовательный периферийный интерфейс (SPI) который зачастую применяется для обмена данными между несколькими микроконтроллерами со скоростью до нескольких MГц (нескольких миллионов тактов в секунду).

Для обмена данными по SPI интерфейсу между двумя устройствами достаточно 3-х проводников:

  1. MOSI (Master Output Slave Input) — Данные от ведущего к ведомому;
  2. MISO (Master Input Slave Output) — Данные от ведомого к ведущему;
  3. CLK (Clock) — тактовый сигнал.

Устройства с SPI-интерфейсом делятся на два типа: ведущий(Master) и ведомый(Slave). Если к интерфейсу подключено несколько устройств то для обмена данными между ними нужны дополнительные линии связи(проводники) чтобы мастеру можно было выбрать ведомое устройство и сделать запрос к нему.

Также SPI интерфейс используется для внутрисхемного SPI программирования, по этому интерфейсу к микроконтроллеру подключается программатор.

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

Для EEPROM выделено отдельное адресное пространство которое отличается от адресного пространства RAM и FLASH. Память EEPROM микроконтроллера — очень ценный ресурс, поскольку ее как правило очень мало — от 0,5 до нескольких килобайт на чип. Количество перезаписей для данного типа памяти составляет порядка 100000 что в 10 раз больше чем ресурс FLASH памяти.

ALU — Арифметико-логическое устройство, которое синхронно с тактовым сигналом и опираясь на состояние счетчика команд (Program Counter) выбирает из памяти программ (FLASH) очередную команду и производит ее выполнение.

Тактовый сигнал для микроконтроллера вырабатывается тактовым генератором, и может быть подан из нескольких доступных источников на выбор:

  • внутренний RC-генератор, который можно калибровать на нужную частоту;
  • керамический или кварцевый резонатор с конденсаторами (не у всех моделей);
  • внешний тактовый сигнал.

Установка источника тактовых импульсов производится при помощи FUSE-битов.

FUSES (с англ.: плавление, пробка, предохранитель) — специальные 4 байта(4*8=32 бит) данных, которые настраивают некоторые глобальные параметры микроконтроллера в процессе прошивки. После прошивки данные биты нельзя изменить через внутреннюю программу что записана в МК.

Данной конфигурацией бит мы указываем микроконтроллеру вот что:

  • какой использовать задающий генератор (внешний или внутренний);
  • делить частоту генератора на коэффициент или нет;
  • использовать ножку сброса (RESET) для сброса или же как дополнительный пин ввода-вывода;
  • количество памяти для загрузчика;
  • другие настройки зависимо от используемого микроконтроллера.

CPU — это мозг микроконтроллера, который содержит в себе АЛУ, регистры и оперативную память.

К ALU подключен блок из 32-х регистров общего назначения (32 General Purpose Registers — регистровая память), каждый из которых представляет собою 1 байт памяти (8 бит). Адресное пространство регистров общего назначения размещено в начале оперативной памяти (RAM) но не является ее частью. С данными что помещаются в регистры можно производить разнообразные арифметические, логические и битовые операции. Выполнение подобных операций в оперативной памяти не доступно. Для работы с данными из RAM нужно их записать в регистры, произвести в регистрах нужные операции, а потом записать результирующие данные из регистров в память или в другие регистры для выполнения каких-то действий.

RAM — оперативная память. В нее можно записывать данные из регистров, считывать данные в регистры, все операции с данными и расчеты производятся в регистрах. Для разных семейств AVR чипов размер оперативной памяти ограничен:

  • ATxmega — до 32 KБ;
  • ATmega — 16 Кб;
  • ATtiny — 1 Кб.

Analog Comparator — данный блок сравнивает между собою два уровня сигнала и запоминает результат сравнения в определенном регистре, после чего сданный результат можно проанализировать и выполнить необходимые действия. Для примера: можно использовать этот блок как АЦП(Аналогово-Цифровой Преобразователь) и измерять напряжение батареи питания, в случае если если напряжение батареи достигло низкого уровня — произвести некоторые действия, помигать красным светодиодом и т.п. Также данный модуль можно применять для измерения длительности аналоговых сигналов, считывания установленных режимов работы устройства при помощи потенциометра и т.п.

A/D Converter — данный блок преобразовывает аналоговое значение напряжения в цифровое значение, с которым можно работать в программе и на основе которого можно выполнять определенные действия. Как правило диапазон напряжений что подаются на вход АЦП в AVR микроконтроллере находится в пределах 0-5,5 Вольт. Для данного блока очень важно чтобы микроконтроллер питался от стабильного и качественного источника питания. Во многих AVR микроконтроллерах есть специальный отдельный вывод для подачи стабильного питания на схему АЦП.

LCD Interface — интерфейс для подключения жидкокристаллического индикатора или дисплея. Применятся для отображения информации, состояния устройства и его узлов.

USART — последовательный асинхронный интерфейс для обмена данными с другими устройствами. Есть поддержка протокола RS-232, благодаря чему микроконтроллер можно соединить для обмена данными с компьютером.

Для подобной связи МК с COM-портом компьютера нужен конвертер логических уровней напряжения (+12В для COM — в +5В для микроконтроллера), или же просто RS232-TTL. Для подобных целей используют микросхемы MAX232 и им подобные.

Для подключения микроконтроллера к компьютеру через USB используя UART-интерфейс можно использовать специализированную микросхему FT232RL. Таким образом на новых компьютерах и ноутбуках можно не имея физического COM-порта привязать микроконтроллер используя USB-порт через USART интерфейс.

TWI — интерфейс для обмена данными по двухпроводной шине. К такой шине данных можно подключить до 128 различных устройств, используя две линии данных: тактовый сигнал (SCL) и сигнал данных (SDA). Интерфейс TWI является аналогом базовой версии интерфейса I2C.

В отличие от SPI интерфейса (один мастер и один/несколько ведомых) интерфейс TWI — двунаправленный, сто позволяет организовать между несколькими микроконтроллерами небольшую внутреннюю сеть.

Watchdog Timer представляет собою систему контроля зависания устройства с последующим его перезапуском. Это как автоматическая кнопка RESET для старенького компьютера с глючной ОС. ))

I/O Ports, GPIO — это набор блоков портов ввода/вывода к пинам которых можно подключить разнообразные датчики, исполняющие устройства и цепи. Количество пинов вход/выход, что идут от портов в микроконтроллере, может быть от 3 до 86.

Выходные драйверы в портах AVR микроконтроллера позволяют напрямую подключать нагрузку з потребляемым током 20 мА(максимум 40 мА) при напряжении питания 5В. Общий нагрузочный ток для одного порта не должен превышать значение в 80 мА (например на 4 пина для одного из портов повесить по светодиоду с током 15-20 мА).

Interrupts — это блок который отвечает за реакцию и запуск на выполнение определенных функций при поступлении сигнала на определенные входы микроконтроллера или же по какому-то внутреннему событию (например тиканью таймера). Под каждое прерывание разрабатывается и записывается в память отдельная подпрограмма.

Почему этот блок называется блоком прерываний? — потому что при возникновении определенного для прерывания события выполнение основной программы прерывается и происходит приоритетное выполнение подпрограммы что написана для текущего прерывания. По завершению выполнения подпрограммы происходит возвращение к выполнению основной программы с того момента где она была прервана.

Timers/Counters — набор таймеров и счетчиков. Микроконтроллер, как правило, содержит в себе от одного до четырех таймеров и счетчиков. Они могут применяться для подсчета количества внешних событий, формирования сигналов определенной длительности, вырабатывать запросы на прерывания и т.п. Разрядность таймеров и счетчиков составляет — 8 и 16 бит (смотреть в даташите для чипа).

Семейства микроконтроллеров

Все МК объединяются в семейства. Основная характеристика, по которой происходит это деление, — структура ядра.

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

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

Объединяют все МК в семейства одинаковость двоичного кода программирования.

Семейства делятся на:

  • MSC-51, производства Intel. Монокристальный МК на основе Гарвардской архитектуры. Основной представитель этого семейства 80С51, созданный по технологии CMOS. И хотя эти контроллеры разработаны еще в 80-х годах прошлого века, но до сих пор широко применяются. И сегодня многие компании, такие как Siemens, Philips и др. выпускают свои контроллеры с подобной архитектурой.
  • PIC (Microchip). МК Гарвардской архитектуры. В его основе лежит архитектура с сокращенным набором команд, встроенная память команд и данных, низкое энергопотребление. В это семейство входят более 500 различных МК (8-ми, 16-ти, 32-битные) с различными наборами периферии, памяти и прочими характеристиками.
  • AVR (Atmel). Высокоскоростные контроллеры разработаны на собственной архитектуре. Основой контроллера является Гарвардский RISC-процессор с самостоятельным доступом к памяти программ и баз данных (Flash ПЗУ). Каждый из 32 регистров общего назначения может работать как регистр-аккумулятор и совокупность 16-битных команд. Высокая производительность в 1 MIPS на каждый МГц тактовой частоты обеспечивается за счет порядка выполнения команд, который предусматривает выполнение одной команды и одновременную подготовку к следующей. Для поддержания своей продукции компания Atmel выпускает бесплатную и качественную среду разработки Atmel
  • ARM (ARM Limited) разработаны на собственной архитектуре. В семейство входят 32-х и 64-битовые МК. ARM Limited занимается только разработкой ядер и их инструментов, а лицензии на производство продает другим компаниям. Эти процессоры потребляют мало энергии, поэтому находят широкое применение в производстве мобильных телефонов, игровых консолей, маршрутизаторов и т. д. К компаниям, выкупившим лицензии, относятся: STMicroelectronics, Samsung, Sony Ericsson и др.
  • STM (STMicroelectronics). 8-разрядные контроллеры (STM8) относятся к категории высоконадежных с низким энергопотреблением изделий. В это же семейство входят контроллеры STM32F4 и STM Их основу составляет-32 битный Cortex. Такие контроллеры обладают отлично сбалансированной архитектурой и имеют большие перспективы развития.

Это не все семейства микроконтроллеров. Здесь мы привели только основные.

Что такое порты ввода-вывода?

Пожалуй, основное, что делает микроконтроллер таким интересным — это порты ввода-вывода (англ. general-purpose input/output). Почему они так называются? Всё очень просто — они либо принимают, либо отправляют сигнал.

Порт – это не просто одна ножка микроконтроллера: в нашем случае на одном порте располагаются до 16 ножек (нумерация идет с 0 и до 15). В свою очередь, порты маркируются буквами — A, B, C и т. д. Например, светодиод может быть подключён к ножке PD8 (порт D, ножка 8).

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

Изображение из Reference Manual, Figure 13. Basic structure of a standard I/O port bit

Первый отличительный признак, который можно заметить (да и просто вывести из названия), это то, что ножка может работать как вход и выход. Выход имеет четыре режима работы:

  • выход с открытым стоком (англ. output open-drain) — в этом случае при записи «0» в выходной регистр (англ. output register) активируется N-MOS, а при записи «1» порт переходит в высокоимпедансное состояние (также этот режим называют Hi-Z, P-MOS никогда не активируется);
  • выход с подтяжкой «тяни-толкай» (англ. output push-pull) – в русской литературе называется «двухтактный выход», а принцип его прост – запись «0» в Output register активирует N-MOS, запись «1» активирует P-MOS;
  • альтернативная функция с подтяжкой «тяни-толкай» (англ. alternate function push-pull) – уже описанный ранее двухтактный выход, только для альтернативной функции;
  • альтернативная функция с открытым стоком/коллектором (англ. alternate function open-drain).

В свою очередь, у входа имеются разные режимы работы:

  • плавающий вход (англ. input floating) – подтяжка отключена (без подтяжки ножка находится в Hi-Z состоянии, а это означает, что сопротивление входа велико, и любая электрическая наводка (помеха) может вызвать появление на таком входе «1» или «0»);
  • вход, подтянутый к верху (англ. input pull-up) — подтяжка к питанию (для STM32 обычно это 3,3 вольт);
  • вход, подтянутый к низу (англ. Input-pull-down) — подтяжка к земле (0 вольт);
  • аналоговый вход (англ. analog) — если ножка настроена как аналоговый вход, то используется модуль АЦП, если он подключен к этой ножке.

Чтобы воспользоваться GPIO, нужно еще включить тактирование порта… а для этого нужно понимать, что такое тактирование!

Типы корпусов микроконтроллеров

Внешних отличий МК от других микросхем нет. Кристаллы размещены в корпусах с определенным количеством выходов. Все МК выпускаются только в 3-х типах корпусов:

  • Корпус DIP имеет два ряда выводов. Расстояние между ними 2,54 мм. Выводы вставляются внутрь отверстий на контактных площадках.
  • Корпус SOIC. Он подходит для монтажа, который предполагает поверхностную припайку выходов к контактной площадке. Расстояние между выходами 1,27 мм.
  • Корпуса QFP (TQFP). Выводы расположены со всех сторон. Расстояние между ними в 3 раза меньше, чем в DIP. Корпус имеет квадратную форму. Предназначаются только для поверхностной пайки.
  • Корпус QFN. Самый маленький по сравнению с предыдущими. Контакты выходят в 6 раз чаще, чем в DIP. Имеют большое распространение в промышленном производстве, т. к. позволяют значительно уменьшить габариты выпускаемых приборов.

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

Подключение и управление

Подключаются чипы через специальные разъемы, называемые пинами. Те, в свою очередь, распределяются на:

  1. Отвечающие за питание. Стандартное сочетание из нуля, фазы и заземления. Последнее чаще всего игнорируют.
  2. Отвечающие за ввод данных.
  3. Отвечающие за вывод данных. Их можно разделить на аналоговые и цифровые, о главном различии уже упоминалось выше, и каждый из выходов имеет свои достоинства и недостатки.

С помощью всех этих «ножек» и происходит управление системой, а их необходимое количество напрямую зависит от поставленной задачи.

В чем отличие микроконтроллера от микропроцессора?

Весь компьютерный функционал микропроцессора (Micro Processor Unit — MPU) содержится на одном полупроводниковом кристалле. По характеристикам он соответствует центральному процессору компьютера ЦП (Central Processing Unit — CPU). Область его применения – хранение данных, выполнение арифметико-логических операций, управление системами.

МП получает данные с входных периферийных устройств, обрабатывает их и передает выходным периферийным устройствам.

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

Особенности микроконтроллеров Ардуино

Но всё же у большинства, при упоминании МК, в памяти всплывает название «Ардуино», и это не удивительно. Ведь у данной разновидности поликристальных чипов есть характерные особенности, выгодно выделяющие ее на фоне конкурентов:

  1. Низкий порог входа. Так как программная среда уже написана и протестирована за вас, никаких «велосипедов» придумывать не нужно.
  2. Оптимизация под конкретные задачи. У создателей есть целая линейка разнообразных чипов, которые сильно различаются по характеристикам, благодаря чему будет проще подобрать подходящий.
  3. Готовая платформа и множество решений различных проблем или задач в открытом доступе.

Устройства на микроконтроллерах

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

На МК могут быть следующие устройства:

  • Аналоговый компаратор. Основная его задача сравнивать поступающее (измеряемое) напряжение с идеальным. Если измеряемое напряжение выше, чем идеальное, то компаратор выдает сигнал логической 1 (прибор отключается), если ниже, то логический 0 (прибор продолжает работать).
  • Аналогово-цифровой преобразователь (АЦП). Измеряет аналоговое напряжение в период времени и выдает его в цифровой форме. Есть не у всех МК.
  • Таймер/счетчик. Представляет собой сочетание 2-х форм таймера и счетчика. Таймер формирует интервалы времени, а цифровой счетчик считает количество импульсов, идущих от внутреннего генератора частот, или сигналы от внешних источников. Одним из представителей работы таймера /счетчика может быть ШИМ (широтно-импульсный модулятор). Он предназначен для управления средним значением напряжения при нагрузке.
  • Сторожевой таймер. Его задача перезапускать программу через определенный временной промежуток.
  • Модуль прерываний. Он сообщает МК о наступлении какого-либо события и прерывает выполнение программы. После завершения события возобновляет прерванную программу.

Не все из этих периферийных устройств обязательно есть в каждом МК. Существуют и другие, менее распространенные устройства.

Разработка электроники. О микроконтроллерах на пальцах


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

Краткое содержание статьи:

Как микроконтроллеры завоевали мир Архитектура ARM — сегодняшний лидер рынка микроконтроллеров Конкуренция с младшими братьями Об укладке асфальта, пользе сна и его разновидностях Совсем коротко о технологии изготовления и о том, как появляются серии микроконтроллеров Периферия простейшего ARM микроконтроллера за пол бакса Самый дешёвый способ получить дополнительные функции А что добавит переход на Cortex-M4, кроме возросшей в пару раз цены? Cortex-M7 — когда хочется большего…

Защита кода, возможность его обновления и многообразие помогли микроконтроллерам завоевать мир

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

Одно из неоспоримых преимуществ микроконтроллера — программа, под управлением которой он работает, скрыта внутри его корпуса (в секции под названием “память программ”) и очень хорошо защищена от взлома, конечно, в случае, если разработчик микрокода об этом позаботился, активизировав встроенные механизмы защиты. Таким образом, вы получаете защиту интеллектуальной собственности настолько большую, насколько это возможно в наши дни.

Что нельзя взломать — то можно скопировать. Зачем пытаться считать код, встроенной в микроконтроллер программы, с помощью дорогостоящих хитроумных приспособлений, если проще и дешевле найти профессионала, который может написать его заново? Возможно результат будет даже лучше, а функционал богаче чем у прототипа. Да это стоит денег, но содержание FLASH памяти сегодняшних микроконтроллеров настолько хорошо защищено, что попытки грубого “взлома” обойдутся ещё дороже. Кроме того, решается проблема интеллектуальной собственности, а вы, вместе с исходными кодами программы, получаете возможность развивать и совершенствовать своё устройство.

Память программ, в современных универсальных микроконтроллерах, является перезаписываемой, причём процесс перезаписи можно повторять не один десяток тысяч раз. Напрашивается использование этого факта для обновления программного обеспечения с целью устранения найденных в нём ошибок или расширения функций уже работающего устройства. Это достаточно просто реализовать — добавив в программу специальный участок кода под названием “бутлоадер”, вы получаете возможность обновлять программное обеспечение вашего прибора различными способами: в пункте сервисного обслуживания (если устройство имеет специальный, скрытый внутри корпуса от посторонних глаз, разъём), подключив к компьютеру по USB, через сетевой или даже беспроводной интерфейс. Главное, предусмотреть в приборе необходимую для этого периферию. Предоставляя возможность обновления ПО, всегда следует думать о безопасности, если этот процесс недостаточно защищён, мало того, что злоумышленники могут похитить ваш код, они могут модифицировать его и использовать в своих не исключено, что коварных целях. Например, взять под контроль вещи вашего “умного дома” или шпионить с помощью, установленной вами же у себя дома, WEB камеры.

Архитектура ARM — сегодняшний лидер рынка микроконтроллеров

Со времён Царя Гороха микроконтроллеры принято разделять по разрядности данных, над которыми они проводят операции. В подавляющем большинстве случаев, сегодня, в новых разработках, стоит останавливать свой выбор на 32 битных микроконтроллерах с ядром АRM. Существует огромное количество их модификаций и всегда можно подобрать экземпляр, наилучшим образом подходящий для решения вашей задачи. В зависимости от набора функций и производительности, цена чипа может составлять от десятков центов до десятков долларов. Микроконтроллеры(MCU), в зависимости от архитектуры вычислительного ядра, принято разделять на крупные семейства. На сегодняшний день, для разработок устройств малой и средней сложности, наиболее популярны микроконтроллеры c ядрами от Cortex-M0 до Cortex-M7. Чем больше цифра, тем больше вычислительные (и не только) возможности, цена и максимальное энергопотребление. Не последнюю роль в популярности ARM сыграла преемственность архитектуры. Разработчик может с минимальными издержками модифицировать программный код своих предыдущих наработок, переходя от микроконтроллеров одного производителя к чипам другого и мигрируя между ядрами с разной производительностью.

Конкуренция с младшими братьями

Однако ARMы «рулили» не всегда. Я хорошо помню времена, когда абсолютными лидерами рынка были 8 битные микроконтроллеры и, с занятых позиций, их безуспешно пытались оттеснить 16 битные коллеги, но, по иронии судьбы, удалось сделать это только 32 битным старшим братьям. Так сложилось, что к моменту их появления, технологии изготовления чипов сильно удешевили интеграцию в них больших объёмов FLASH памяти. Воспользовавшись удобным случаем, программисты стали переходить с ассемблера на язык более высокого уровня — Си, структура которого отлично ложилась на 32 битную архитектуру. В результате 32 битные микроконтроллеры выполняли вычисления гораздо быстрее своих 8 и 16 битных коллег, но была одна проблема — у них был выше ток потребления.
Поэтому, поначалу, они использовались в случаях, когда требовалась большая вычислительная производительность.

Известно, что средний ток потребления вычислительного ядра микроконтроллера существенно увеличивается с поднятием его тактовой частоты. Поначалу 8 битные модели микроконтроллеров отличались заметно меньшим потреблением при сходной частоте и, кроме того, были способны работать от низкой тактовой частоты, вплоть до 32 кГц.

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

На короткое время сложился паритет — 32 битные MCU захватили нишу топовых приложений, а 8 битные уверенно удерживали позиции в устройствах, для которых было важно низкое энергопотребление. Он сохранялся до тех пор, пока 32 битные MCU не освоили в совершенстве «импульсный» режим работы.

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

Об укладке асфальта, пользе сна и его разновидностях

Итак, микроконтроллеры настолько хорошо научились считать, что стали выполнять свою работу очень быстро и большинство времени были вынуждены “бить баклуши”, пожирая энергию для выполнения холостых циклов. В устройствах с автономным питанием это сильно сокращает ресурс батарей или время работы от одной зарядки аккумуляторов.
Понаблюдайте за строительными рабочими которые кладут асфальт. Они резко активизируют свою работу, когда пришёл грузовик с новой порцией асфальта, а после его укладки снижают темп. Так и микроконтроллеры умеют повышать и снижать частоту тактирования ядра. Однако, им это даётся не так просто, как рабочим — одновременно изменится и частота работы всей внутренней периферии, поэтому, чувствительные к этому её части придётся перенастраивать. Не проще ли, выполнив быстро всю работу, немного поспать. Зачастую, да. Причём виды сна микроконтроллеров отличаются ещё более драматично, чем у человека.

Можно просто вздремнуть. В этом случае наш чип всегда наготове и как только зазвенел будильник таймера или его потревожило внешнее прерывание, он просыпается практически мгновенно. Как человек во время дремоты может снять напряжение, но не выспаться толком, когда тебя постоянно дёргают, так и микроконтроллер может снизить своё энергопотребление в этом режиме “всего” раз в 10, называют этот режим SLEEP.

Лучший способ хорошо выспаться — раздеться, лечь в постель, задёрнуть шторы на окне и включить будильник. Однако, после такого сна, уже моментально в работу не включишься. Придётся, как минимум, предварительно ополоснуться холодной водой и одеться. Есть такой режим и у микроконтроллера, когда он ограничивает количество внешних раздражителей и выключает основной тактовый генератор. Это режим STOP. В нём можно уменьшить потребление в 1000 раз, но и на выход из него уже потребуется существенное время.

Теперь, представьте себе, что вы перед сном выпили изрядную дозу снотворного, отключили будильник и телефон, закрыли все окна и двери. Это будет режим STAND BY. Вывести из такого режима микроконтроллер можно только с помощью особых выводов и большая часть памяти о том, чем он занимался перед таким сном будет потеряна навсегда, придётся начинать работу заново. Зато находясь в таком режиме MCU потребляет ещё в два раза меньше.

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

Выбирая режим экономии энергопотребления необходимо помнить о последствиях применения

:

  • чем глубже сон, тем дольше пробуждение
  • чем глубже сон, тем меньше способов вывести из него микроконтроллер
  • чем глубже сон, тем меньше остаётся информации о предыдущем состоянии микроконтроллера
  • для достижения минимальных заявленных значений, во многих режимах необходимо принимать дополнительные меры, например — отключения периферии
  • для минимизации энергопотребления устройства в целом необходимо грамотно спроектировать схемотехнику всего устройства
  • для минимизации энергопотребления устройства в целом, нужно позаботиться о том, чтобы остальные компоненты и цепи также имели микропотребление в неактивном режиме. Глупо предпринимать огромные усилия для того, чтобы опустить потребление микроконтроллера ниже одного микроампера и, при этом, применять в устройстве дешёвый стабилизатор с током собственного потребления в 100 микроампер но встречается такое сплошь и рядом
  • для успешного использования режимов глубокого сна не только программа, но и схемотехника, должны быть тщательно продуманы, иначе, вместо экономии, можно получить весьма серьёзные проблемы — редко случающееся, зато “мёртвое” зависание устройства по необъяснимой причине, либо слишком частое пробуждение и, как результат, потребление на порядки выше ожидаемого


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

Совсем коротко о технологии изготовления и о том, как появляются серии микроконтроллеров

Физически активная часть микроконтроллера, как и подавляющее количество других микросхем, обычно сформирована на пластине монокремния (назовём его, в данном контексте, ЧИП). Чипы занимают очень маленькую площадь, технологически же выгодно производить пластины большого диаметра, поэтому, обычно большое количество чипов, как соты, размещают на одной большой пластине и формируют, в ходе одного технологического процесса. В последствии пластины нарезают на кусочки, получая уже отдельные чипы, которые и помещают в корпуса. Разработка топологии и отладка технологических процессов нового чипа стоит очень дорого, а занимаемое на пластине одним чипом место, как правило, не велико. Производителям выгодно выпускать чипы крупными партиями, но пользователям требуются микроконтроллеры в разных корпусах — кому то важно получить корпус поменьше и подешевле, другому наоборот требуется побольше выводов, чтобы управлять LCD или внешней памятью с параллельным интерфейсом. Производителям выгодно перекрывать все ниши, чтобы клиенты не перебегали к конкурентам, не найдя оптимальной для себя модели.
Очень часто бывает выгодней выпустить крупной партией один универсальный чип и помещать его в разные корпуса, чем запускать десяток различных. У чипов, помещённых в корпуса с малым количеством выводов, часть портов (в данном контексте, под портами будем понимать контактные площадки на поверхности чипа, служащие для общения с внешним миром) просто останутся неподсоединёнными. Часто производители идут дальше — чтобы поднять спрос и цену на микроконтроллеры с большим количеством ножек, они искусственно обрезают функциональность тех, у которых их меньше — отключают некоторые функции, ограничивают объём доступной памяти и т. п.

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


Так из одного стандартного дизайна чипа формируется целая серия микросхем.

Периферия простейшего ARM микроконтроллера за пол бакса

Процессорное ядро — это мозг, но, чтобы он не был подобен “сферическому коню в вакууме”, требуются аналоги органов чувств и конечностей.
В микроконтроллере их роль играют выводы на корпусе, к которым внутри корпуса могут подключаются порты(контактные площадки) чипа. В свою очередь, через внутренние коммутаторы, к одному и тому же порту могут подключаться различные периферийные модули. Для начала рассмотрим периферию одной из простейших серий от ST на основе ядра Cortex-M0 — stm32F03.

Для этой серии имеем следующий набор базовых функций:
Часы реального времени (Real Time Clock или RTC)
, которые могут запитываться с помощью отдельного вывода и работают от отдельного низкочастотного резонатора. Этот модуль потребляет крайне мало энергии, в случае пропадания основного питания он может часами работать от заряженного конденсатора, или годами от маленькой встроенной в прибор батарейки. Кроме этого, он может служить в качестве будильника, выводя микроконтроллер из состояния даже самого глубокого сна в заранее заданное время.

WatchDog

— сторожевая собака мешающая микроконтроллеру заснуть навсегда, например, свалившись в бесконечный цикл или перейдя по несуществующему адресу. Его принцип работы прост. Программист настраивает таймер защиты от “зависания” на определённый период времени, допустим на секунду, и запускает его. Затем он расставляет, в выбранных им местах программы, короткие участки кода, которые перезапускают таймер с нулевого значения. Если за секунду не произошло ни одного сброса таймера, WatchDog считает, что с программой что-то не так и устраивает микроконтроллеру перезапуск. Программа начинает работать с начала, причём существует возможность определить являлся ли инициатором ресета WatchDog и учесть этот факт при запуске.

Универсальные цифровые входы-выходы (General Purpose Input-Output GPIO)

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

Рассмотрим работу в качестве входа. Если напряжение на входе микроконтроллера меньше некоего порога (как правило близкого к половине питания), то оно воспринимается как логический ноль, в противном случае как 1. Цифровые входы обычно имеют очень высокое входное сопротивление, поэтому, если их оставить не подключенными, их состояние может скакать из нуля в единицу и обратно, под действием наводок электромагнитных полей. Для того, чтобы этого не происходило, существуют специальные режимы, когда внутри чипа вход соединяется через сопротивление 20 — 50 КОм с плюсом питания микроконтроллера (pull-up) или с минусом (pull-down).

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

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

На рисунке выше изображён участок схемы, спроектированного мной устройства (спутникового модема), с элементами простейшей защиты портов микроконтроллера. X4 — разъём для внешних коммуникаций. Нас интересуют контакты 5-7, к которым присоединяются тревожные кнопки. Сигналом тревоги служит замыкание на землю, поэтому, в нормальном состоянии, на портах должно присутствовать напряжение питания микроконтроллера, что и обеспечивают резисторы R24-R26, номиналом 1 КОм. Супрессоры VD4-VD6 ограничивают напряжение на уровне 5 вольт, это допустимо потому, что применяемый мной микроконтроллер, хотя и питается напряжением 3,3 вольта, но имеет порты толерантные к напряжению 5 вольт. Резисторы R29-R31 на 100 Ом. Подобная защита спасёт порты вашего микроконтроллера от внешних перенапряжений. У некоторых микроконтроллеров отдельные порты не боятся напряжений, превышающих их напряжение питания. Так у многих микроконтроллеров STM32Fxx почти все порты будучи сконфигурированными как цифровые могут работать с 5 вольтовыми цепями, но если они работают в аналоговом режиме, например в качестве входа АЦП, теряют эту способность и это необходимо учитывать при разработке схемы.

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

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

Используя порты микроконтроллеров в качестве выходов, также стоит свериться с даташитом. Отдельные порты могут иметь разное ограничение по максимальному току, который от них можно получить не опасаясь выхода их строя — нагрузочную способность. Кроме этого, сам чип имеет максимальную нагрузочную способность всех выходов в сумме, которую не следует превышать. Последнее, о чём хочется упомянуть, выходные порты ARM микроконтроллеров не реагируют на программные инструкции мгновенно, как у 8-битных микроконтроллеров. Они управляются через шину, и их быстродействие зависит от частоты тактирования соответствующего узла, которую можно менять программно. Если вы хотите быстрой реакции, позаботьтесь об увеличении этой частоты, если важнее уменьшить энергопотребление, наоборот выберите менее скоростной режим.
Температурный сенсор
Микроконтроллер имеет свой собственный температурный сенсор, правда не слишком точный, тем не менее его можно, с определёнными допущениями, использовать для измерения температуры внутри корпуса прибора.

Уникальный серийный номер

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

Интерфейсы обмена данными

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

  • USART — асинхронный последовательный порт, часто использующийся для связи с компьютером там он называется COM или RS232, модемами и другими устройствами
  • SPI — высокоскоростной интерфейс, который имеют очень многие чипы, например внешняя память
  • I2C — двухпроводной интерфейс, разработанный для общения с датчиками и другой периферией на небольшом расстоянии и небольших скоростях обмена. Большой его плюс заключается в том, что одновременно к одной шине можно подключить десятки различных устройств

Все эти интерфейсы несложно реализовать программно с помощью обычных GPIO, но они будут работать гораздо медленнее и отнимать много ресурсов вычислительного ядра.
Аналого-цифровой преобразователь АЦП или ADС

на котором придётся остановиться подробнее.

Чрезвычайно полезный модуль, который способен измерять напряжение аналоговых сигналов. Оценивает он их в долях от величины опорного источника сигнала, в нашем случае это напряжения питания аналогового модуля микроконтроллера, которое может быть равным или немного ниже основного напряжения питания чипа. Теоретическая точность работы АЦП зависит от его разрядности. В современных микроконтроллерах чаще всего применяется 12 разрядный АЦП последовательного приближения, реже 10 и как экзотика встречается 16.

При питании 3 вольта 12 разрядный АЦП микроконтроллера будет иметь разрешающую способность 3/4096=0.00073 Вольта — лучше одного милливольта.

Но на практике достичь этого идеала бывает не просто.

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

  • применять для питания MCU линейные стабилизаторы с хорошими параметрами
  • применять для питания аналоговой части MCU высокостабильные источники опорного напряжения

импульсные помехи по питанию АЦП

  • подключать аналоговое питание к цифровому через простейшие фильтры низкой частоты — подавать питание на аналоговую часть MCU через индуктивность и в непосредственной близости от входа микроконтроллера устанавливать керамический конденсатор с диэлектриком XR7 ёмкостью 100 нанофарад, а ещё лучше, параллельно ему включить танталовый конденсатор с ёмкостью в одну — две микрофарады.

импульсные помехи на входе АЦП

  • пропускать входной сигнал хотя бы через простейший ФНЧ, состоящий из резистора и конденсатора. Для борьбы с помехами от передающих радиотрактов и короткими импульсными помехами иногда достаточно одиночного конденсатора с диэлектриком NP0 ёмкостью в несколько десятков пикофарад, установленного между входом и землёй, в непосредственной близости от входа АЦП
  • не экономить на блокировочных конденсаторах, по крайней мере самого микроконтроллера, устанавливать их в непосредственной близости от каждого вывода питания и в других местах, рекомендованных производителем, рекомендованного им номинала
  • тщательно выбирать месторасположение компонентов и соблюдать правила трассировки цепей питания и особенно “земли”, в идеале аналоговая и цифровая земли должны соединяться в одной точке — рядом с выводом аналоговой земли микроконтроллера

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

  • правильно выбирать параметры настройки АЦП, например во многих микроконтроллерах можно увеличить время зарядки входной цепи, правда тут приходится идти на компромисс, снижая быстродействие
  • устанавливать на входе АЦП буферные усилители на основе ОУ (операционный усилитель), или повторители напряжения. Выбирать их по принципу самых дешёвых не стоит, можно не улучшить, а ухудшить ситуацию, причём значительно. Если не хватает собственного опыта, лучше поискать специально рекомендованные производителями для подобных приложений


Выше изображён участок реальной схемы для подачи питания на аналоговую часть микроконтроллера в устройстве с батарейным питанием. В данном случая я использовал АЦП для оцифровки сигнала с аналогового MEMS микрофона и поэтому имело смысл выделить в отдельную цепь не только аналоговое питание, но и аналоговую землю. В большинстве случаев это избыточно, для того чтобы от неё действительно был толк, нужна ещё и правильная трассировка.
От цепи VBUT питается вся цифровая часть микроконтроллера. На всякий случай привожу номиналы элементов: R5-10 Ом, С10 0.1 мкФ, без индуктивностей L1 и L2 BLM18PG471SN1D в большинстве случаев можно обойтись.

Ещё один любопытный пример из моей практики. В плате, на которой размещалось большое количество высокопотребляющих чипов ASIC, необходимо было измерять их температуру. Самый простой и дешёвый способ — использование высокоомных термисторов. В качестве фильтров я применил конденсаторы достаточно большой ёмкости, воспользовавшись тем фактом, что температура меняется сравнительно медленно. Для оцифровки звука такой фокус однозначно бы «не прокатил».

Осталось упомянуть ещё одну важную особенность АЦП, характерную для микроконтроллеров. Собственно, модулей АЦП в нём, как правило, один или два, а вот входов может быть много. В описываемой серии модуль 1, а входов может быть до 16. Как же так? Очень просто, входы подсоединены к нему через коммутатор. Если вы собираетесь измерять напряжение с 10 входов, то должны организовать цикл — последовательно переключить коммутатор к каждому из 10 входов и сделать измерение. Это необходимо учитывать, рассчитывая времена измерения. В данной серии АЦП, теоретически, способно сделать измерение за 1 микросекунду. Получается, что полный цикл 10 измерений у вас займёт точно больше 10 микросекунд!
Система прямого доступа в память ПДП или DMA
— ещё одна архиважная вещь. Этот модуль позволяет пересылать данные от периферии в память или наоборот.

Например, с его помощью вы можете выделить участок памяти для хранения данных, приходящих из АЦП и сделать из него кольцевой буфер. Далее запускается АЦП в режиме считывания данных через равные промежутки времени. Используя механизмы DMA, считанные данные будут, без участия ядра, самостоятельно, байт за байтом, помещаться в выделенный буфер. Когда буфер будет полностью заполнен, ядро получит сигнал и приступит к их программной обработке, а система DMA начнёт процесс загрузки сначала. Поскольку DMA имеет несколько каналов, то никто не мешает реализовать для нашего случая автоматический вывод на USART данных из буфера. В результате мы получим, работающий без использования ядра процесс передачи считанных с АЦП в USART, и не простая работа программиста по конфигурации DMA окупится сторицей.

Модуль широтно-импульсной модуляции ШИМ или PWM

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

Что можно получить, добавив 30 центов?

Переход на Cortex-M0+. Самый дешёвый способ получить дополнительные функции

А какие дополнительные плюшки предлагает микроконтроллер новейшей серии с ядром чуть посовременнее Cortex-M0+, при стоимости на 20-50 центов дороже аналогов в рассмотренной выше серии по корпусу и количеству выводов?
Таблица отличий между сериями

  • в два раза увеличилась максимальная тактовая частота
  • с 2 до 1.7 вольт понизилось минимальное напряжение питания
  • АЦП способно работать в два с половиной раза быстрее
  • появились два канала 12 битного цифро-аналогового преобразователя. Это крайне полезная функция, с помощью которой возможно формировать на выводах сигнал заданного напряжения с точностью лучшей чем 1 мВ, например сигналы произвольной формы в звуковом диапазоне частот
  • появились компараторы — устройства для сравнения величин двух аналоговых сигналов, это бывает полезным скажем для определения момента возникновения перегрузки по току
  • добавлен USB интерфейс, посредством которого можно подключать устройства к компьютеру. Особый интерес вызывает наличие поддержки опций управления питанием для реализации USB type3-C совместимого интерфейса. О нём я рассказывал в одной из своих статей на Хабре
  • появился ускоритель AES для процедур 256 битного шифрования/дешифрации
  • UART получил возможность работы в режимах сна и аппаратную поддержку протоколов LIN (простая сеть, широко используется в автопроме), IRDA (протокол передачи данных посредством инфракрасных светодиодов, вспомните телевизионные пульты), SIMcard…
  • расширены возможности таймеров и модуля PWM
  • верхняя граница температурного диапазона работы поднялась до 125 градусов
  • увеличена надёжность работы за счёт расширения режимов перезапуска при возникновении проблем с питанием
  • добавлен “честный” аппаратный генератор случайных значений — полезная функция в криптографии

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

А что добавит переход на Cortex-M4, кроме возросшей в пару раз цены?

  • Максимальная тактовая частота вырастает уже до 80 МГц
  • Появился блок для ускорения вычислений с плавающей точкой
  • Ясное дело, максимальная встроенная память увеличилась
  • Модели с количеством ног 100 и более поддерживают работу с внешней статической памятью
  • USB научился работать в режиме HOST
  • Появился контроллер CAN интерфейса. Это очень перспективный интерфейс разработанный для высоконадёжных приложений. Своё победное шествие он начал с автомобильной промышленности и уже почти 20 лет ведёт затяжную войну с давно устаревшим RS-485 в крайне консервативной отрасли промышленной автоматизации.
  • Появился интерфейс для подключения SDcard. Очень полезная функция — добавляете в своё устройство держатель за 50 центов и получаете съёмный носитель размером в десятки Гигабайт! С большинством карт удаётся работать и по обычному SPI, но намного медленнее
  • Добавили встроенный Операционный Усилитель с большим разнообразием режимов работы. Именно благодаря этой и предыдущей функциям, для своего последнего проекта беспроводного стетоскопа, пришлось остановить выбор на M4 вместо M0+. В результате появилась возможность управлять усилением сигнала с MEMS микрофона и сохранять десятки часов аудиозаписей работы сердца на SD карте
  • Криптомодуль научился аппаратно считать HASH функции.
  • Контроллер сенсорных приложений усовершенствован и теперь поддерживает уже не только кнопки, но и элементы прокрутки

Cortex-M7 — когда хочется большего…

В подавляющем количестве проектов возможностей предоставляемых вышеописанными ядрами достаточно, но случаются и исключения. Лично со мной такое случалось всего пару раз, причём лишь один раз по действительно уважительной причине — требовалась высокая производительность для подготовки данных для ASIC, контроллер Ethernet и шина CAN-FD c повышенной скоростью обмена.

Если на уровне универсальных микроконтроллеров с ядрами Cortex 4 и ниже, на мой субъективный взгляд, по параметру цена/функциональность сейчас лидирует фирма ST, то в области более высокопроизводительных чипов она уступает лидерство ATMEL, вернее, теперь уже недавно поглотившему его MICROCHIP. Поэтому я остановил свой выбор на серии ATSAMV71, стоимостью от 6 долларов.

Помимо вышеописанного (контроллер Ethernet и шина CAN-FD), по большому счёту, мы получаем, существенно увеличивающее производительность ядро с ускорителем операций, работающее на тактовой частоте до 300 МГц, интерфейсы для подключения видеоматрицы и поддержку динамической памяти.

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

Что нужно для программирования микроконтроллера

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

Путь программирования проходит несколько этапов:

  1. Перед тем как приступить к написанию кода программы, надо определиться с конечной целью.
  2. Составляется алгоритм работы программы.
  3. Непосредственное написание кода программы. Коды пишутся на языке Си или Ассемблере.
  4. Компиляция программы, т. е. перевод ее в двоичную или шестнадцатеричную систему 1 и 0. Только так ее сможет понять МК.
  5. Откомпилированный код записывают в память контроллера.
  6. Прошивают МК с помощью программатора. Они бывают двух типов подключения: через COM или USB порт. Самый простой и дешевый программатор USBASP.
  7. Тестирование и отладка МК на реальном устройстве.

Радиолюбители иногда обходятся без прописывания алгоритма работы программы на бумаги. Они держат его в голове.

Языки программирования

Языки программирования для МК мало чем отличаются от классических компьютерных. Основное отличие заключается в том, что МК ориентируются на работу с периферией. Архитектура МК требует битово-ориентированных команд. Поэтому для контроллеров создавались особые языки:

  • Ассемблер. Самый низкий уровень языка. Программы, написанные на нем, получаются громоздкими и труднопонимаемыми. Но несмотря на это он позволяет наиболее полно раскрыть все возможности контроллеров и получить максимальное быстродействие и компактный код. Подходит преимущественно для маленьких 8-битных МК.
  • С/С++. Более высокий уровень языка. Программа, написанная на нем, более понятна человеку. На сегодняшний день есть много программных средств и библиотек, позволяющих писать коды на этом языке. Его компиляторы есть практически на любой модели МК. На сегодня это основной язык для программирования контроллеров.
  • Еще более удобный для восприятия и проектирования язык. Но он мало применяется для программирования МК.
  • Старинный язык программирования. На сегодня почти не применяется.

Выбор языка для программирования зависит от решаемых задач и необходимого качества кода. Если нужен компактный код, то подойдет Ассемблер, для решения более глобальных задач выбор ограничится только С/С++.

Принцип работы

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

  1. Он принимает определённые переменные или другие данные, которые прежде должны быть преобразованы в двоичный сигнал. Это необходимо, поскольку на низшем уровне система способна воспринимать лишь 2 состояния – есть сигнал или нет сигнала. Такой принцип называют аналоговым. Существует аналогичный алгоритм, когда сигнал присутствует постоянно, но меняется по частоте – цифровой. У них множество различий, как в областях применения, так и в особенностях работы сигнала, но суть одна – процессор способен воспринимать лишь значения 0 и 1, или true и false, и не важно, какими путями микропроцессоры и микроконтроллеры будут их считывать.
  2. Во внутренней памяти устройства хранится набор специальных инструкций, который позволяет, путем базовых математических преобразований, выполнять какие-то действия с полученными данными. Именно эти базовые операнды и берутся на вооружение компилируемых языков программирования, когда необходимо написать библиотеку готовых функций. Остальные нюансы языков программирования – это уже синтаксис и теория алгоритмов. Но в результате, всё сводится к базовым операндам, которые превращаются в двоичный код и обрабатываются внутренней системой процессора.
  3. Всё, что было получено и сохранено после обработки, выдается на выход. На самом деле, данный пункт выполняется всегда, единственная разница, что выходом может быть и преобразование состояния объекта какой-то системы. Простейшим примером станет замыкание электрической цепи, в случае, если на специальный датчик подать ток, вследствие чего загорится лампочка. Здесь всё зависит от типа устройства, так, 8051 микроконтроллер может выполнять несколько видов выводов, имея 14 пинов, а какой-то другой – всего один, ведь у него 1 пин на выход. Количество выходов влияет на многопоточные свойства девайса, иными словами, возможность выводить информацию сразу на несколько устройств или совершать несколько действий одновременно.

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

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

Но почему микроконтроллер овен не способен выполнять некоторые действия, характерные для 8051, и какая классификация вообще существует в данной сфере?

Среда разработки

На сегодня нельзя найти универсальной среды для программирования МК. Это связано с его внутренней структурой и наличием технического обеспечения записи кода в память контроллера.

Вот несколько сред программирования:

  • FlowCode – универсальная графическая среда. Программируется с помощью построения логических структур блок-схем.
  • Algorithm Builder. Тоже графическая среда. Но написание кода проходит в 3–5 раз быстрее, чем в FlowCode. В ней совмещены графический редактор, компилятор, симулятор МК, внутрисхемный программатор.
  • В ней объединены Ассемблер и С/С++. Функционал среды позволяет самостоятельно прошивать МК.
  • Image Craft. Как и предыдущая поддерживает Ассемблер и С/С++ языки. В ее составе есть библиотека, позволяющая работать с отдельными устройствами МК.
  • Популярная среда для любителей. Имеет Си-подобный язык, но отличающийся от других. Он более понятен человеку. Поддерживает библиотеки, в составе которых есть драйвера для подключения некоторых платформ.

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

Архитектура ARM

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

В состав Cortex входит не только ядро, но и различные компоненты управления и отладки, которые соединены между собой шинами AHB и APB. Еще два компонента, которые нам потребуются в дальнейшем, это:

  • NVIC — встроенный контроллер прерываний, о котором мы еще поговорим. Число возможных прерываний определяется изготовителем микросхемы. Этот контроллер тесно связан с ядром и содержит регистры управления системой.
  • SysTick — системный таймер, представляющий собой вычитающий счетчик, который может быть использован для генерации прерываний через равные промежутки времени (даже если МК находится в спящем режиме)

Изображение из Reference Manual, Figure 1. Low and medium density value line system architecture)

Основы программирования

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

Если Ассемблер окажется сложен, то можно начинать с Си. Одной из сильных его сторон является то, что он хорошо переносит коды с одного вида МК на другой. Но для этого надо правильно все прописать, разделив рабочие алгоритмы и их реализации в машине по разным частям проекта. Это позволит переносить алгоритм в другой контроллер, переделав всего лишь интерфейсный слой, в котором прописано обращение к «железу», оставив рабочий код без изменений.

Далее действуют по следующей схеме:

  1. Выбор компилятора и установка среды (подробнее о них писалось выше).
  2. Запуск среды и выбор в ней нового проекта. Необходимо будет указать место расположения. Путь нужно выбирать наиболее короткий.
  3. Настройка проекта. Классическим действием будет создание make-файла, в котором прописываются все зависимости. На первой странице указывают еще частоту работы МК.
  4. Настройка путей. В них надо добавить директорию проекта. В нее можно добавлять сторонние библиотеки.
  5. Постановка задачи.
  6. Сборка схемы. На этом этапе надо соединить модуль USB-USART конвертера с аналогичными выводами МК. Это позволит прошить микроконтроллер без программатора. Нужно накинуть джамперы, соединяющие LED1 и LED2. Этим действием мы подключим светодиоды LED 1 и 2 к выводам PD4 и PD5.
  7. Пропись кода.
  8. Добавление библиотек и заголовков с определениями.
  9. Главные функции. Язык Си состоит из одних функций. Они могут быть вложенными и вызываться в любом порядке относительно друг из друга и разными способами. Но все они имеют три обязательных параметра: 1) возвращаемое значение; 2) передаваемые параметры; 3) тело функции. В зависимости отданных, все возвращаемые или передаваемые значения должны быть определенного типа.
  10. Компиляция и запуск эмуляции.
  11. Отладка программы.

После того как прописали программу на языке Си, можно понаблюдать, как и что происходит в МК. Это поможет выстроить аналогию с программированием на Ассемблере.

Советы начинающим программистам микроконтроллеров

Чтобы первый опыт в программировании МК не закончился неудачей и навсегда не отбил охоту заниматься этим делом, нужно следовать некоторым советам:

  • Начинать с изучения периферии и ее особенностей.
  • Каждую большую задачу надо разделять на максимально количество мелких.
  • В начале пути не стоит упрощать себе жизнь и пользоваться кодогенераторами, нестандартными фичами и т. п. вещами.
  • Обязательно нужно изучать языки программирования (Си и Ассемблера).
  • Читайте Даташит.
  • Соберите необходимый набор инструментов. Это стоит определенных денег, но окупит себя экономией времени и качеством работы.

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

Микроконтроллеры для начинающих

Лучшим примером МК для начинающих инженеров станет именно плата Ардуино, по уже упомянутым причинам.

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

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

Рейтинг
( 1 оценка, среднее 4 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]