Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей

Похожие статьи:



Круглый IPS LCD-дисплей 240X240 на чипе ST7789V

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 порта. После этого можно снова подать питание микроконтроллера и наслаждаться работой устройства!

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 05.09.2014 0 0
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.7 Проголосовало: 2 чел.

Комментарии (15) | Я собрал (0) | Подписаться

0
sinobi #
Подскажите, а вкладываемый файл задержки по умолчанию в компиляторе находится или его надо самому писать?
Ответить
0

[Автор]
dossalab #
В конце статьи есть исходник - скачайте его и распакуйте. В папке с проектом и будет лежать этот файл (Waitings.alg).
Ответить
0
vgoffer #
Данный пример работать не будет - используется подпрограмма, а стек не инициализован
Ответить
0
optima #
Стек то инициализирован SP. А вообще любая программа, особенно если она содержит прерывания, должна начинаться с reset! Без этого, если вы добавите любое прерывание, то АВ уже будет ругаться и проект компилироваться не будет!
Ответить
0

[Автор]
dossalab #
Статья рассчитана в первую очередь на начинающих, и загружать их лишней информацией на первых порах, думаю, не стоит.
Ответить
0
optima #
Однако вы добавили в программу блок настройки стека! О котором собираетесь рассказать позже. Думаю с объяснения именно этого и нужно было начать, соблюсти так сказать последовательность. Так как инициализация стека это можно сказать основной момент в начале создания любой программы, независимо в каком компиляторе вы работаете!
Ответить
0
vgoffer #
Настройщик стека автор добавил позже!
После включения или сброса счетчик команд устанавливается на нулевой адрес по которому обычно размещается команда перехода к основной программе перепрыгивая таким образом таблицу векторов прерывания - это и есть вектор RESET. Простейшие программы не использующие прерывания могут начинаться прямо с нулевого адреса т.е. не использовать вектор сброса. Но в данном примере RESET обязателен! А вот если убрать подпрограммы, то можно не настраивать стек и указывать вектор сброса, правда мигания не заметишь
Ответить
0

[Автор]
dossalab #
Добавил и Reset, и настройщик стека
Ответить
0
Слотин Виталий #
Уважаемый автор, зачем добавили Юнипроф, когда АБ сам превосходно "шьет" кристалы..
Я не против, просто если занимаетесь АБ, так его бы и изучали.
Ответить
0

[Автор]
dossalab #
Так там только COM порт, или паять адаптер на FT232 (или я ошибаюсь?)
Отредактирован 14.09.2014 18:27
Ответить
0
Слотин Виталий #
Все правильно: АБ "шьет" через COM порт, но в мануале есть схема адаптера USB - COM. При прошивании нужно лишь выставить "галку" - "через адаптер".
По правде сказать последний я не делал, т.к. КОМ имеется..
Ответить
0
Евгений #
Спасибо за урок! Как раз недавно начал изучать AB. Жду с нетерпением продолжения!
Ответить
0
mihail_nik #
Подскажите как называется в АВ константа содержащая конец ОЗУ для инициализации стека. если такая существует?
(у меня не задача инициализировать стек настройщиком, а немного другая)
Работаю над диспетчером задержек/задач.
Ответить
0
Игорь #
DDRC.5 ..._mc... и понеслась. Откуда эти команды? Первая прорамма - пишем так, пишем эдак.
Ответить
0
Alex Glecovich #
Уж больно мудрёно. Как мне кажется, на АСМе или С++ немного понятнее (или привычнее). И еще на Вайринге (Ардуино). Но это дело привычки. А в целом интересно! И не надо говорить, что это для новичков. Всё-таки нужно быть знакомым с С или С++. Или я не прав?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор для сборки: предусилитель на лампе 6N3 LC-измеритель LC100-A
вверх