Рубрики
Схемы на PIC

Мигание последовательностью светодиодов на микроконтроллере PIC

В предыдущей статье на нашем сайте мы рассмотрели мигание одним светодиодом с помощью микроконтроллера PIC. Схему проекта мы собрали на перфорированной плате и использовали PICkit 3, ICSP и MPLAB IPE для загрузки программы в микроконтроллер. В этой же статье мы задействуем большее число контактов микроконтроллера PIC16F877A и рассмотрим управление с его помощью последовательностью из 7 светодиодов.

Также в статье мы рассмотрим основы управления несколькими входами и выходами микроконтроллеров PIC, использование функций и цикла типа ‘for’ в данных микроконтроллерах.

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

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Программатор PicKit 3 (купить на AliExpress).
  3. Держатель микросхем на 40 контактов (купить на AliExpress).
  4. Кварцевый генератор на 20 МГц (купить на AliExpress).
  5. Конденсаторы 33 пФ – 2 шт. (купить на AliExpress).
  6. Резисторы 680 Ом, 10 кОм и 560 Ом (купить на AliExpress).
  7. Светодиоды (купить на AliExpress).
  8. Микросхема регулятора напряжения 7805 (купить на AliExpress).
  9. Набор для пайки.
  10. Перфорированная плата (Perf board).
  11. Соединительные провода.
  12. Адаптер питания на 12V.

Схема проекта

Схема проекта мигания последовательностью светодиодов с помощью микроконтроллера PIC представлена на следующем рисунке.

Объяснение программы для микроконтроллера PIC

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

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

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

Регистры TRIS в микроконтроллерах PIC используются для задания режимов работы его контактов (на ввод или вывод данных), а слово PORT используется для установки на контактах уровней High/Low. В нашем случае команда TRISB0=1 означает что 0-й контакт PORT B будет работать на ввод данных (в качестве цифрового входа) – к нему подключена кнопка в схеме нашего проекта. Команда TRISD = 0x00 устанавливает режим работы всех контактов порта D на вывод данных, а команда PORTD=0x00 устанавливает на всех контактах этого порта уровень LOW.

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

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

Подтягивающие резисторы бывают двух типов: «слабые» и «сильные». «Слабые» подтягивающие резисторы (Weak Pull Up) имеют большой номинал сопротивления и поэтому могут пропускать через себя лишь небольшие токи, а «сильные» подтягивающие резисторы (Strong Pull Up) имеют небольшой номинал сопротивления и поэтому могут пропускать через себя значительные токи. Большинство современных микроконтроллеров имеют на своих контактах встроенные «слабые» подтягивающие резисторы.

Для того чтобы задействовать в нашем микроконтроллере PIC внутренние подтягивающие резисторы, необходимо посмотреть на его даташит в раздел OPTION_REG (option register) как показано на следующем скриншоте.

Как показано на представленном рисунке, бит 7 управляет работой «слабых» подтягивающих резисторов. Чтобы их активировать необходимо в данный бит записать значение 0. Это можно сделать с помощью команды OPTION_REG<7>=0 – эта команда позволяет изменить только значение бита 7 не затрагивая значения остальных битов. Когда значение этого бита установлено, далее мы в цикле loop будем проверять нажата ли кнопка (if RB0==0). Если условие выполнено, то мы будем вызывать функцию мигания светодиодами с параметрами 1, 3, 7 и 15.

Почему в программе мы используем функции

Функции используются для уменьшения общего количества строк в программе. Почему мы должны стремиться к уменьшению количества строк в программе? Ответ на это вопрос прост – память микроконтроллера ограничена и если наша программа будет очень большой по объему, то она просто не сможет записаться полностью в ограниченный объем памяти микроконтроллера. Поэтому в большинстве случаев, если есть возможность, необходимо стремиться к уменьшению общего количества строк/объема программы.

Любую функцию необходимо запрограммировать отдельным блоком в программе под необходимым названием (в нашем случае это sblink(int get)) и затем вызывать ее в основной программе с заданным значением параметра/параметров (например, sblink(1)).

Тело нашей функции sblink(int get) выглядит следующим образом:

В коде этой функции вам показаться странной команда PORTD = get << i. Попробуем объяснить что она значит.

«<<» – это оператор сдвига влево, который сдвигает все биты влево. К примеру, если мы будем вызывать в основной программе нашу функцию sblink(int get) с параметром ‘1’, то есть sblink(1), что в двоичном виде можно представить как 0b00000001. То есть наша команда будет выглядеть следующим образом: PORTD = 0b00000001<< i.

Значение переменной «i» изменяется в цикле (int i=0; i<=7 && RB0==0; i++) в диапазоне от 0 до 7. Изменение значения переменной «i» в диапазоне от 0 до 7 приведет к следующим результатам нашей операции:

Как вы можете видеть, в результате мы включаем только один наш светодиод из 7, остальные 6 будут находиться в выключенном состоянии. В результате выполнения второго цикла нашей функции (int i=7; i>=0 && RB0==0; i—) мы будем аналогичным образом в один момент времени включать один светодиод, но в данном случае светодиоды будут включаться в обратной последовательности. Мы используем задержку 200ms чтобы человеческий глаз смог комфортно различать моменты включения/выключения светодиодов.

Если же мы нашу функцию sblink(int get) будем вызывать с параметром 3, то есть sblink(3), что в двоичном коде означает 0b00000011, то в результате наших операций сдвига мы получим следующую картину:

То есть в данном случае одновременно будут зажигаться по 2 светодиода. Аналогичным образом, в случае вызова sblink(7) и sblink(15), будут одновременно зажигаться 3 и 4 светодиода соответственно. Затем, если кнопка еще нажата, мы будем зажигать все светодиоды с помощью команды PORTD=0xFF. Более подробно работу этого проекта вы можете посмотреть на видео, приведенном в конце статьи

Исходный код программы

Видео, демонстрирующее работу проекта

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

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