Найти в Дзене

Первая бесполезная программа для ATtiny2313

Всем привет! Продолжаем погружаение в тему микроконтроллером Atmel. Уже установлено нужное ПО и можно начать (его удалять) первые потуги в сторону программирования. Самое простое и одновременно абсолютно бесполезное что можно сделать с МК - это зажигать светодиод по нажатию кнопки. Это как подключить дома лампу не напрямую от выключателя, а посадить специально обученного человека, который при нажатии на выключатель ходил бы и подключал лампу к сети. Полный абсурд, но в этом-то и вся суть. Сперва обсудим (бывшую) принципиальную схему. Это будет проще, чем твоя ДЗ по математике. В центре схемы знакомый МК ATtiny2313. Из обвеса (M-пакет) только две кнопки, два резистора 270 Ом и два светодиода. Праздник минимализма. Считаю, что схема не достойна обсуждения. Одно только НО, можно заметить кнопка закорачивает ноги МК на землю (что за дерзкое поведение!!). Но как увидем дальше мы будем использовать внутренние резисторы самого микроконтроллера, чтобы не сжечь ему пару ног. Собираем схему на

Всем привет!

Продолжаем погружаение в тему микроконтроллером Atmel. Уже установлено нужное ПО и можно начать (его удалять) первые потуги в сторону программирования.

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

Сперва обсудим (бывшую) принципиальную схему. Это будет проще, чем твоя ДЗ по математике.

Домашнее задание по математике
Домашнее задание по математике

В центре схемы знакомый МК ATtiny2313. Из обвеса (M-пакет) только две кнопки, два резистора 270 Ом и два светодиода. Праздник минимализма. Считаю, что схема не достойна обсуждения. Одно только НО, можно заметить кнопка закорачивает ноги МК на землю (что за дерзкое поведение!!). Но как увидем дальше мы будем использовать внутренние резисторы самого микроконтроллера, чтобы не сжечь ему пару ног.

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

Дальше руками нужно только (вовремя нажимать ульту) нажимать кнопки на клавиатуре.

Запускаем Atmel Studio. Надеюсь, что она настроена, если нет, то вот инструкция.

Переходим в верхнем меню: File -> New -> Project. Или как представитель высшей расы нажать Ctrl+Shift+N.

File -> New -> Project
File -> New -> Project

Писать я буду на ассемблере (Да, это жёстко). Так что выбираем в левом списке Assembler. Внизу пишем название проекта, например, LED_Control. Выбираем расположение нащего проекта. Галочка Create directory for solution позволяет создать одноименную папку в выбранной директории (удобно). Нажимаем OK.

-3

Далее в поиске пишем attiny2313 и выбираем ATtiny2313A (у меня МК с индексом A, можно выбрать и без индкса А). Индекс А означает микроконтроллер на стероидах, способного работать при низком напряжении и большей частоте.

-4

Жмем (в бой!) OK и ждем окончания создания проекта.

-5

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

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

Теперь я напишу весь код, а уже потом пояснения к нему (нет).


; Naruto Uzumaki 26.05.2021

.list ; создание листинга

.def temp = R16 ; определение рабочего регистра

.cseg ; Выбор сегмента програмного кода
.org 0 ; Установка текущего адреса на 0

; ------------------------------------- Настройка Портов Ввода/Вывода

ldi temp, 0 ; Записываем 0 в рабочий регистр
out DDRD, temp ; Запись 0 в регистр DDRD

ldi temp, 0xFF ; Запись числа 0xFF в регистр temp
out DDRB, temp ; Запись temp в DDRB
out PORTB, temp ; Запись temp в PORTB
out PORTD, temp ; Запись temp в PORTD

; -------------------------------------- Основной цикл

main: in temp, PIND ; Чтение PIND
out PORTB, temp ; Пересылаем это значение в PORTB
rjmp main ; безусловный переход к началу цикла

Вот и весь текст исполнительной программы.

Всем спасибо. Всем пока!

Что? Нужны объяснения? Ладно.....

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

.def - это директива помогает задать простые человекопонятные имена для регистров. Здесь рабочим регистром явлется R16, но что такое R16, глупость какая? Куда понятнее temp - temporary (нет).

.cseg - определяет текущий сегмент памяти, куда будет записана ниже идущая информация. В данном случае будет записана в Flash-память (память программ).

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

Структура команды на ассемблере придерживается следующей логики: оператор операнд1, операнд2. В качестве операнда можно использовать и контсанту. Разберем операторы используемые в коде:

  1. ldi - запись в регистр общего назначения константы. Причем первым операндом идет РОН (Уизли) куда будет записана константа.
  2. out - вывод содержимого РОН в регистр ввода/вывода. Первым идет регситр ввода/вывода куда будет осуществлена запись.
  3. in - ввод информации из регистра ввода/вывода. Первый операнд - это то куда будет записана считанная информация.
  4. rjmp - безусловный переход. В качестве операнда применяется имя метки, куда следует осуществить переход. Метка задается именем и после имени знаком ":". Имя может включать буквы, цифры и знак подчеркивания. Таким образом мы создали в программе бесконечный цикл, так как программа должна выполняться не один раз, а на протяжении всего времени, пока есть питание.

Теперь разберем регистры:

  1. R16 (temp) - рабочий регистр общего назначения (РОН). Является промежуточный звеном куда можно записывать информацию и отправлять ее дальше, куда нам вздумается.
  2. DDRD - регистр ввода/вывода. Отвечает за направленность порта, то есть будет ли данный порт (в данном случае D) входом или выходом. Так как мы на первых два разряда данного порта повесили светодиоды, то они будут выходом. Значит записывает туда все 1 (т.е. число 0xFF в шестнадцатеричной системе), если нули, то порт будет входом.
  3. DDRB - аналогичный регистр, отвечающий за направление для порта B.
  4. PORTB - регистр ввода/вывода. Если порт ялвяется выходом, то отвечает будет ли 0 или 1 на определенном выходе порта. В данном случае мы записали туда все 1 (0xFF), так что на всех 8 выходах порта B будут единицы. Если порт является входом, то это означает подтяжку внутреннего резистора. Как раз этот трюк мы применили для порта D, чтобы подключить кнопки без резисторов.
  5. PORTD - аналогичный регистр для порта D.
  6. PIND - регистр ввода/вывода. Считывает состояние порта, если он настроен на вход.

Сама программа состоит из трех команд. Сначала записываем в рабочий регистр состояние порта D (состояние кнопок - нажата или нет). ПОтом записываем это состояние на выход в порт B. То есть если кнопка нажата у нас на это входе порта D будет 0 и этот же ноль записывается на соответсвующий выход порта B, выключая светодиод. Дальше оператор безусловного перехода замыкает программу в бесконечный цикл.

Фуухх, надеюсь, ты еще тут, а не на миду. Спасибо, что дочитал.

Пока.