Изучение основ микроконтроллеров

Попробуйте наш инструмент устранения неполадок





В микросхемах микроконтроллеров замечательно одно: они доступны почти во всех частях мира и у розничных продавцов электроники.

Вступление

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



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

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



Это устройство предназначено для выполнения серии команд для формирования программы.

Язык программы, которую вы здесь увидите, - C ++. В этом курсе вы сможете более подробно выучить этот язык.

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

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

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

Детали распиновки

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

Начиная с этого штифта, вы найдете 20 штифтов вверх вниз с этой стороны (слева) и еще 20 контактов с другой стороны (справа), продолжая снизу вверх с правой стороны.

Первые 8 контактов, начинающиеся с выемки, - это PBO-7, которые образуют индексные контакты IC, так как здесь вся программа начинается с нулевого индекса.

Вышеупомянутая серия выводов называется ПОРТОМ B, в то время как есть другие идентичные наборы портов, назначенные от A до D.

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

Два контакта, которые входят в общую категорию, - это контакты (+) / (-), которые также обозначаются как Vdd и GND.

Один вывод от ПОРТА D (PDO-6) можно увидеть, расположенный на левой стороне микросхемы в нижней части.

PD7, который является контактом №7 ПОРТА D, можно было проследить отдельно от правого ряда выводов.

Теперь, двигаясь от правой стороны фишки, где заканчивается ПОРТ D, ПОРТ C начинает свой счет в порядке возрастания.

Они вносят свой вклад во многие интересные контакты MCU, от аналоговых до цифровых.

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

Вышеупомянутые контакты составляют ПОРТ A.

Аналогово-цифровое преобразование на вышеуказанных выводах можно понять с помощью примера, в котором аналоговый уровень температуры, обнаруживаемый с помощью обычного датчика, такого как термистор, применяется к одному из выводов PORT A, который легко принимается и конвертируется MCU. для получения цифрового отсчета от нуля до 255 градусов по Фаренгейту (8-битное число, которое может быть обновлено для достижения 10-битного вывода).

Еще одна особенность, которая может быть засвидетельствована в MCU дополнительно, - это доступное пространство для программирования или память, которая определяет пространство для переменных и программы, указанных для микроконтроллера.

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

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

К настоящему времени вы могли в какой-то степени понять концепцию микроконтроллера, а также его порты и контакты.

Как создать коннектор SPI от программатора к микроконтроллеру

Пришло время углубиться в предмет и исследовать мир программирования.

Сказав это, прежде чем приступить к процедуре загрузки программы в чип, нам нужно найти правильный способ интеграции разъема SPI (Serial Peripheral Interface) с MCU.

Однако даже после этого мы не можем просто вставить SPI в распиновку MCU, не так ли? Мы также не можем позволить удлиненным проводам от SPI напрямую вставляться в макетную плату. Это также может привести к неправильной настройке проводов, связанной с неправильными контактами, создающими плохие соединения.

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

Таким образом, вышеупомянутая сборка теперь образует удобную и надежную промежуточную платформу для соединения SPI с MCU.

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

Может существовать множество компаний, которые производят и продают эти программаторы, поэтому их приобретение не должно быть проблемой для вас, например Adafruit Industries, USBtinyISP или Sparkfun и т. Д.

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

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

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

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

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

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

Чтобы упростить задачу, давайте рассмотрим следующие детали подключения, обратившись к изображению выше:

Вывод SPI, начиная с верхнего левого угла, идет к «Master IN, Slave OUT» (MISO)

Вывод SPI из центра слева соединяется с выводом часов (SCK)

Вывод SPI в нижнем левом углу соединяется с кнопкой Reset. (Мы подробно узнаем об этой булавке в следующих уроках)

SPI, относящийся к правому нижнему углу, соединяется с выводом GND MCU, GND относится к выводу, который формирует нулевую линию питания или отрицательную (относительную) шину питания.

SPI, выходящий из среднего правого заголовка, соединяется с контактом «Master Out, Slave IN» (MOSI) MCU.

SPI, выходящий из верхнего правого заголовка, подключен к (+) MCU, который, очевидно, является Vdd или положительным контактом питания MCU.

Вот и все.

Подключите два разъема, как описано, и ваша интерфейсная плата SPI готова к необходимым действиям.

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

Я надеюсь, что вы, возможно, уже создали интерфейс SPI, как объяснено в предыдущем руководстве, и теперь пришло время убедиться, что наш компьютер принимает программатор, который нам нужно интегрировать между ПК и MCU.

Создание простого программного кода для MCU

Возьмем блок USBTinyISP от Sparkfun для связи компьютера с микроконтроллером.

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

Давайте посмотрим на процедуры, необходимые для установки драйверов в ОС вашего компьютера, здесь мы возьмем пример ОС Windows 7 с 32-разрядными или 64-разрядными спецификациями.

Откройте sparkfun.com и щелкните «страницу карманного программатора AVR». Ссылку можно легко визуализировать на странице.

Затем найдите «Драйвер Windows» в документах и ​​просто щелкните по нему.

Это предоставит вам файл pocketprog-driver.zip на вашем компьютере.

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

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

Для 64-разрядной версии следуйте этим инструкциям, для 32-разрядной версии просто игнорируйте:

Погуглите «libusb sourceforge» и нажмите на эту ссылку последней версии.

Вы могли бы встретить несколько дополнительных файлов, однако вам было бы интересно найти файл bib, а именно: libusb-win32-bin - #. #. #. #. Zip

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

В этой папке перейдите по папке bin, переходя к папке amd64.

Здесь вы увидите несколько папок: ghcalled libusb0.dll и libusb0.sys.

Вы можете переименовать их как libusb0_x64.dll и libusb0_x64.sys.

Теперь вам нужно будет скопировать указанные выше файлы в папку pocketprog-driver, просто перезаписав файлы существующей версии.

Для установки указанных выше драйверов вас заинтересует следующий метод, довольно нестандартный по своему характеру:

Это режим «добавления устаревшего оборудования».

Нажмите 'Пуск'.

Затем продолжите, щелкнув правой кнопкой мыши «компьютер».

Нажмите «Управление» и, наконец, нажмите «Диспетчер устройств».

Затем в меню выберите «Добавить устаревшее оборудование».

Продолжайте нажимать «Далее», пока мастер не будет вставлен

Следуя инструкциям, нажмите «Установить оборудование, которое вам нужно будет выбрать из расширенного списка», при этом появится значок переключателя для этого конкретного выбора. На самом деле это кнопка управления Windows, которая теперь будет выглядеть как крошечный кружок с округлой синей рамкой внутри.

Теперь просто нажмите «Далее».

Это покажет вам меню «Показать все устройства», которое вам нужно будет щелкнуть.

После этого нажмите значок «Установить с диска».

С помощью значка «Обзор» перейдите в папку с драйвером pocketprog. Если вы правильно сделали выбор, вы визуализируете файл pocketprog.inf, помещенный в эту конкретную папку.

Дважды щелкните этот файл, и вы наверняка увидите, как драйвер устанавливается на ваш компьютер.

Конец связи!! Давайте перейдем к следующему руководству на следующей странице.

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

Как перенести программу в микросхему микроконтроллера

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

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

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

AVRdude - это программа, связанная с последней установкой WinAVR, без которой фактическая передача файла в MCU невозможна.

Эта программа представляет собой файл в формате .hex, который, по сути, становится понятным для MCU для выполнения необходимых операций.

Если проверка не удалась, программист не сможет выполнить передачу файла.

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

Откройте приглашение DOS (дисковая операционная система), щелкнув «меню Пуск» и набрав cmd.exe в поле поиска.

Теперь выполнить AVRdude можно, просто набрав avrdude –c usbtiny –p m32 в командной строке DOS. Как только это будет реализовано, DOS немедленно подтвердит, было ли соединение успешным.

В приведенной выше команде «-c» - это флаг уведомления, который включает в себя спецификацию параметра программиста «usbtiny», а тег «-p» идентифицирует устройство микроконтроллера («m32 указывает на Atmega32).

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

После завершения описанной выше процедуры вы можете ввести «exit» в командной строке DOS, и это выведет вас из окна.

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

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

Номинал резистора можно рассчитать по следующей простой формуле:

R = (Ub - LEDfwd) / I

Где Ub - напряжение питания, LEDfwd - оптимальное рабочее напряжение используемого светодиода, а I - его оптимальный ток.

Предположим, мы используем КРАСНЫЙ светодиод с прямым напряжением светодиода = 2,5 В и током I = 20 мА, приведенное выше уравнение можно решить следующим образом:

Поскольку напряжение от MCU будет 5 В, это можно выразить как:

R = (5 - 2,5) /. 02 = 125 Ом, ¼ ватта, ближайшее значение 120 Ом будет достаточно.

Теперь у нас есть светодиод, резистор на 120 Ом и плата Veroboard, просто соедините вышеуказанные компоненты, как показано на схеме, с микроконтроллером.

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

Далее, программирование MCU.

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

Как установить среду программирования и изучить WinAVR

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

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

В конечном итоге это будет поддерживаться WinAVR и перенесено в соответствующий чип MCU.

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

Вы хотели бы, чтобы курс установки WinAVR был чрезвычайно быстрым и быстрым. Давайте углубимся в детали, отметив следующие моменты:

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

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

Загрузите файл и начните процесс выполнения, щелкнув по нему. Позвольте установке начаться.

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

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

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

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

В следующем руководстве будет рассмотрено тестирование указанного выше программатора, чтобы мы могли быть уверены в его совместимости с Windows и в том, идеально ли он «пожимает руку» вашей ИС микроконтроллера.

Как запрограммировать MCU для включения светодиода

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

Конечно, теперь мы готовы реализовать нашу первую программу внутри MCU, но до этого было бы интересно быстро резюмировать то, что мы делали в ходе наших предыдущих руководств:

Мы приобрели микроконтроллер AVR Atmel в соответствии с нашей требуемой спецификацией, здесь мы использовали ATMega32 для иллюстраций. Далее мы узнали об основах микроконтроллера и программаторе, который отвечает за передачу программы в микросхему MCU.

Далее мы построили интерфейсный разъем SP, который необходим для того, чтобы ваш компьютер мог быть связан с микроконтроллером для программных действий.

После этого мы подтвердили, правильно ли были установлены драйверы на компьютер как для 32-битной, так и для 64-битной операционной системы.

Затем мы установили среду программирования Win AVR для облегчения записи и передачи кодов в микроконтроллер, после чего была реализована avrdude для проверки программатора с вашим ПК и микроконтроллером, соединенным между собой.

Наконец, в предыдущей главе мы закончили создание схемы светодиод / резистор и соединили ее с соответствующими выходами микроконтроллера.

Это действительно большая работа, но пора сразу же заняться настоящим программированием!

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

Контроль, обнаружение и связь

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

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

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

Продолжить текущую работу, заставить MCU управлять светодиодом, на самом деле довольно просто:

Для этого мы приказываем контакту 0 на ПОРТУ B производить необходимые 5В для светодиода.

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

К этому выводу MCU необходимо адресовать две важные вещи: 1) выход и 2) 5 вольт.

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

Как только он настроен на выход микросхемы, мы можем указать ему либо «высокий» (5 В), либо «низкий» (0 В), в зависимости от требований приложения.

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

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

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

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

Для назначения вывода в качестве выхода нам необходимо использовать регистр направления данных (DDR). Если вам интересно, что здесь означает регистр, это просто пространство в MCU, которое позволяет микроконтроллеру реагировать определенным образом.

Используя DDR, мы можем настроить контакт либо на отправку данных, которые похожи на «вывод», либо на прием данных в форме «ввода».

Как бы то ни было, что вы можете озадачить насчет этого слова? Данные добавляют третье измерение к контактам, которым может быть назначено постоянное значение логического нуля (0 В) или высокого логического уровня (5 В), но как насчет сигналов, которые могут быстро меняться, например, частоты импульсов. Частота будет сопровождаться высокой и низкой логикой (5 В и 0 В), колеблющейся с некоторыми заданными интервалами или периодами, таким образом, она становится ориентированной на время и может быть скорректирована по времени, поэтому мы идентифицируем как «данные», что означает параметр, который указывает функция относительно другой функции (логические состояния и время).

Один из способов назначить pin0 в качестве выхода - написать следующий код:

DDRB = 0b00000001

В приведенной выше программе DDRB означает регистр направления данных для ПОРТА B 0b инструктирует компилятор относительно следующего двоичного выражения числа, в то время как «1» в конце выражения указывает положение pin0, то есть его положение в форме первого штифта ПОРТА Б.

Если вы помните, мы узнали, что ПОРТ B связывает с ним 8 контактов (от 0 до pin7), и если вы заметили, что в приведенном выше коде также есть 8 цифр, то есть каждая цифра обозначает эти 8 контактов ПОРТА B.

Теперь следующая процедура - назначить 5В на этот вывод (pin0). Опять же, принцип работы идентичен принципу работы DDR, как указано выше, и выражается через следующий двоичный код:

PORTB = 0b00000001

Как видно, единственная разница между приведенным выше кодом и предыдущим состоит в том, что в этом коде мы использовали регистр PORT. Этот регистр специально обрабатывает назначения контактов того конкретного порта, для которого он был расположен внутри MCU. Таким образом, это позволяет нам назначить логику реальных данных (0 или 1) для этих выводов.

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

«Основная» функция здесь - это место, где каждая из программ C / C ++ инициирует выполнение. Поэтому основной может быть создан как:

int main (пусто)
{
}

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

#включают
int main (пусто)
{
}

Как только начинается компиляция, секция препроцессора компилятора сосредотачивается на каталоге AVR, чтобы идентифицировать файл «io.h». Расширение «.h» здесь указывает, что это файл заголовка, и что этот код внутри файла будет помещен в начало (заголовок) исходного файла, который создается, отсюда и название «заголовок».

Здесь мы можем ввести в наш код операторы DDR и PORT, потому что добавление файла заголовка io.h направило бы компилятор на их рассмотрение.

#включают

int main (пусто)

{

DDRB = 0b00000001 // Регистр направления данных, устанавливающий вывод 0 на вывод, а остальные выводы как ввод

PORTB = 0b00000001 // Установите pin0 на 5 вольт

}

Вышеуказанное фиксирует ориентацию pin0 как выхода, имеющего величину 5V. Однако есть еще одна проблема, которая не определена для этого вывода, а именно: этот вывод еще не получил указание на включение на неопределенный срок, пока на MCU подается питание. Этот бесконечный контур обратной связи гарантирует, что этот вывод от MCU не отключится, а будет продолжать с выходом 5 В неограниченное время.

Несмотря на то, что существует множество различных методов применения инструкции цикла для вывода, мы бы попробовали использовать здесь цикл «while». Как следует из названия, цикл «while» сообщает микроконтроллеру, что «пока» питание доступно, вам необходимо оставаться активированным с назначенными 5 В для назначенной распиновки.

#включают

int main (пусто)

{

DDRB = 0b00000001 // Регистр направления данных, устанавливающий вывод 0 на вывод, а остальные выводы как ввод

PORTB = 0b00000001 // Установите pin0 на 5 вольт

пока (1)

{

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

}

}

Возможно, вы захотите отметить, что здесь мы использовали «1» в форме аргумента для цикла «while», поскольку все, кроме «0», можно считать логическим «истиной».

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

Можно наблюдать, как светодиод постоянно горит на назначенном контакте, пока MCU получает питание через свои Vdd и Vss.

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

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

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

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

Как заставить светодиод мигать с помощью микроконтроллера AVR

В последнем обсуждении мы узнали, как включить светодиод через микроконтроллер, это было замечательно, не так ли? Может быть, не так уж и много!

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

Давайте посмотрим на это:

#включают

#включают

int main (пусто)

{

DDRB | = 1<< PINB0

пока (1)

{

ПОРТБ ^ = 1<< PINB0

_delay_ms (100)

}

}

Если вас сбивают с толку странные символы (&, ^, | и т. Д.), Используемые в приведенном выше выражении (& отсутствует, но может использоваться в других подобных кодах), вот соответствующая информация, которую вам было бы интересно узнать об этих :

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

Эти логические функции специально сравнивают два бита «1» и «0» в соответствии с назначенными им таблицами истинности.

Мы получим представление, проанализировав следующую расстановку битов:

01001011 и
10001101
равно
00001001

В приведенном выше коде & относится к AND, используемому в программировании на C.

При чтении строк по вертикали можно предположить, что 0 и 1 равны 0, 1 и 0 также равны 0, 0 и 0 равны 0, 1 и 1 равны 1. Читать это так просто. Это согласно таблице истинности оператора AND.

Если мы оценим следующую таблицу, она обозначает символ «|» обозначает использование функции «ИЛИ», «|» можно найти слева от «backspace» на клавиатуре компьютера:

01001011 |
10001101
равно
11001111

Точно так же эта таблица истинности логической функции ИЛИ указывает, что биты 0 или 1 равны 1, 1 или 0 также равны 1, 0 или 0 равны 0, а 1 или 1 равны 1.

Следующая битовая комбинация предназначена для логического оператора XOR, обозначенного символом ^, и может быть изучена так же, как мы это делали с таблицами истинности AND, OR:

01001011 ^
10001101
равно
11000110

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

#включают

Из наших предыдущих руководств мы знаем, как работает выражение, поэтому мы не будем повторять его, однако, похоже, это новое «включение», выраженное с помощью #include, которое необходимо изучить.

В этом «включении» delay.h позволяет нам использовать несколько простых методов реализации.

Как следует из названия, delay.h позволяет нам вызывать задержку в конкретной программе.

Следующее выражение int main (void) может быть опущено в текущем обсуждении, поскольку мы уже рассмотрели это в наших предыдущих сообщениях.

Далее идет измененная DDRB.

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

DDRB = 0b00000001

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

DDRB = DDRB | 0b00000001

Здесь он замаскирован маской «ИЛИ»: 0b00000001, хотя вполне может показаться, что это подлинное двоичное число, в случае, если более ранний DDRB, например: 0b01001010, затем применение ИЛИ через маскирование может дать: 0b01001010 | 0b00000001 = 0b01001011.

Результирующая разница, как можно было наблюдать, касается только вывода pin0, биты которого изменились!

Дальнейшее сжатие вышеуказанного оператора через C ++ дает:

DDRB | = 0b00000001

Однако мы обнаруживаем, что в данной программе есть даже больше. Хотя это может показаться вполне законным и очевидным, мы должны воспользоваться некоторыми утверждениями из заголовочного файла io.h, особенно если он в основном создан для нашего удобства?

Итак, если «DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Итак, мы начинаем с 0b00000000 и ставим «1», чтобы получить 0b0000001, а затем переносим его в левую позицию 0, что дает точно такой же 0b00000001, как указано выше.

Теперь, если предположить, что это PINB4, утверждение можно было бы выразить как 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

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

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

В случае, если выполнение будет помещено перед циклом, оно будет выполнено только один раз.

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

Нам известна процедура установки определенного бита в двоичном числе, но неизвестен метод применения определенного бита «0» в случае, если это «1».

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

Первые два оператора изменяют бит на «1» (5 В, светится светодиод), затем вводится пауза на 100 мс.

Следующая пара строк превращает бит PINB0 в «0» (нулевое напряжение, светодиод выключен), но, к сожалению, сравнение И не сможет выполнить «0» из бита, но если мы используем НЕ «~» для двоичной маски он может переключать все нули в единицы и наоборот.

Это позволит нам воздействовать только на бит PINB0 и установить его на «0». Круглые скобки были включены для того, чтобы ограничить выполнение маскирования таким образом, чтобы операция НЕ могла применяться ко всем маскам, а не просто к «1» перед сдвигом влево «<<”.

ПОРТБ | = 1<< PINB0
_delay_ms (100)
ПОРТB & = ~ (1<< PINB0)
_delay_ms (100)

Чтобы создать задержки включения или выключения или периоды равной продолжительности, мы можем сократить предыдущие четыре строки до двух и применить функцию XOR в наших интересах. Следует отметить, что при выполнении XOR контакт назначен на 1, если он равен 0, и наоборот. Это выполнение повлияет только на PINB0. Как бы то ни было, команда применяется, она просто превращает бит в противоположность существующей логике.

ПОРТБ ^ = 1<< PINB0
_delay_ms (100)

СДЕЛАНО! Теперь ваш светодиод будет мигать в соответствии с установленной скоростью… .Просто, не так ли?




Предыдущая статья: Схема дистанционного управления несколькими приборами Далее: Фаза переменного тока, нейтраль, цепь индикатора замыкания на землю