Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 215 -------------------- Инициализация портов BB 11 12 ldi out temp, 0 DDRD, temp ; Записываем , Записываем ноль в регистр temp этот ноль в DDRD (порт PD на ввод) 13 ldi temp, OxFF ; Записываем число $FF в регистр temp temp в DDRB (порт РВ на вывод) 14 out DDRB, temp , Записываем 15 out PORTB, temp , Записываем temp в PORTB (потушить светодиод) 16 out PORTD, temp , Записываем temp в PORTD (включаем внутр.резист Инициализация компаратора 17 18 ldi out temp, 0x80 ACSR, temp , Выключение компаратора , ----------- ------------------ Начало основного цикла 19 main: sbi PORTB, 0 , Устанавливаем РВО в единицу (тушим светодиод) 20 in temp, PIND , Читаем содержимое порта PD 21 sbrc temp, 0 ; Проверка младшего разряда 22 rjmp main , Если не ноль, переходим в начало ; ----------- - Мигание светодиода 23 cbi PORTB, 0 , Сброс РВО в ноль (зажигаем светодиод) 24 25 rcall sbi waitl PORTB, 0 ; Вызов подпрограммы задержки ; Установка РВО в единицу (тушим светодиод) 26 rcall waitl ; Вызов подпрограммы задержки 27 rjmp main , К началу цикла ■ — Подпрограмма задержки 28 waitl . push loopl ; Сохраняем содержимое регистра loopl 29 push loop2 . Сохраняем содержимое регистра 1оор2 30 push ІоорЗ ; Сохраняем содержимое регистра ІоорЗ 31 ldi ІоорЗ, 15 , Помещаем в ІоорЗ константу задержки 32 wt 1. dec ІоорЗ ; Уменьшаем значение регистра ІоорЗ 33 breq wt4 34 ldi 1оор2, 100 , Помещаем в 1оор2 константу задержки 35 wt2: dec loop2 , Уменьшаем значение регистра 1оор2 36 breq Wt1 37 wt3: ldi loopl, 255 ; Помещаем в loopl константу задержки 38 dec loopl ; Уменьшаем значение регистра loopl 39 brne wt3 ; Если не ноль, продолжаем цикл 40 rjmp wt2 41 wt4 ‘ pop ІоорЗ ; Восстанавливаем значение регистра ІоорЗ 42 pop loop2 , Восстанавливаем значение регистра 1оор2 43 pop loopl ; Восстанавливаем значение регистра loopl 44 ret ; Выход из подпрограммы Программа содержит всего одну новую для нас команду. breq _________________________________________________________ Оператор условного перехода по условию «равно». Этот оператор — полная противоположность оператору brne, описанному в предыдущем примере. Отличие этих двух операторов друг от друга в том, что brne вызывает переход в том случае, если флаг Z сброшен, а оператор breq, напротив, вызовет переход, если Z установлен. Описание программы (листинг 5.7) Для новой задачи нам пришлось создать новую подпрограмму задержки. Это произошло потому, что приведенная в предыдущем при ­ мере подпрограмма не способна обеспечить задержку достаточно боль ­ шой длительности. Новая подпрограмма задержки использует не один, а

RkJQdWJsaXNoZXIy MTExODQxMg==