Перейдемо до розгляду інструкцій, що залишилися.
Інструкція ldi - ця інструкція призначена для завантаження константи в регістр. У неї є два операнди. Перший - це сам регістр загального призначення, а другий - константа, яку треба в нього записати.
Наступна інструкція out - це інструкція запису значення з регістра загального призначення (РОН) в регістр спеціального призначення (РСН). У цієї інструкції є два операнди: перший - регістр спеціального призначення, другий - регістр загального призначення.
Кожна команда представлена в пам'яті МК, як набір певних біт. Більшість інструкцій AVR займають в пам'яті два байти (16 біт), тобто одне слово, проте є інструкції, які займають два слова (32 біта).
Розглянемо перші дві інструкції та їх вигляд в пам'яті МК
(таблиця 1.1).
Таблиця 1.1 - 16-розрядний код операції в пам'яті МК
|
Адреса |
Команда |
16- розрядний код операціїх |
|
0х0000 |
ldi r16,0b01000101 |
1110 0100 0000 0101 |
|
0х0001 |
out DDRD,r16 |
1011 1011 0000 0001 |
Перший стовпець - це адреса слова в пам'яті програм. Перша інструкція ldi буде розташована за адресою 0x0000, тобто на самому початку області пам'яті і мати відповідний код операції. Отже, для інструкції ldi код операції складатиметься з чотирьох тетрад (третій стовпець таблиці 1.1). Перша тетрада - це безпосередньо код інструкції, тобто її ідентифікатор (двійкове ім'я). Друга тетрада - значення константи, яку завантажуємо в регістр. Третя тетрада, що є "адресою" регістра, відповідає положенню регістрів від R16 до R31. Як видно з таблиці 1.1, вона дорівнює нулю, відповідно регістр буде R16. Якби вона була рівна 1 - то регістр був би R17 і так далі.
Чотирьох розрядів вистачає, щоб адресувати тільки 16 регістрів.
Для другої інструкції (out DDRD,r16): перша тетрада - двійкове ім'я
інструкції, друга - адреса регістру вводу/виводу, третя - адреса регістра
загального призначення.
1.3 Компіляція розробленої програми
Тепер написану програму необхідно скомпілювати. Для цього у
верхньому меню вікна програми необхідно вибрати опцію Build ->Build або
натиснути клавішу F7 на клавіатурі (рис. 1.9).
Рис. 1.9 - Команда
на початок компіляції програми
Після завершення програми компіляції внизу вікна програми
з'явиться звіт про результат компіляції. Якщо помилок не виявлено, то в цьому
вікні можна ознайомитися із статистикою роботи компілятора (рис. 1.10).
Рис. 1.10 - Звіт про роботу компілятора
1.4 Налаштування програми
Якщо процес компіляції пройшов без помилок, то можна
приступити до налаштування програми. Для цього у файловій панелі необхідно
вибрати пункт меню Debug ->Start Debugging (рис. 1.11).
Рис. 1.11 - Запуск програми налаштування МК
Після виконання команди Start Debugging (рис. 1.11)
запускається вікно налаштування. Налаштування програми здійснюється, за
допомогою послідовного виконання інструкцій і перегляду результатів цього
виконання. На початку виконання програми емулятор встановить покажчик не першу
команду програми (рис. 1.12).
Рис. 1.12 - Виконання першої команди програми
У засобів налаштування AVR Studio 4 є зручне вікно перегляду поточного стану периферійних пристроїв та інших компонентів, а також регістрів спеціального призначення, що відповідають за їх налаштування. У правій частині екрану у колонці I/O View можна спостерігати стан порту D, в який буде видаватись код 0b01000101.
На початку програми всі регістри порту D установлені в 0
(рис. 1.13).
Рис. 1.13 - Вікно панелі I/O View та стан порту D
Для подальшого виконання програми необхідно обрати пункт Debug ->Step Intor або натиснути клавішу F11 на клавіатурі (рис. 1.14).
Рис. 1.14 - Виконання програми в покроковому режимі
При натисненні клавіші F11 на клавіатурі покажчик переходить
до виконання наступної команд і т. д. (рис. 1.15).
Рис. 1.15 - Переміщення покажчика виконання програми
Код з регістру r16 видається в регістр управління даними
порту. Установку відповідних бітів в 1 регістра управління даних порту (DDRD)
можна спостерігати у вікні I/O View (рис. 1.16).
Рис. 1.16 - Зміна бітів регістра DDRD
При виконанні останньої команди програми, код з регістру DDRD
видається на виводи МК (рис. 1.17).
Рис. 1.17 - Видача коду на виводи МК
Виконання програми завершено.
При зміні коду, що видається в порт D, програму необхідно
повторно компілювати, а потім запустити на виконання, виконавши наведені вище
операції.
1.5 Основні засоби налаштування AVR Studio 4
У пункті меню Debug. є наступні підпункти:
Stop Debuggind - зупинка налаштування;
- Run - запуск швидкого автоматичного налаштування. Емулятор переходить до режиму автоматичного виконання коду, не інформуючи при цьому про те, на якій команді він знаходиться в даний момент. Це може знадобитися, коли необхідно за допомогою налаштування швидко виконати великий фрагмент коду і зупинитися у потрібному місці. При цьому місце зупинки автоматичного налаштування має бути вказане точкою зупинки (Breakpoint);
Break - використовується для зупинки режимів автоматичного налаштування;
Reset - для перезапуску програми емуляції;
Step Into - використовується для режиму ручної покрокового налаштування, з урахуванням переходу у підпрограму, якщо зустрічається інструкція виклику підпрограми;
Step Over - працює так само як і Step Into за винятком того, що при переході на інструкцію виклику підпрограми переходить в режим швидкого автоматичного налаштування коду підпрограми і зупиняється на наступній інструкції після виконання підпрограми;
Step Out - використовується для запуску швидкого автоматичного налаштування, якщо поточна позиція команди знаходиться у програмі, що викликається. Це може знадобитися тоді, коли необхідно перейти в код підпрограми, що викликається, щоб не налаштовувати її повністю в ручному режимі, а зупинитися на потрібному місці, а потім запустити швидке автоматичне налаштування в межах коду підпрограми;
Run to Cursor - використовується для запуску швидкого автоматичного налаштування від поточного положення до місця, де встановлено курсор;
Auto Step - використовується для запуску режиму повільного автоматичного налаштування. При цьому емулятор інформує про поточний стан параметрів усіх елементів МК.
Наведено фрагмент використання точки зупинки в процесі
налаштування програми (рис. 1.18).
Рис. 1.18 - Установка точки зупинки в процесі налаштування
програми
Основні елементи вікна Processor (рис. 1.19):
Program Counter - показує поточний стан лічильника програм, тобто адреса поточної інструкції в пам'яті програм;
- Stack Pointer - покажчик стека, показує поточне значення адреси точки повернення в пам'яті даних, де і реалізований стек;
X pointer - поточне значення покажчика X (R26: R27). Y pointer - Поточне значення покажчика Y (R28: R29). Z pointer - Поточне значення покажчика Z (R30: R31);
- Cycle Counter - показує кількість машинних циклів в режимі налагодження.
- Frequency - показує умовну частоту резонатора;
- Stop Watch - показує поточний час по ходу виконання програми;
SREG - показує поточний стан регістрів SREG
R00...R31 - список регістрів загального призначення.
Рис. 1.19 - Елементи вікна Processor
РОЗДІЛ 2
РОЗРОБКА ДІАГНОСТИЧНОЇ ПРОГРАМИ ДОДАВАННЯ ТА ВІДНІМАННЯ
ДВІЙКОВИХ ТА ДВІЙКОВО-ДЕСЯТКОВИХ ЧИСЕЛ ДЛЯ МК AVR
Розглянемо спосіб представлення числових даних в МК,
алгоритмів арифметичних операцій для розроблення діагностичної програми
додавання та віднімання двійкових та двійково-десяткових чисел для МК AVR та набуття навиків програмування
арифметичних процедур.
2.1 ТЕОРЕТИЧНІ ВІДОМОСТІ ПРО ПРЕДСТАВЛЕННЯ ЧИСЕЛ В МК
При обробці числової інформації зазвичай вважають, що цілі числа представлені в форматі з фіксованою крапкою справа, D=dn-1dn-2…d1d0, дробові числа менше 1 - в форматі з крапкою зліва - D=d-1d-2…d(n-1)d-n , де n - число розрядів, рівне 8 або 16. Числа можуть бути із знаком і без знаку.
При представленні у вигляді цілих чисел d0 - молодший розряд числа з вагою 20, старший розряд використовується для представлення знаку (0 - додатній, 1 - від’ємний). Старший цифровий розряд - dn-2 з вагою 2n-2. При обробці чисел без знаку розряд dn-1 є цифровим з вагою 2n-1.
Дріб без знаку має старший цифровий розряд d-1 з вагою 2-1. Для дробових чисел із знаком розряд d-1 відводиться під знак, старший цифровий розряд в цьому випадку - d-2 з вагою 2-1.
Від’ємні числа, як цілі так і дробові, зазвичай, представляються у вигляді доповнень до основи системи числення. Для двійкових чисел це буде доповнення до 2n, для дробових - доповнення до 2.
В загальному випадку доповнення любого цілого n-розрядного числа D до основи b системи числення можна отримати
шляхом віднімання D з bn.
Якщо D знаходиться в межах від 1 до
bn - 1, то при відніманні
отримуємо друге число в тих же межах. Якщо D = 0, то результат віднімання
дорівнює bn і має вигляд 100…0 при
загальному числу розрядів (n+1). Відкинувши цифру старшого розряду, отримуємо 0. Отже, в системі
представлення чисел доповненням до основи числення існує тільки одне
представлення 0. В системі, де від’ємні числа представлені в додатковому коді,
число є додатнім, якщо значення старшого розряду dn-1 = 0, і від’ємним, якщо dn-1 = 1. Десятковий еквівалент
двійкового числа, що представлений додатковим кодом, обчислюється так же, як і
для числа без знаку, за винятком того, що вага старшого розряду дорівнює - 2(n-1) , а не + 2(n-1). Числа, що представляються,
знаходяться в діапазоні від - 2(n-1) до + 2(n-1)-1.
Для дробових чисел дріб є додатним, якщо розряд d-1 = 0, і від’ємним, якщо d-1 = 1. Діапазон дробових чисел
складає від - 1 до + (1- 2-n).
2.2 ДОДАВАННЯ ТА ВІДНІМАННЯ ЧИСЕЛ У ДОДАТКОВОМУ КОДІ
Графічно 8-розрядні двійкові числа у додатковому коді зі знаком наведені на рисунку 2.1 та позначені позиціями всередині кола.
Всередині кола вказані десяткові значення, зовні - їх шістнадцятирічні еквіваленти. Додавання з додатнім числом N легко інтерпретується, якщо переміщати покажчик по ходу часової стрілки на N позицій; віднімання (- N) - проти ходу часової стрілки, або переміщуючи по ходу часової стрілки на (256 - N) позицій, що рівносильне заміні віднімання додаванням з доповненням числа до 28 = 256.
Якщо при додаванні (відніманні) отримуємо результат, що виходить за межі діапазону чисел (від - 128 до + 127), то фіксується переповнення.
Правило виявлення переповнення. При додаванні переповнення
виникає тільки в тому випадку, коли доданки мають однакові знаки, а знак суми
відрізняється від знаку доданків. При відніманні переповнення виникає, якщо
операнди мають різні знаки, а знак різниці відрізняється від знаку
зменшуваного. Правило переповнення можна сформулювати по-іншому, якщо
використати поняття переносу, що виникає при додаванні (відніманні).
Переповнення виникає, якщо значення переносу в знаковий розряд р7 та із
знакового розряду р8 різні. З аналізу рисунку 2.1 слідує, що переповнення
виникає при додаванні, якщо покажчик перейде границю між позиціями + 127 і -
128.
Рис. 2.1 - Кругові діаграми
Числа в додатковому коді додаються та віднімаються так само, як і числа без знаку тієї ж довжини. Тому при додаванні (відніманні) чисел із знаком і без знаку необхідна одна й таж сама команда додавання (віднімання). Різниця полягає лише в тому, що результати інтерпретуються по-різному в залежності від того, якими числам оперує користувач: числами із знаком (від - 128 до + 127) чи без знаку (від 0 до 255).
Якщо при додаванні чисел без знаку результат виходить за межі діапазону представлення при перетині границі між 255 та 0, то говорять про виникнення переносу із старшого розряду.
Якщо при відніманні чисел без знаку результат виходить за межі діапазону представлення при перетині границі між 255 та 0, то в цьому випадку виникає запозичення, а різницю отримуємо у додатковому коді. Так як віднімання N можна замінити додаванням з додатковим кодом числа N, що дорівнює (256 - N), то із діаграми видно, що запозичення виникає без переносу із старшого розряду. Такий самий висновок можна зробити при виконанні операцій в машинному коді. Дійсно, віднімаючи від шістнадцятирічного числа $05 число $07, отримуємо $05 - $07 = $05 + $F9 =$FE = -2. В цьому випадку перенос не виникає. Запозичення, що визначається при відсутності переносу при операції віднімання, є. І навпаки, віднімаючи від числа $07 число $05 отримуємо $07 - $05 = $07 + $FB = $102 = $100 (перенос) +$02 = 2. Перенос є, що при відніманні відповідає відсутності запозичення.
Наведене вище правило треба враховувати при обробці операндів
подвійної довжини, наприклад 16-розрядних операндів у 8-розрядному процесорі.
.3 ДОДАВАННЯ ТА ВІДНІМАННЯ ДВІЙКОВО-ДЕСЯТКОВИХ ЧИСЕЛ
При додаванні двох двійково-десяткових чисел A = an-1an-2 …a0a1 і
B = bn-1bn-2 …b0b1 поступають наступним чином. Якщо обидва операнди мають однакові знаки, то виконують додавання модулів цих чисел (|А| + |В|), а знаковий розряд суми визначається по знаку одного із доданків. Якщо операнди мають різні знаки, то попередньо знак суми встановлюється по знаку першого операнду. Потім проводять віднімання модулів чисел. Якщо отримана різниця більшу нуля, знак суми зберігається без зміни. Якщо різниця менше нуля, то необхідно знайти додатковий код різниці та змінити знак суми на протилежний.
При додаванні двох чисел А та В, що представлені в двійково-десятковому коді, з вагою 8 - 4 - 2 - 1 в кожній тетраді, в одному розряді суми S = A + B можна отримати наступні результати:
1. si ≤ 9; корекція не потрібна.
2. 10 ≤ si ≤ 15; потрібна корекція шляхом збільшення si на шість з утворенням переносу із тетради.
3. si > 15; потрібна корекція шляхом збільшення на шість. В цьому випадку перенос із тетради утворюється автоматично при додаванні операнду до виконання корекції.
В МК з архітектурою MCS-51 корекція здійснюється апаратно при виконанні команди двійково-десяткової корекції. При відсутності схеми двійково-десяткової корекції, як, наприклад, в МК AVR, поступають наступним чином. При додаванні двійково-десяткових чисел добавляють число, кожен розряд якого дорівнює шести. В цьому випадку, якщо порозрядна сума, що обчислюється si ≤ 9, перенос із тетради не виникає і надлишкове значення шість підлягає видаленню. У всіх решта випадках додавання в розряд значення шість видаляється автоматично з переносом із тетради в процесі додавання. При такому способі додавання програмна реалізація спрощується, так як для корекції результату в тетраді перевіряється лише одна ознака - наявність або відсутність переносу із тетради.