Найти тему

Вторая программа уже интереснее. ATtiny2313

Всем привет.

Пришло время поработать. (Что опять работа?)

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

Начинаем как обычно (закрываем доту) открываем Atmel Studio и создаем в ней проект на языке ассемблер (за что??). Создание проекта можно подсмотреть в прошлой статье.

Отлично! Создали проект, теперь можно и передохнуть (пару месяцев).

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

Наша программа должна будет при удержании кнопки не просто включать светодиод, а при отпускании (добавлять подписчиков) гасить его. В этот раз при нажатии на кнопку будет меняться состояние светодиода, т.е. нажали на кнопку, если светодиод горел, то он погаснет и наоборот.

В этот раз нам пригодятся (сверхспособности) пара новых операторов. Давайте перечислю их:

  1. sbrc - оператор пропуска следующей команды, если проверяемый бит регистра сброшен (0). Имеет два операнда, первый - это регистр, а второй - это номер проверяемого бита в данной регистре.
  2. sbrs - оператор пропуска следующей команды, если проверяемый бит регистра установлен (1). Также два идентичный операнда.
  3. cbi - оператор сброса определенного бита в регситре. Можно догадаться, что также имеет два операнда, первый из которых сам регистр, а второй будет номером бита, который нужно сбросить.
  4. sbi - оператор установки определенного бита в регистре. Кому-то нужны мои комментарии (нет, они и так не нужны). Два операнда, первый - регистр, второй - номер бита, который нужно установить.

Ниже будет текст программы:

Хотя нет. Сперва нужно объяснить один момент.

Если просто обговорить словами, то что должна бдуте сделать программа, то она не совсем вас обрадует результатом, который мы получим. Сперва контроллер должен проверить нажата ли кнопка, если нет, то ничего не делаем. Если кнопка нажата (подан 0 на вход), то проверяем горит ли светодиод, если нет, то зажигаем его, если он горел, то контроллер его выключает. И на этом можно замкнуть нашу программу. Тогда алгоритм будет следующим:

Шедевр искусства.
Шедевр искусства.

Поздравляю! Ваша программа работает не так как вы хотите. Причина тут в быстроте нашего маленького электронного друга. Контроллер способен вычислять при самой низкой частоте в 1МГц миллион операций в секунду. Следовательно при нажатии кнопки наша программа пропуститься через контроллер несколько миллионов раз, тем самым светодиод будет включаться и выключаться очень быстро, создавая иллюзию свечения в полнакала. Конечно, если только вы не способны включать и отжимать кнопку за 1 мкс, тогда проблем нет. Таким образом в конец программы нужно добавить еще условие, если кнопка не отжата, то ждать когда ее отпустит и только тогда переходить к началу цикла программы. Модифицируем наш алгоритм:

Второй шедевр искусства
Второй шедевр искусства

Супер, теперь можно привести код программы.

.list ; создание листинга
.def temp = R16 ; определение рабочего регистра
; ------------------------------
Настройка регистров ввода/вывода ---------------
ldi temp, 0
out DDRD, temp ; Настройка порта D на вход
ldi temp, 0xFF
out DDRB, temp ; Настройка порта B на выход
out PORTB, temp ; Подача 1 на выходы порта B
out PORTD, temp ; Подтяжка к питанию входов порта D
;-------------------------------
Основная программа ----------------------------------
main: in temp,PIND ; Считываем состояние кнопки
sbrc temp, 0 ; Если кнопка нажата (0 на входе) пропустить команду снизу
rjmp main ; Переход в начало, если кнопка не нажата

in temp, PINB ; Считываем состояние выходов
sbrc temp, 0 ; Если светодиод не горит, то пропустить команду снизу
rjmp m1 ; переход к метке m1 если светодиод горит
sbi PORTB, 0 ; включить светодиод
rjmp m2 ; переход к метке m2

m1: cbi PORTB, 0 ; выключение светодиода

m2: in temp, PIND ; Считываем состояние кнопки
sbrs temp, 0 ; Если кнопка отжата, то пропустить команду снизу
rjmp m2 ; переход обратно к проверке кнопки, если кнопка еще до сих пор нажата
rjmp main ; Возврат к началу основной программы

Отлично, код написан, можно загружать в контроллер. Как это сделать, опять же описано в прошлой статье. Также там есть пояснения к другим операторам и используемым регистрам контроллерам. Надо же поднимать просмотры старых статей;)

Спасибо. Пока.