
- •2. Програмне забезпечення
- •2.1. Мови програмування
- •2. 2 Компоненти мови Асемблер
- •3. Створення програми мовою Асемблер
- •3.1. Постановка задачі
- •3.2. Директиви
- •3.4. Алгоритм
- •3.5. Програма обчислення в одній точці
- •3.6. Застосування зсувів і масок
- •3.7. Запис масиву даних до озп і організація циклу
- •3.8. Завантаження масиву даних з озп до рзп
- •3.9. Зупин програми
- •4. Команди нашої програми
- •1) Арифметичні і логічні команди
- •2) Команди переходів (branch instructions)
- •3) Команди передачі даних (data transfer instructions)
- •4) Команди з бітами (bit and bit-test instructions)
- •5) Команди керування мк (mcu control instructions)
- •Лабораторна робота №1 Основи програмного пакету розробника avr Studio
- •3 Підготовка до налагодження проекту.
- •5 Виправлення помилок алгоритму.
- •5 Оформити звіт.
- •6 Завдання на самостійну роботу.
- •Лабораторна робота №2
- •3 Компіляція проекту.
- •4 Налагодження проекту.
- •Лабораторна робота №3
- •Лабораторна робота №4
- •Лабораторна робота №4
- •1 Підготовка проекту в avr Studio 4 для запису програми до пам'яті мікроконтролера.
- •2 Підготовка апаратних засобів стартового набору stk500.
- •3 Підготовка програмного інтерфейсу stk500.
- •4 Програмування мк та дослідження спроектованого виробу на платі стартового набору stk500.
- •5 Завдання на самостійну роботу
- •1 Налаштування основних модулів мікроконтролера.
- •2 Дослідження основних режимів функціонування мікроконтролера.
- •3 Програмування мк та дослідження цпп на платі стартового набору stk500.
- •4 Завдання на самостійну роботу.
3.7. Запис масиву даних до озп і організація циклу
Для пересування масивів даних зручно користуватися непрямою адресацією з автоматичною зміною на одиницю змісту індексного регістра в кожному кроці – з переддекрементом або постінкрементом. З огляду на те, що модуль результату при аргументах xі = 7…0 ми записуватимемо до комірок ОЗП (див. рис. 2) $0067…$0060, перед записом першого числа адресу в індексному регістрі Z = SRAM_START + 8 = $0068 потрібно попередньо декрементувати. У команді (1) і виконується спочатку переддекремент індексного регістра: Z <= Z-1 = $0068 – 1 = $0067, а відтак запис в ОЗП до комірки з цим номером (зміст комірки позначається в дужках) старшого числа: (Z) <= tmp. По обчисленні наступного числа так само відбудеться автоматична зміна адреси Z і воно буде записано до комірки $0066 і т.д.
У командах (2, 3) здійснюються вже описані операції очищення прапора і зсуву маски, а в команді (4) – перехід до наступного значення аргументу. Одночасно ця команда відіграє роль лічильника кількості проходження циклів, за результатами якого здійснюються переходи (5). У загальному випадку подібний лічильник циклів організовують за допомогою окремого РЗП.
MEM: ;**** ЗАПИС МАСИВУ ДАНИХ ДО ОЗП І ОРГАНІЗАЦІЯ ЦИКЛУ
(1) st -Z,tmp ; Store indirect and predecrement - Записати в пам'ять з непрямою
; адресацією та з переддекрементом: Z <= Z-1, (Z) <= tmp
(2) clc ; Clear Carry - Очистити прапор перенесення: С <= 0
(3) ror msk ; Rotate right through carry - Циклічний зсув (маски msk) праворуч
; через перенесення
(4) dec xi ; Decrement - Декрементувати: xі <= xі - 1 (перейти до наступного
; значення аргументу)
(5) brge MAIN ; Branch if greater or equal, signed - Перехід (до позначки
; MAIN), якщо більше або дорівнює з урахуванням знаку
; (тобто поки xі >= 0), інакше вихід з циклу
3.8. Завантаження масиву даних з озп до рзп
Як вже зазначалося, під час операцій з даними хоча б одним з операндів є РЗП, тому з комірки ОЗП дані не можна переслати до її іншої комірки, а лише завантажити їх до якогось конкретного РЗП, наприклад, до регістра tmp. Враховуючи, що після запису даних в ОЗП з переддекрементом (команда 1, п. 3.6) в індексному регістрі виявляється адреса початкової комірки Z=$0060, тому в команді 1 нашого фрагменту програми потрібно вибрати операцію завантаження з постінкрементом: tmp <= (Z), Z <= Z+1, по виконанні якої дані з комірки Z=$0060 буде завантажено до регістра tmp, а індексний регістр автоматично налаштується на адресу наступної комірки Z=$0061.
Для автоматизації завантаження масиву даних до РЗП скористаємося загальним адресним простором ОЗП, в якому регістри R0 … R31 відповідають коміркам ОЗП з адресами $0000 ... $001F. Для цього потрібно вибрати операцію запису до пам'яті з постінкрементом іншого індексного регістра (команда 2): (Y) <= tmp, Y <= Y+1. Через те, що на початку всі регістри скинуто, по виконанні цієї команди дані з регістра tmp буде записано до комірки Y = $0000, тобто до регістра R0, а індексний регістр автоматично налаштується на адресу наступної комірки Y = $0001, тобто для запису даних до регістра R1. (Можна обійтися і лише одним індексним регістром у простих типах МК. Доповніть для цього наш фрагмент програми двома командами).
У нашому випадку цикл легко організувати порівнянням змісту індексного регістра з константою (команда 3): для чисел 0 … 7 цикл замикається (команда 4), після чого відбувається вихід з нашого циклу. Слід зауважити, що під час порівняння зміст регістра YL не змінюється, встановлюються лише прапори, які зручно використовувати для галуження програми.
LOOP: ;******** ЦИКЛ (ПЕТЛЯ) ЗАВАНТАЖЕННЯ РЕЗУЛЬТАТІВ У РФ
(1) ld tmp,Z+ ; Load indirect and postincrement - Завантажити з непрямою
; адресацією і з постінкрементом: tmp <= (Z), Z <= Z+1 –
; Вибираємо дані з комірки Z (Z=$60,$61...$67)
(2) st Y+,tmp ; Store indirect and postincrement - Запис до пам'яті непряма і з
; постінкрементом: (Y) <= tmp, Y <= Y+1 - запис до комірок
; ОЗП $0,$1,...,$7, тобто до регістрів R0,R1,...,R7
(3) cpi YL,8 ; Compare Register with Immediate - Порівняння безпосереднє:
; YL - 8 (активізуються прапори Z, N, V, C, H)
(4) brne LOOP ; Branch if Not Equal - Перехід, якщо не дорівнює (поки Z = 0),
; інакше вихід з циклу