Оглавление
- Выбор языка программирования и среды разработки для программирования
- Как программировать микроконтроллеры?
- Асимметричность ядер
- История создания языка C (Си)
- Общие сведения о языке C (Си)
- Питание микроконтроллера
- Создание прошивки для ядра 0
- Возраст
- Межъядерное взаимодействие
- Совместная отладка
- Основные критерии выбора
- Ассемблер
- Основные узлы микроконтроллера
- Система прерываний
- Литература
- Возможности и особенности микроконтроллеров
- Установка 0 в произвольном бите регистра порта
Выбор языка программирования и среды разработки для программирования
Честно говоря, выбор языка программирования и среды разработки вопрос очень ответственный, навязывать кому-то свои предпочтения и что-то советовать дело довольно-таки трудное.
Давайте попробуем подойти к этому выбору не предвзято, чисто с практической стороны.
1. Существует два основных языка программирования микроконтроллеров — Ассемблер (язык низкого уровня) и Си (язык высокого уровня).
Если мы хотим программировать микроконтроллеры используя полностью все их возможности (а мы это хотим), то необходимо изучать эти два языка.
2. Среда разработки для программирования микроконтроллеров.
Тут выбор большой и очень много мнений. Поэтому можно сказать: «Каждая лягушка хвалит свое болото». Мне, к примеру, очень нравится малораспространенная графическая среда разработки «Algorithm Builder», и «квакать» о ее преимуществах перед другими программами я могу очень долго. Но будем делать выбор, как было сказано выше, не предвзято и практично.
Микроконтроллеры AVR выпускает фирма Atmel, она же предоставляет в наше распоряжение бесплатную среду программирования «Atmel Studio» (бывшая AVR Studio). На ней мы и остановимся.
Интегральная среда разработки (IDE — Integrated development environment) Atmel Studio позволит нам:
— писать программы как на Ассемблере, так и на Си (Почему на Си. Программа «Atmel Studio» позволяет писать программы на трех языках (О чем мы и погорим в первой статье), но есть одно но: программы на Си++ мы рассматривать не будем, по одной причине, и в следующей статье я расскажу об этом
— отладить программу
— перевести программу в машинный код (откомпилировать)
— записать программу в микроконтроллер
Все, выбор мы сделали:
Теперь осталось выполнить два пункта:
1. Обзавестись каким-нибудь стартовым набором (для начала хватит и микроконтроллера ATmega8, нескольких светодиодов, пары кнопок и сопротивлений к ним).
2. Установить (именно установить, а не скачать, и с регистрацией) с официального сайта Atmel (http://www.atmel.com/ru/) программу Atmel Studio.
Программировать микроконтроллеры мы будем с использованием программатора USBASP.
Отдельной статьи по Atmel Studio я писать не буду, будем изучать ее постепенно, по мере надобности и в связке со статьями по устройству и программированию микроконтроллеров.
3. Я добавил в набор очень нужную вещь, она Вам в дальнйшем очень пригодится — USB-TTL преобразователь (конвертер). Почему пригодится:
— русифицируя программу мы установили «Visual Studio-2015», кто не русифицировал программу — установите последнюю версию «Visual Studio», мы не только будем изучать базовую программу «Atmel Studio». К сожалению, на сегодняшний день только программа 2015 года позволяет перейти на русский язык в «Atmel Studio», но а мы с Вами, в «Visual Studio», будем создавать оболочки для работу с МК.
Следующие статьи
Основы программирования микроконтроллеров AVRУстройство и программирование микроконтроллеров AVR в среде Atmel Studio на языках Ассемблер и Си
Published by: Мир микроконтроллеров
Date Published: 10/01/2016
Как программировать микроконтроллеры?
Программирование микроконтроллеров стало более простым благодаря использованию современных интегрированных сред разработки IDE с полнофункциональными библиотеками. Они легко охватывают все наиболее распространенные задачи и имеют много готовых примеров кода.
В настоящее время микроконтроллеры могут быть запрограммированы на различных языках высокого уровня. Это такие языки как C, C++, С#, Ява, Python, Basic и другие. Конечно, всегда можно написать программу на ассемблере. Хотя это для более продвинутых пользователей с особыми требованиями (с намеком на мазохизм). В этом смысле, любой должен быть в состоянии найти язык программирования, который лучше всего соответствуют его вкусу и предыдущему опыту программирования.
Программировать микроконтроллеры становится еще проще, так как производители создают графические среды программирования. Это пиктограммы, которые содержат в себе несколько строк кода. Пиктограммы соединяются друг с другом. В результате создается программа визуально простая, но содержащая в себе большое количество кода. Например, одно изображение может представлять управление двигателем. От пользователя требуется только разместить пиктограмму там, где необходимо и указать направление вращения и обороты.
среда программирования Lego Education EV3
Разработанные микроконтроллерные платы достаточно удобны в эксплуатации. И их проще использовать долгое время. Они также обеспечивают удобные питание от USB и интерфейсы программирования. Следовательно, есть возможность подключаются к любому современному компьютеру.
Асимметричность ядер
Схемы построения многоядерных микроконтроллеров можно поделить на симметричные и асимметричные.
Симметричная схема предполагает одновременный запуск ядер. Каждое ядро загружается и начинает выполнять свою программу независимо от остальных ядер. Синхронизация ядер с помощью аппаратных и программных механизмов возможна. Но она не является обязательной.
Если схема асимметричная, то одно из ядер является ведущим (Master Core). Ведущее ядро запускается первым. Тактирование остальных ядер, являющихся ведомыми (Slave Core), в этот момент выключено, а сами ядра удерживаются в состоянии reset. Чтобы привести их в действие ведущее ядро должно включить подачу тактового сигнала и запустить сами ядра. Делается это по аналогии с настройкой тактирования периферийных блоков изменением соответствующих регистров блока System Control (в зависимости от производителя название может отличаться).
Обычно тактирование ядер как в ассиметричной, так и в симметричной схемах осуществляется независимо. Разные ядра могут работать на разных частотах. В процессе работы отдельные ядра могут переходить в спящий режим для экономии энергии.
Стоит отметить, что сами ядра могут быть разными, в частности могут относиться к разным семействам. Часто в одном устройстве располагают простые ядра, обеспечивающие высокую энергоэффективность (Cortex M0), и более продвинутые ядра, предназначенные для сложных вычислений (Cortex M4 / M7).
История создания языка C (Си)
Язык программирования C (Си) появился «стихийно» – ни одна компания не заказывала создания подобного языка. Его первая версия появилась на свет в 1972 г. в фирме Bell Laboratories, написал ее теперь уже всемирно известный программист Деннис Ритчи (Dennis MacAlistair Ritchie).
Ритчи рассчитывал, что созданный им язык программирования будет востребован в операционной системе UNIX, которая тогда была еще новинкой. Конечно, создавать новый язык Ритчи помогали и другие его коллеги программисты, но именно он внес наибольший вклад в становление этого языка. К новому языку первоначально не выдвигалось никаких требований, перед ним не ставилось никаких задач, фактически он возник как результат дружеского соревнования между небольшим кругом программистов.
Название C (Си) появилось так же стихийно, как и сам язык. Фактически, он стал преемником ранее созданного языка В (Би), разработанного автором операционной системы UNIX Кеном Томпсоном. В свою очередь, язык Би во многом был похож на языке BCPL, разработанный в Кембриджском университете. А язык BCPL основывался на идеях «старого как мир» Алгола-60.
Первым неформальным стандартом языка Си стало издание в 1978 г. книги Брайана Кернигана и Денниса Ритчи с названием «The ‘C’ Programming Language». Первоначально книга была издана в США, но потом была переведена и многократно переиздавалась во многих других странах мира. В 1989 г. язык Си был стандартизован ANSI (American National Standards Institute – американский национальный институт стандартов) и ISO (International Standard Organization — международная организация по стандартизации).
Но время шло и у пользователей языка Си появилась потребность в реализации новых функций, не поддерживавшихся языком. Учитывая все это, Бьерн Страуструп в начале 80-х (работавший все в той же самой Bell Laboratories) принял решение о расширении возможностей языка Си, который первоначально назвали как «Си с классами». Но в дальнейшем за его модификацией языка закрепилось другое название — Си++. Это название сохранилось за ним вплоть до настоящего времени.
Общие сведения о языке C (Си)
В настоящие дни C (Си) является многофункциональным языком программирования высокого уровня, подобным таким языкам как Pascal или Python, но в отличие от них он имеет возможность работы с командами низкого уровня, подобно языку ассемблера. Программу на языке С можно скомпилировать в машинный код практически для любого известного микропроцессора. Не исключением стали и микроконтроллеры – сейчас по популярности использования (особенно для начинающих) язык Си обогнал в них доминировавший до этого язык ассемблера. Программирование на языке С поддерживает и самая популярная в настоящее время программная платформа Atmel Studio (!!!!!!) для микроконтроллеров семейства AVR.
Сейчас уже можно с уверенностью сказать, что язык С стал своеобразным фундаментом, на котором строится все современное программирование – чего стоят хотя бы «Visual C» и «C Sharp». Основанные на нем языки программирования сейчас занимают доминирующее положение в мире программирования. А все началось с удачной структуры языка, разработанной в 1972 г. Деннисом Ритчи.
Файлы программ на языке Си имеют расширение .C, а простейшая структура программы выглядит следующим образом.
#include <avr/io.h> /* заголовок */
int main(void) /* главная функция: начало программы */
{ /* открывающая скобка в начале программы */
оператор программы;оператор программы;…оператор программы;
} /* закрывающая скобка в конце программы */
Комментарии являются необязательным элементом программы, но они крайне желательны для лучшего понимания ее сути.
Питание микроконтроллера
Для работы микроконтроллеру, как и любому электронному устройству, необходима энергия. Напряжение МК Atmel AVR находится в диапазоне 1.8–5.5 Вольт и зависит от модели и серии. Большинство приборов работает от 5 Вольт. Но встречаются и низкочастотные модели (Attiny 2313), нижняя граница у которых от 1,8 В.
Кроме того, на работу МК влияет и частота поступающего тока. Низкое напряжение требует и низких пределов частот. Чем выше частота, тем быстрее работают определенные модели.
Так, чтобы обеспечить работу контроллеров серии AVR, на все плюсовые входы нужно подавать 5 В, а нулевой заземляют.
На аналогово-цифровой преобразователь питание подают через дополнительные фильтры. Это поможет избавиться от помех, которые могут изменять показания напряжения. При этом на плюсовой ввод подается напряжение через фильтрующий дроссель. А нулевые выводы разделяют на цифровые и аналоговые. Причем соединяться они могут только в одной точке.
Кроме того, необходимо установить и конденсаторы, лучше керамические, из расчета 1 на 100 нанофарад.
QFN корпус
Наиболее экзотическим с точки зрения любительской практики является корпус QFN (Quad Flat No—leads). Такой корпус имеет наименьшие габариты среди всех рассмотренных корпусов. В качестве выводов здесь используются контакты, расстояние между которыми в 6 раз меньше, чем в DIP корпусах. По этой причине они редко применяются радиолюбителями. Одна в промышленности такие корпуса находят широкое применение, поскольку габариты готового электронного устройства можно снизить в десятки раз. На рис.4 наглядно видно различия в габаритах одного и того же микроконтроллера (ATmega8) в DIP и QFN корпусах.
Рис. 4 – Микроконтроллер ATmega8 в DIP и QFN корпусах
Для сравнения микроконтроллеры в корпусах различных типов показаны на рис. 5. Мы же будем пользоваться микроконтроллерами исключительно в PID корпусах, по крайней мере, на начальных этапах программирования.
Рис. 5 – Микроконтроллеры в разных типах корпусов
Создание прошивки для ядра 0
Прошивки для двух ядер можно писать и отлаживать независимо. Сначала напишем прошивку для ядра CPU0.
На данном этапе порядок создания и настройки проекта стандартный.
Создать новый проект для языка C: Project > Create New Project. Выбрать C / main. В названии проекта имеет смысл подчеркнуть, что он относится к ядру 0, поскольку для второго ядра будет создан другой проект. Я назвал проект CPU0.
Сохранить рабочее пространство: File > Save Workspace.
В свойствах проекта во вкладке General Options > Target указать микроконтроллер.
Здесь появляется первая особенность: из списка устройств нужно выбрать не только микроконтроллер, но и ядро, которое будет использоваться в данном проекте.
Во вкладке General Options > Library Configuration поставить галочку Use CMSIS.
В настройках компилятора (C/C++ Compiler > Preprocessor) указать путь до заголовочного файла с макроопределениями для используемого семейства микроконтроллеров: . Здесь же в поле Defined symbols прописать (нужно для того, чтобы подключились правильные заголовочные файлы).
Во вкладке Linker > Config поставить галочку Override default и указать путь до конфигурационного файла компоновщика из SDK (находится в папке ).
Во вкладке Debugger > Setup в качестве отладчика (Driver) установить CMSIS DAP
Проверить, что во вкладке Debugger > Download стоят галочки Verify Download и Use flash loader(s).
Добавить в проект файлы и (можно найти в папках и соответственно)
Важно обратить внимание, что для разных ядер эти файлы будут разными.
Добавить код для мигания светодиодом, подключенным к ножке .
Скомпилировать, запустить, проверить, что всё работает
Возраст
Начнём с главного: когда уже (ещё) можно начать прокладывать свой путь в профессию? Ответ предсказуем: чем раньше, тем лучше. И изобилие специальных наборов для детей к этому располагает. Даже дело не в том, что с возрастом вам будет сложнее перестраиваться и обучаться этой дисциплине. Просто опыт, как и во многих других IT-профессиях, здесь играет решающее значение.
Но не всё так плохо. Всё же в России этот рынок не очень развит. Начав путь разработчика ПО для МК после 30, вы сможете сделать неплохую карьеру в какой-то одной сфере или конкретном месте деятельности. Если, конечно, не пытаться стать «многостаночником». Всегда бывают исключения, но многое зависит от вашей прошлой деятельности
Наверное, стоит принять во внимание, что даже 10 лет в этой профессии не впечатляют работодателя
Межъядерное взаимодействие
Механизмы межъядерного взаимодействия обычно осуществляются посредством выделенного периферийного блока. У разных производителей этот блок называется по-разному. В микроконтроллерах STM32 этот блок называется Hardware Semaphore (HSEM), в NXP – Inter-CPU mailbox, в Cypress – Inter-Processor Communication Block (IPC). Устройство этих блоков немного отличается, но можно выделить два основных механизма.
Первый механизм позволяет отправлять сигналы другим ядрам посредством запросов на прерывания и иметь некоторую гарантию доставки этих сигналов. У каждого ядра есть специальный «почтовый ящик» (mailbox). Это регистр, к которому имеют доступ все остальные ядра. При записи числа в этот регистр NVIC соответствующего ядра получит запрос на прерывание. Передаваемое вместе с прерыванием число может трактоваться как код команды, как набор бит, кодирующих независимые действия, или как что-то ещё (определяется программистом).
Второй механизм – это специальные регистры, которые поддерживают атомарную операцию чтения с последующим изменением значения. В простейшем случае такие регистры обнуляют своё значение при чтении. Такие регистры позволяют организовать контроль доступа к общим ресурсам. Например, установленная единица означает, что ресурс свободен. Если ядру требуется захватить ресурс, производится считывание регистра. Если ресурс был захвачен ранее, возвращается ноль. Если ресурс свободен, возвращается единица, а значение регистра сразу же обращается в ноль. Гарантируется, что при одновременном чтении только одно из ядер получит единицу. При освобождении ресурса, ядро должно записать единицу обратно в регистр. Пример опроса такого регистра двумя ядрами изображён на рисунке ниже.
Здесь были рассмотрены только базовые механизмы. В различных микроконтроллерах соответствующие блоки могут иметь ряд дополнительных функций.
Совместная отладка
У нас получилось запустить прошивки для разных ядер. Но современные среды разработки позволяют осуществлять отладку при одновременном запуске прошивок на двух ядрах. В некоторых случаях одновременная отладка двух ядер может оказаться полезной.
Чтобы воспользоваться таким режимом отладки, нужно сделать несколько дополнительных настроек:
- Перейти в проект ведомого ядра (ядро 1).
- Включить сохранение бинарного файла прошивки. Для этого нужно перейти во вкладку Converter > Output, поставить галочку Generate Additional Output и выбрать формат Raw binary.
- Во вкладке Debugger > Download снять галочку Verify Download. При совместной отладке двух ядер эта проверка работает некорректно и мешает запуску.
- Сохранить настройки и собрать проект.
- Перейти в проект ведущего ядра (ядро 0).
- В свойствах проекта перейти во вкладку Debugger > Multicore, выбирать вариант Simple и указать необходимые параметры проекта ведомого ядра.
- Перейти во вкладку Linker > Input и подключить к проекту файл прошивки ведомого ядра. Для этого нужно задать имя символа (задаётся произвольным образом). В данном примере задано имя , привязать к этому символу бинарный файл, который был получен в результате сборки проекта для ядра 1, указать секцию и выравнивание .
- Теперь можно сохранить настройки и запустить отладку. Если всё настроено правильно, при запуске отладки из проекта ведущего ядра должен открыться второй экземпляр среды разработки с проектом для ведомого ядра. Всё это занимает достаточно много места на экране, поэтому второй монитор может оказаться очень кстати.
В режиме совместной отладки в IAR появляется специальная панель, которая позволяет управлять отладкой сразу нескольких ядер.
Популярные ошибки
Если возникает ошибка , скорее всего проект ведомого ядра не скомпилирован. Нужно сначала собрать проект для CPU1 и только после этого запустить отладку проекта для CPU0.
Если при запуске отладки Вы получили ошибку
скорее всего, Вы забыли снять галочку Verify download на шаге 3. Нужно проверить, что она снята, пересобрать проект ведомого ядра и попробовать запустить совместную отладку снова.
Если отладка работает странно: некорректно работают условные переходы, не происходит вызовов функций, не работают точки останова, возможно, используемая отладочная информация не соответствует исполняемому коду. Первым делом нужно пересобрать проект ведомого ядра. Также нужно проверить настройки, сделанные на шагах 6 и 7. Если они не согласованы друг с другом (в настройках компоновщика указан бинарный файл одного проекта, а в настройках отладчика указан другой проект), явных ошибок при запуске может не возникнуть, отладка будет работать, но поведение будет некорректным. Нужно проверить соответствие бинарного файла в настройках компоновщика проекту, указанному в настройках отладчика.
Основные критерии выбора
Для того чтобы выбрать микроконтроллер составим список нужных нам критериев:
Стоимость микроконтроллера должна быть низкой
Он должен быть простым в использовании и хорошо поддерживаться
Важно наличие доступной документации
Он должен программироваться в графической среде
Он должен быть популярен и иметь активное сообщество пользователей
Так как наш робот будет использовать два двигателя и различные датчики, то микроконтроллеру понадобится как минимум два порта для управления двигателями и несколько портов для подключения датчиков. Также должна быть возможность для расширения количества подключаемых устройств в будущем.. микроконтроллер Lego Mindstorms EV3
микроконтроллер Lego Mindstorms EV3
Этим критериям соответствует модуль EV3 из набора Lego Mindstorms EV3.
Ассемблер
Ассемблер является языком самого низкого уровня. При этом он позволяет наиболее полно раскрыть все возможности микроконтроллеров и получить максимальное быстродействие и компактный код. В некоторых случаях альтернативы ассемблеру нет, но тем не менее он имеет множество недостатков. Несмотря на получаемую компактность машинного кода, программа, написанная на языке Ассемблер, громоздка и труднопонимаема. Для ее создания требуется отличное знание архитектуры и системы команд микроконтроллеров.Ассемблер отлично подходит для программирования микроконтроллеров, имеющих ограниченные ресурсы, например 8-ми битных моделей с малым объемом памяти. Для больших программ и тем более 32-разрядных контроллеров, лучше использовать другие языки, отличающиеся более высоким уровнем. Это позволит создавать более сложные и при этом понятные программы.
Основные узлы микроконтроллера
Микроконтроллер состоит из центрального процессора (ЦП, CPU), энергонезависимой памяти, энергозависимой памяти, периферийных устройств и вспомогательных цепей.
Центральный процессор (CPU)
Центральный процессор выполняет арифметические операции, управляет потоком данных и генерирует управляющие сигналы в соответствии с последовательностью инструкции, созданных программистом. Эта чрезвычайно сложная схема, необходимая для функциональности процессора, разработчику не видна. Фактически, благодаря интегрированным средам разработки и языкам высокого уровня, таким как C, написание кода для микроконтроллеров часто является довольно простой задачей.
Память
Энергонезависимая память используется для хранения программы микроконтроллера, то есть (часто очень длинного) списка инструкций машинного языка, которые точно указывают процессору, что делать. Обычно вместо «энергонезависимой памяти» вы будете видеть слово «flash» («флеш»), которое относится к определенному типу энергонезависимого хранилища данных.
Энергозависимая память (то есть ОЗУ, RAM) используется для временного хранения данных. Эти данные теряются, когда микроконтроллер теряет питание. Внутренние регистры также обеспечивают временное хранение данных, но мы не рассматриваем их как отдельный функциональный блок, поскольку они интегрированы в центральный процессор.
Периферийные устройства
Мы используем слово «периферия» для описания аппаратных модулей, которые помогают микроконтроллеру взаимодействовать с внешней системой. Следующие пункты описывают различные категории периферийных устройств и приводят их примеры.
-
Преобразователи данных: аналого-цифровой преобразователь, цифро-аналоговый преобразователь, генератор опорного напряжения.
Данный график демонстрирует данные трехосевого акселерометра, оцифрованные с помощью встроенного АЦП микроконтроллера
- Генерирование тактовых сигналов: внутренний генератор, схема на кварцевом резонаторе, петля фазовой автоподстройки частоты.
- Расчет времени: таймер общего назначения, часы реального времени, счетчик внешних событий, широтно-импульсная модуляция.
- Обработка аналоговых сигналов: операционный усилитель, аналоговый компаратор.
- Ввод/вывод: цифровые входные и выходные цепи общего назначения, параллельный интерфейс памяти.
- Последовательная связь: UART, SPI, I2C, USB
Вспомогательные цепи
Микроконтроллеры включают в себя множество функциональных блоков, которые не могут быть классифицированы как периферийные устройства, поскольку их основная цель не состоит в управлении, мониторинге или обмене данными с внешними устройствами. Тем не менее, они очень важны – они поддерживают внутреннюю работу устройства, упрощают реализацию и улучшают процесс разработки.
- Схема отладки позволяет разработчику тщательно контролировать микроконтроллер во время выполнения инструкций. Это важный, а иногда и необходимый метод отслеживания ошибок и оптимизации производительности прошивки.
-
Прерывания являются чрезвычайно ценным видом работы микроконтроллера. Прерывания генерируются внешними или внутренними аппаратными событиями и заставляют процессор немедленно реагировать на эти события, выполняя определенную группу инструкций.
Программы микроконтроллера, написанные на C, организованы в функции. Прерывание заставляет выполнение программы «переходить» в процедуру обработки прерывания (ISR), и после того, как ISR завершил выполнение своих задач, процессор возвращается к функции, которая выполнялась, когда произошло прерывание. - Модуль генерирования тактового сигнала можно считать периферийным устройством, если он предназначен для генерирования сигналов, которые будут использоваться вне микросхемы. Но во многих случаях основная цель внутреннего генератора микроконтроллера состоит в том, чтобы предоставить тактовый сигнал для центрального процессора и периферийных устройств. Внутренние генераторы часто имеют низкую точность, но в приложениях, которые могут допускать эту низкую точность, они являются удобным и эффективными способом упростить конструкцию и сэкономить место на плате.
- Микроконтроллеры могут включать в себя различные типы схем электропитания. Интегрированные стабилизаторы напряжения позволяют в самой микросхеме генерировать необходимое напряжение питания, модули управления питанием могут использоваться для значительного снижения потребления тока устройством в неактивных состояниях, а модули супервизора могут переводить процессор в состояние сброса, когда напряжение питания недостаточно высоко, чтобы обеспечить надежную работу.
Система прерываний
Каждое ядро имеет собственный контроллер прерываний (NVIC). Поэтому все внутренние прерывания ядер настраиваются и работают полностью независимо. Что же касается запросов на прерывания, которые поступают из периферийных блоков, то они идут по общим линиям, которые параллельно подключены к блокам NVIC. Каждый периферийный блок может генерировать только один сигнал, который получат блоки NVIC сразу всех ядер. Для каждого ядра можно независимо настроить вектора, которые должны обрабатываться: назначить обработчики, задать приоритеты, включить/выключить обработку. Но настроить периферийные блоки так, чтобы они отправляли разные запросы разным ядрам, не получится. Например, не получится настроить блок GPIO так, чтобы по нарастающему фронту срабатывал обработчик в одном ядре, а по спадающему фронту на той же ножке запускался обработчик в другом ядре, поскольку эти события практически во всех микроконтроллерах используют одну общую линию.
Литература
На прошлой неделе, подачи одного из пользователей GeekBrains, я всерьёз задумался над вопросом “Где можно пройти курсы по программированию микроконтроллеров?”, да и вообще о профильной литературе в целом (и это несмотря на профильное высшее образование и около 10 лет опыта работы). Дело не в том, что их не существует (есть и курсы, и книги), просто главный инструмент разработчика ПО для МК — техническая документация, поставляемая вместе с платформой.
Все универсальные книги могут описать отличия, преимущества и недостатки тех или иных микроконтроллеров, на что обратить внимание при написании кода, обучить “красоте” и основным принципам. Но огромный плюс и он же главный недостаток данной профессии — подробная индивидуальная инструкция по работе с каждым более-менее серьёзным контроллером
Это означает, что абсолютно любой человек может взять, прочитать её и через несколько мгновений организовать стандартное мигание “светодиодами”. Но даже с 50 годами стажа вы не сможете сесть за незнакомый микроконтроллер и, не читая документацию, сделать с ним что-то полезное (придётся, как минимум взглянуть на расположение контактов и их назначение по умолчанию).
Возможности и особенности микроконтроллеров
Так что же могут микроконтроллеры? Благодаря тому что микроконтроллер является маленьким компьютером — его возможности очень широки. К примеру, микроконтроллеру можно поручить измерение разнообразных величин, обработку различных сигналов и управление широким спектром разных девайсов. Во многом возможности микроконтроллеров ограничены только вашим воображением и умениями работать с ними. Но у микроконтроллеров есть и определенные особенности, одной из которых является то, что все микроконтроллеры поступают с завода в продажу «пустые», то есть, если на них подать напряжение, то мы не получим ровным счетом ничего. Просто кусок кремния. Для того, что бы микроконтроллер начал выполнять какие-то операции, начиная с включения светодиода, заканчивая ШИМ-регулированием напряжения — ему нужно «объяснить» как это сделать, т.е. прошить микроконтроллер исполняющей программой, которую можно написать на ассемблере или на Си.
Многие, наверняка, уже догадались, что можно сделать с микроконтроллерами, дочитав для этого момента. Конечно же, их можно и нужно применять в компьютерном моддинге! Поскольку так называемым «обвесом» микроконтроллера (набором электродеталей, периферией и т.д.) может быть практически всё (реле, транзисторы, светодиоды, индикаторы, LCD дисплеи и многое другое), в зависимости от нужных функций микроконтроллера (сигнализация, управление), то и возможности использования микроконтроллеров в моддинге поистине безграничны. Коротко перечислим некоторые из них.
Микроконтроллеры можно «научить» считывать сигнал с таходатчика (датчика скорости вращения) вентилятора или помпы и выводить значения на LCD или индикаторный дисплей. Таким же образом микроконтроллер может послужить для вычисления основных электрических величин: сопротивления, напряжения и силы тока. Всё это так же можно вывести на LCD дисплей.
Если к микроконтроллеру подключить необходимый датчик, то из него можно сделать термометр на светодиодных индикаторах, который отлично впишется в ваш проект, а затраты на изготовление будут минимальными (до 4 у.е.)!
Термометр на основе светодиодных индикаторов
Если приловчиться, изучить микроконтроллеры более детально и освоить необходимый язык программирования, то можно написать программу для ШИМ-регулятора, который, в свою очередь, будет управлять скоростью вращения корпусных вентиляторов.
Так же можно использовать микроконтроллеры как средство вывода информации о загрузке процессора, оперативной памяти или заполненности винчестера на тот же LCD дисплей, который органично впишется в любой дизайн.
Индикатор, собранный на основе микроконтроллеров
Установка 0 в произвольном бите регистра порта
Если мы хотим сконфигурировать отдельно вывод (контакт) PD2 как вход, то необходимо в соответствующий бит регистра DDRD записать 0. Для этого можно использовать следующую команду.
DDRD &= ~(1<<2);
В этом случае результат сдвига единицы на две позиции влево инвертируется с помощью операции побитного инвертирования, которая в языке С обозначаемой знаком «~».
В результате операции инверсии мы получаем вместо нулей единицы, а вместо единиц — нули. Данная логическая операция также называется операцией НЕ (английское название NOT).
Итак, в результате операции (1<<2) мы получили число 00000100, следовательно после проведения инверсии («~») мы получим число 11111011.
Получившееся число при помощи операции побитного логического умножения & умножается на число, хранящееся в регистре DDRD, и результат затем записывается в регистр DDRD.
Логическое умножение, по другому называемое операцией И (английское название AND), выполняется по следующим правилам:0*0=00*1=01*0=01*1=1
То есть если хотя бы один из операндов операции равен 0, то и результат операции равен 0.
Таким образом, сдвинутая нами влево на две позиции единица (1<<2) превращается при инвертировании («~») в ноль и умножается на соответствующий бит регистра DDRD, поэтому каким бы не было состояние данного бита, то при операции умножения на 0 данный бит становится равным 0. Схематично данный процесс представлен на следующем рисунке.