
- •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.4. Алгоритм
Послідовність дій, яку має виконати МК для досягнення потрібного результату, можна описати словами, але зручніше зобразити графічно у вигляді алгоритму. Тут з навчальною метою наведемо коротко опис його блоків, позначених цифрами на блок-схемі алгоритму (рис. 3). Після ініціалізації (1) в основній програмі обчислюється значення функції в точці і (2), перевіряється знак результату (3) і, якщо він від'ємний, попередньо перетворюється до прямого коду (4) і записується знак числа мінус (5), а якщо додатний, записується безпосередньо до ОЗП (6) без зміни знаку числа, який за умовчанням є плюс.
У лічильнику циклів проходження програми обчислень код зменшується на одиницю і, якщо не всі точки обчислено (7), відбувається перехід до початку основної програми (2), а по закінченні всіх обчислень здійснюється перехід до циклу завантаження даних в РЗП (8) з перевіркою, чи всі 8 чисел завантажено (9), після чого програма зупиняється (10).
3.5. Програма обчислення в одній точці
Програма обчислення результату містить команди (пронумеровано в дужках), серед яких є множення (1, 2, 4), добуток якого приміщується до регістрової пари R1:R0, і в прикладі для спрощення не виходить за межі регістра R0, тобто R1 = 0. Результат (6) виявляється записаним до регістра tmp і залежно від його знаку відбувається галуження програми. У разі від'ємного числа попередньо перетворюємо його з доповняльного до прямого коду, тобто обчислюємо його модуль (8) а в розряд регістра знаку sgn записуємо одиницю (9), наприклад, sgn <= sgn v msk = 0b0000 0000 v 0b1000 0000 = 0b1000 0000.
MAIN: ;******** ОСНОВНА (MAIN) ПРОГРАМА******************
(1) mul xi,xi ; Multiply unsigned - Множення беззнакове: R1:R0 <= xі*xі
(2) mul R0,A ; R1:R0 <= A*xі*xі (тут A*xі*xі вміщується в R0, тобто R1 = 0)
(3) mov tmp,R0 ; Copy register - Скопіювати регістр: tmp <= R0
(4) mul xi,B ; R1:R0 <= B*xі (R1 = 0)
(5) add tmp,R0 ; Add without carry - Додати без перенесення: tmp <= tmp + R0
(6) sub tmp,C ; Subtract without carry - Відняти без перенесення: tmp <= tmp - С
(7) brpl MEM ; Branch if plus - Перейти, якщо плюс (якщо прапор N=0), інакше
(8) neg tmp ; Two's complement - Виконати доповнення: tmp <= $00 - tmp
(9) or sgn,msk ; Logical OR - Логічне АБО: sgn <= sgn v msk, тобто приписати
; мінус цьому результату
3.6. Застосування зсувів і масок
Розглянемо запис знаків чисел до розрядів регістра R8 за допомогою регістра маски R22. Після включення або скидання МК ці регістри, як і всі РЗП, скинуто до нульового стану (рис. 4,а) і програма починається з ініціалізації (п. 3.3), під час якої за допомогою команди АБО безпосередньо з константою записується одиниця до старшого розряду регістра маски R22 (рис. 4,б). Цю команду застосовано тут задля одноманітності операцій з маскою, але записати одиницю до старшого розряду можна також іншим чином. Виконайте цю операцію одною командою: а) арифметичною, б) іншою логічною, в) передачі (завантаження) даних – див. таблиці команд у додатку.
По обчисленню функції в одній точці результат перебуватиме в регістрі tmp (п. 3.5, команда 6) і знак числа відображатиметься в прапорі N. Наприклад, у нашій програмі обчислення починаються з аргументу хі = 7, тому матимемо tmp = 127 = $7F = 0b0111 1111 (див. рис. 1,а) і нуль у знаковому розряді дублюється прапором N = 0. Командою brpl MEM (п. 3.5, команда 7) операції (8, 9) пропускаються, тому в старшому розряді регістра знаку R8 залишається нуль (плюс числа 127). Отже, у подальшій частині програми після позначки MEM потрібно це число записати до ОЗП, а маску підготувати для наступного числа. У нас це здійснюється шляхом циклічного зсуву праворуч через прапор перенесення С (рис. 4,в). По виконанні цієї команди всі розряди зсуваються по колу на один крок праворуч, тому в регістрі маски R22 одиниця пересунеться в розряд 6 (показано під рискою). Аби не зіпсувати маску, попередньо перед цією операцією команда clc очищує прапор С до нуля на випадок, якщо за деяких даних він буде встановлений.
Так само обчислюються інші точки функції і після кожної з них у регістрі маски R22 одиниця пересувається на один розряд праворуч. Якщо результат буде від'ємний, наприклад, у нашій програмі при аргументі хі = 4 матимемо tmp = $E6 = 0b1110 0110 (див. рис. 1,а), то виникає одиниця в знаковому розряді, яка дублюється прапором N = 1. Через це ігнорується перехід в команді brpl MEM (п. 3.5, команда 7) і виконуються наступні команди. Операцією доповнення (команда 8) переходимо до прямого коду з метою обчислити модуль числа: tmp = $00 - $E6 = $00 - 0b1110 0110 = 0b0001 1010 = $1А = 26, а логічною операцією АБО (команда 9) записуємо одиницю в розряд 4 регістра знаку R8 (рис. 4,г), тобто мінус числа 26. Аналогічно записується одиниця до наступного розряду (рис. 4,д) і до всіх інших розрядів від'ємних чисел. Використання операції АБО для накладання маски є універсальним у тому сенсі, що за попередньої наявності одиниць в деяких розрядах їх дублювання маскою не змінює ці розряди. Проте легко переконатися, що в нашому конкретному прикладі можна застосувати арифметичне додавання двох регістрів.