Algorithm Builder. Урок 2 — О создании первой программы

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

Для начала немного теории

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

  • Прошивка (сущ.) — скомпилированная программа
  • Прошивка (глагол) — процесс записи скомпилированной программы в память МК

Как я уже говорил, для загрузки прошивки в микроконтроллер необходим программатор. Самый простой вариант — это программатор на LPT порт.

Принципиальная схема программатора:

Вообще, резисторы можно и не ставить, но тогда риск спалить lpt порт становится еще выше.  

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

Кратко пробежимся по элементам, из которых строится алгоритм

  1. Текст. Представляет из себя текстовую строку, в которую записываются некоторые команды для algorithm builder.
  2. Вершина блока. Алгоритм в Algorithm Builder делится на блоки. Для создания такого блока и служит этот элемент.
  3. Поле. Представляет из себя отцентрированную в блоке строку. Предназначен для записи большинства команд микроконтроллеру. (создается при нажатии клавиши ENTER).
  4. Метка. Просто вертикальная черта. Не несет в себе никакой информации микроконтроллеру,
  5. Условный переход. Просто говоря — условие. Если то, что записано в прямоугольнике правда, идем по стрелке вправо, если ложь — вниз.
  6. Безусловный переход. Просто стрелка, для перехода между элементами алгоритма.
  7. Настройщик управляющих регистров. Элемент, позволяющий удобно настраивать периферию микроконтроллера

Переходим к практике

  • Открываем Algorithm Builder
  • Создаем новый проект (Файл-Новый. Перед созданием нового проекта нужно закрыть старый!)
  • Клик правой кнопкой мыши по рабочей области — опции проекта. В выпадающем списке выбираем контроллер(Atmega88). В поле тактовая частота вводим 1000000 (Это 1 МГц). И жмем применить.

​Теперь все готово для написания программы!

Начнем с классики — мигание светодиодом

Последовательность действии очень проста: 

  • Включить светодиод
  • Подождать немного
  • Выключить светодиод
  • Еще немного подождать

​Начнем по-порядку — как включить светодиод? (т.е установить логическую 1 на ножке)

Ответ:  Все действия с периферией микроконтроллера (В т.ч с портами ввода/вывода) осуществляются через регистры.

Регистр — набор из 8 бит. Бит — элементарная единица информации, может быть 1 либо 0

 1   0   0   1   1   1   0   1 

Это — пример регистра. Самый левый бит называется старшим, и имеет номер 7, самый правый — младшим, имеет номер 0. Не 1, а 0, это важно! Каждый бит регистра за что-либо отвечает. Например, за запуск таймера. Так что регистр можно сравнить с набором тумблеров.

Запись значения в бит регистра осуществляется следующим образом:

 

Большинство ножек микроконтроллера Atmega88 разделены на 3 порта ввода/вывода. Ножка может настраиваться как на выход, так и на вход. Мы будем работать с портом с индексом C

Каждый регистр имеет свое название

Нас интересуют два регистра — PORTC и DDRC. 

  • DDRC отвечает за то, будет ли ножка входом или выходом
  • PORTC управляет состоянием ножки, то есть задает 0 на ножке или 1.

Посмотрим на распиновку микроконтроллера:

Нас интересует 6 ножек с 23 по 28. Это и есть порт C. Светодиод будем подключать к выводу 5 порта C (PC5, 28 ножка)

Итак, нужно:

  • Настроить ножку PC5 на выход
  • Установить единицу на ножке PC5.

За то, будет ли ножка порта C входом или выходом отвечает регистр DDRC. Что бы ножка PC5 была входом, нужно записать в бит №5 лог. «0». Что бы ножка PC5 была выходом, нужно записать в бит №5 лог. «1».

«NOP» удаляем, он нам пока не нужен

Выделяем вершину блока, идем в раздел элементы-прерывания, выбираем из списка Reset

Жмем кнопку «S» (настройщик), выбираем Stack Pointer.

О том, зачем это нужно, я расскажу позднее.

Ставим элемент «label», жмем Enter

Вместо «NOP» пишем следующее:

То есть мы конфигурируем ножку 5 порта C (PC5) на выход

Жмем «L»(метка), далее Enter, набираем следующее:

Как я уже говорил, регистр PORTC управляет состоянием ножек порта C, то есть задает 0 на ножке или 1. Записывая в бит 5 этого регистра единицу, на ножке 28(PC5) установится 1, записывая в бит 5 этого регистра ноль, на ножке 28(PC5) установится 0. 

Мы сконфигурировали ножку порта на выход и вывели туда 1.

Теперь нужно сделать задержку.

Для создания задержек в папку с проектом нужно поместить специальный файл — waitings.alg(расширение .alg указывает, что это дополнительный алгоритм) и подключить его.

Подключается файл следующим образом. В верхней строке прописывается следующий код: +: Waitings.alg. Всё!

Задержка создается следующим образом:

где число в скобках — величина задержки (в миллисекундах)

Теперь можно написать полную программу:

Жмем кнопку  (скомпилировать) — algorithm builder создаст файл прошивки в файлах проекта.

Полная схема устройства

Для прошивки достаточно просто соединить одноименные выводы программатора и микроконтроллера

Теперь прошивку нужно загрузить в микроконтроллер. Для этого нам понадобится программа Uniprof.

Открываем Uniprof, настраиваем по картинке (для LPT программатора)

Подключаем схему к lpt порту, подаем питание. Жмем на красную системную частоту для установки связи с микроконтроллером

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

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