В предыдущем уроке мы вкратце рассмотрели среду программирования Algorithm Builder. В этом уроке мы создадим простой программатор для микроконтроллеров, а также напишем и проверим в работе первую программу.
Для начала немного теории
После компилирования (перевода на машинный язык), получается файл с расширением .hex. Этот файл называют прошивкой. Далее этот самый файл загружается в память микроконтроллера, при помощи программатора. Процесс загрузки прошивки в память микроконтроллера называют прошивкой (прожигом). Важно не путать эти два понятия!
- Прошивка (сущ.) - скомпилированная программа
- Прошивка (глагол) - процесс записи скомпилированной программы в память МК
Как я уже говорил, для загрузки прошивки в микроконтроллер необходим программатор. Самый простой вариант - это программатор на LPT порт.
Принципиальная схема программатора:
Вообще, резисторы можно и не ставить, но тогда риск спалить lpt порт становится еще выше.
О том, как правильно подключить программатор к микроконтроллеру и прошить в него программу я расскажу в конце статьи. А пока что сосредоточимся на создании программы.
Кратко пробежимся по элементам, из которых строится алгоритм
- Текст. Представляет из себя текстовую строку, в которую записываются некоторые команды для algorithm builder.
- Вершина блока. Алгоритм в Algorithm Builder делится на блоки. Для создания такого блока и служит этот элемент.
- Поле. Представляет из себя отцентрированную в блоке строку. Предназначен для записи большинства команд микроконтроллеру. (создается при нажатии клавиши ENTER).
- Метка. Просто вертикальная черта. Не несет в себе никакой информации микроконтроллеру,
- Условный переход. Просто говоря - условие. Если то, что записано в прямоугольнике правда, идем по стрелке вправо, если ложь - вниз.
- Безусловный переход. Просто стрелка, для перехода между элементами алгоритма.
- Настройщик управляющих регистров. Элемент, позволяющий удобно настраивать периферию микроконтроллера
Переходим к практике
- Открываем 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 порта. После этого можно снова подать питание микроконтроллера и наслаждаться работой устройства!
Прикрепленные файлы:
- Тест(3).rar (5 Кб)
Комментарии (15) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
После включения или сброса счетчик команд устанавливается на нулевой адрес по которому обычно размещается команда перехода к основной программе перепрыгивая таким образом таблицу векторов прерывания - это и есть вектор RESET. Простейшие программы не использующие прерывания могут начинаться прямо с нулевого адреса т.е. не использовать вектор сброса. Но в данном примере RESET обязателен! А вот если убрать подпрограммы, то можно не настраивать стек и указывать вектор сброса, правда мигания не заметишь
[Автор]
Я не против, просто если занимаетесь АБ, так его бы и изучали.
[Автор]
По правде сказать последний я не делал, т.к. КОМ имеется..
(у меня не задача инициализировать стек настройщиком, а немного другая)
Работаю над диспетчером задержек/задач.