Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
232 Микроконтроллеры AVR от азов программирования... Инициализация 8 ldi temp, RAMEND 9 out SPL, temp Инициализация 12 ldi temp, 0 11 out DDRD, temp 12 ldi temp, OxFF 13 out DDRB, temp 14 out PORTB, temp 15 out PORTD, temp стека ; Выбор адреса вершины стека , Запись его в регистр стека портов ВВ ; Записываем ноль в регистр temp , Записываем этот ноль в DDRD (порт PD на ввод) , Записываем число $FF в регистр temp ; Записываем temp в DDRB (порт РВ на вывод) ; Записываем temp в P0RTB (потушить светодиод) , Записываем temp в PORTD (включаем внутр резист ) , ------------------------------------------------- Инициализация таймера Т1 16 ldi temp, 0x05 , Код конфигурации записываем в temp 17 out TCCR1B, temp , Переносим его в регистр конфигурации таймера , --------------------------------------------------- Инициализация компаратора 18 ldi temp, 0x80 ; Выключение компаратора 19 out ACSR, temp ; ------------------------------------------------- Начало основного цикла 20 main : in temp, PIND 21 sbrc temp, 0 22 rjmp m3 Читаем содержимое порта PD Проверка младшего разряда Если не ноль, переходим в начало Сдвиг вправо 23 ml . ldi rab, 0Ы0000000 24 m2: ldi temp, OxFF 25 eor temp, rab 26 out PORTB, temp 27 rcall waitl 28 lsr rab 29 brcc m2 30 rjmp main — --------- Сдвиг влево 31 m3: ldi rab, 0b00000001 32 m4: ldi temp, OxFF 33 34 eor out temp, rab PORTB, temp 35 rcall waitl 36 lsl rab 37 brcc m4 38 rjmp main , Запись начального значения ; Инверсия содержимого регистра rab ; Вывод текущего значения в порт РВ ; Задержка ; Сдвиг содержимого рабочего регистра ; Если не дошло до конца регистра продолжить ; На начало ; Запись начального значения ; Инверсия содержимого регистра rab ; Вывод текущего значения в порт РВ ; Задержка ; Сдвиг содержимого рабочего регистра ; Если не дошло до конца регистра продолжить ; На начало ; --------------------------------------------------------------- Подпрограмма задержки 39 waitl • push temp ; Сохраняем содержимое регистра temp 40 ldi temp, 0 ; Помещаем temp ноль 41 out TCNT1H, temp ; Записываем этот ноль в старший регистр таймера 42 out TCNT1L, temp , Записываем этот ноль в младший регистр таймера 43 Wt1. in temp, TCNT1L ; Чтение младшей части счетного регистра 44 cpi temp, low(kdel) , Сравнение с числом $0С 45 brio Wt1 ; Переход, если temp меньше чем kdel 46 in temp, TCNT1H ; Чтение старшей части счетного регистра 47 cpi temp, high(kdel) , Сравнение с числом $03 48 brio Wt1 ; Переход, если temp меньше чем $03 49 pop temp ; Восстанавливаем значение регистра temp 50 ret , Выход из подпрограммы Первая доработка модуля инициализации — команда в строке 5. Эта команда описывает константу kdel, то есть коэффициент деления таймера. Обратите внимание, что значение этой константы равно 780. Если перевести это значение в двоичную форму, то количество разрядов такого числа будет больше восьми. А это значит, что для представления константы в двоичном виде потребуется не менее двух байтов.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==