Алгоритм у цьому випадку виглядає наступним чином:
1. Двійково-десятковий код першого операнду додається з кодом 66…66, утворюючи першу проміжну суму.
2. До отриманої суми додається двійково-десятковий код другого операнду, утворюючи другу проміжну суму.
. По тетрадам виконується корекція результату. Правило корекції формулюється наступним чином: якщо в результаті другого додавання перенос із i-ої тетради відсутній (ci+1 = 0), то із s*i віднімається шість (або додається 10 = [-6]дод.). При утворенні переносу із i-ої тетради корекція не виконується, а отриманий результат s*i є кінцевим. При виконанні корекції перенос із тетради не повинен змінювати значення наступної тетради суми s*i+1 .
Таким чином, додавання беззнакових чисел (як і модулів) можна
виконати по алгоритму, схему якого наведено на рисунку 2.2.
Рис. 2.2 - Алгоритм додавання двійково-десяткових чисел
При обробці операторів, що мають довжину більшу одного байту, у 8-розрядному мікроконтролері для запобігання помилок корекцію необхідно виконувати окремо для кожної тетради.
Приклад. А = 50, В = 25. Знайти суму А + В.
Двійково-десяткове значення чисел А та В: А = 0101 0000, В = 0010 0101.
Додаючи числа 66 + А + В, отримуємо:
Виконуємо корекцію молодшої тетради:
Віднімання беззнакових чисел А - В можна виконати по алгоритму, схема якого наведена на рисунку 2.3.
Алгоритм у цьому випадку виглядає наступним чином:
. Виконують віднімання А - В (додавання А з додатковим кодом В), утворюючи перший проміжний результат R'. Якщо в результаті операції утворюється перенос із старшої тетради (при цьому біт запозичення дорівнює 0) результат є додатним. При відсутності переносу (біт запозичення дорівнює 1) результат є від’ємним і його потрібно перевести у додатковий код R*.
2. Корекція додатного результату здійснюється по правилу,
що сформульоване для додавання двійково-десяткових чисел. Корекція від’ємного
результату трохи відрізняється від попереднього правила при додаванні і
виконується наступним чином: якщо виник перенос із i-ої тетради (біт міжтетрадного
запозичення дорівнює 0) при відніманні А - В, то із i-ої тетради R*i віднімається шість. При виконанні
корекції перенос із тетради не повинен змінювати значення наступної тетради
проміжного результату.
Рис. 2.3 - Алгоритм віднімання двійково-десяткових чисел
Приклад. А = 23, В = 62. Знайти різницю А - В.
Двійково-десяткове значення числа А і В: А = 0010 0011, В = 0110 0010.
Додатковий код числа В: [В]дод. = 1001 1110.
Віднімаючи А - В = А + [В]дод., отримуємо R':
Переносу немає: результат операції від’ємний, біт запозичення дорівнює 1.
Формуємо доповнення [R']дод. та виконуємо корекцію:
Результат: біт знаку - ; різниця 39.
Коли від’ємний результат необхідно зберегти у додатковому
коді, крок формування доповнення опускається. Можна одразу переходити до
корекції (відніманню шести в тих тетрадах, де не було переносу).
2.4 ПРОГРАМУВАННЯ АРИФМЕТИЧНИХ ОПЕРАЦІЙ
Для двійкового додавання та віднімання числа можна задавати із знаком і без знаку. Двійково-десяткові числа представлені в упакованому вигляді без знаку.
Для програмування оберемо мікроконтролер фірми Atmel AT90S8515.
Приклад тестової програми для перевірки операцій додавання та віднімання двійково-десяткових однобайтних чисел в середовищі AVR Studio 4 наведено у додатку А.
На рисунках 2.4 та 2.5 наведені фрагменти виконання програми
в AVR Studio 4.
Рис. 2.4 - Завантаження регістрів R30, R31
Рис. 2.5 - Установка бітів переносу та міжтетрадного переносу
у регістрі статусу МК AT90S8515
РОЗДІЛ 3
ЗАВАНТАЖЕННЯ ДІАГНОСТИЧНИХ ПРОГРАМ В ПАМ'ЯТЬ МК AVR
Кінцевим етапом даної роботи є розгляд організації
флеш-пам'яті та внутрішніх регістрів МК AVR, що відповідають за програмування
пам’яті EEPROM, завантаження діагностичних програм в пам'ять МК AVR та набуття навиків програмування
пам’яті EEPROM МК AVR.
3.1 ПАМ'ЯТЬ КОМАНД МК (ТЕХНОЛОГІЯ FLASH-EEPROM)
Відмінною особливістю МК сімейства AVR є те, що в них як пам'ять програм використовується одна і та ж пам'ять типу FLASH-EEPROM, яка може бути різного об'єму, вільно програмуватись користувачем і знову витиратися електричним способом.
Такі перші представники однокристальних МК як 8048 і 8051 компанії Intel можна було придбати або з пам'яттю типа MROM (програмно-маскована ROM), або з вбудованою пам'яттю EPROM. Вони могли працювати також і із зовнішньою пам'яттю EPROM. Моделі з пам'яттю типа MROM мали один недолік: їх міг програмувати лише завод, що виготовляв такі моделі в рамках виробничого процесу, а витерти дані було неможливо.
МК з пам'яттю EPROM мали в корпусі віконце з кварцевим склом для витирання інформації, проте їх негативною стороною була висока ціна.
МК сімейства AVR з вбудованою флеш-пам'яттю EPROM економлять не лише місце на платі електронного пристрою, але також представляють в розпорядження користувача всі контакти вводу/виводу МК. Також може відпасти необхідність і в колодці для зовнішньої пам'яті EPROM.
Поряд з можливістю програмування всіх МК сімейства AVR в паралельному режимі, компанія Atmel надає в розпорядження користувачів дуже ефектну можливість послідовного програмування через послідовний інтерфейс SPI. В результаті програма користувача може бути «записана» у флеш-пам'ять і знову витерта безпосередньо у складі схеми, в якій працюватиме мікроконтролер. Схема програмування вже інтегрована в кристал.
Допоміжна напруга Vpp = +12B необхідна лише при програмуванні в паралельному режимі. Так або інакше,
ця напруга використовується в більшості електричних схем (наприклад, для
послідовного інтерфейсу).
3.2 ФІЗИЧНА ОРГАНІЗАЦІЯ ФЛЕШ-ПАМ'ЯТІ БАЗОВОЇ СЕРІЇ МК
СІМЕЙСТВА AVR
Пам'ять команд в МК базової серії сімейства AVR є флеш-пам'яттю EPROM і у всіх чотирьох моделях складається з n 16-розрядних (2 байти) слів.
У мікроконтролері АТ90S8515 - лічильник команд має ширину 12 розрядів і таким чином може обробляти n = 4096 ($1000) - 4Кбайт командних 16-розрядних слів. У мікроконтролері АТ90S4414 він має ширину 11 розрядів, що відповідає n = 2048($800) командних слів. Мікроконтролер АТ90S2313 містить лічильник команд шириною 10 розрядів (n = 1024 і, відповідно, $400), а мікроконтролер АТ90S1200 зі своїм лічильником команд шириною 9 розрядів може адресувати 512 ($200) команд.
Розподіл пам'яті команд в чотирьох основних типах МК AVR
наведено на рисунку 3.1.
Рис. 3.1 - Розмір та організація пам’яті по технології
флеш-пам’яті EPROM
.3 ДОСТУП ЦЕНТРАЛЬНОГО ПРОЦЕСОРА ДО ПАМ'ЯТІ EEPROM НА ЗАПИС/ЧИТАННЯ
Для програмування пам'яті EEPROM МК AVR немає необхідності застосовувати зовнішній програматор. Кожна комірка пам'яті EEPROM може бути запрограмована безпосередньо під час виконання програми користувача.
Якщо під час звернення до пам'яті EEPROM з метою запису відбувається системне скидання, то результат буде невизначений, оскільки регістр адреси EEAR буде встановлено в лог.0. З цієї причини можуть міститися помилкові дані за адресою, що підлягає програмуванню, або в байті з адресою 0 в пам'яті EEPROM.
Для програмування використовуються три регістри пам'яті EEPROM: регістр адреси EEAR, регістр даних EEDR і регістр керування EECR. У всіх трьох випадках йдеться про 8-розрядні регістри, за винятком регістра EEAR МК AT90S8515, оскільки у цього МК в розпорядженні є 512 байт пам'яті EEPROM, і, таким чином, для адресації необхідно 9 розрядів. В мікроконтролері AT90S8515 регістр EEAR 16-розрядний і роздільний на дві частини: EEARH (старший байт) і EEARL (молодший байт).
Розглянемо регістри EEAR, EEDR і EECR, що використовуються
при зверненні до пам'яті EEPROM.
.4 РЕГІСТР АДРЕСИ EEAR ПАМ'ЯТІ EEPROM
Регістр адреси EEAR пам'яті EEPROM має довжину один байт
(мікроконтролери AT90S1200, AT90S2313, AT90S4414) або два байти -
мікроконтролер AT90S8515. Він розташований в області вводу/виводу за адресою
$1E(RAM:$3E) а, в разі МК AT90S8515 займає два байти з адресами $1E(RAM:$3E-
молодший байт) і $1F(RAM:$3F- старший байт) (рис. 3.2).
|
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
- |
- |
- |
- |
- |
- |
- |
EEAR8 |
EEAR8 |
EEAR8 |
EEAR8 |
EEAR8 |
EEAR8 |
EEAR8 |
EEAR0 |
EEAR0 |
Рис. 3.2 - Структура регістра адреси EEAR
Ці байти доступні для читання та запису. Після подачі сигналу
скидання біти регістру EEAR установлюються в 0. Для програмування або читання
байта даних пам'яті EEPROM в регістр адреси EEAR має бути записана відповідна
адреса.
3.5 РЕГІСТР ДАНИХ EEDR ПАМ'ЯТІ EEPROM
Регістр даних EEDR пам'яті EEPROM знаходиться в області
вводу/виводу за адресою $1D (RAM:$3D). Після подачі сигналу скидання біти
регістру EEAR обнуляються. Байт EEDR доступний для читання і запису (рис. 3.3).
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
MSB |
|
|
|
|
|
|
MSL |
Рис. 3.3 - Структура регістра даних EEDR
В процесі запису в пам'ять EEPROM байт, що підлягає
програмуванню, завантажується в регістр EEDR. В процесі читання з пам'яті
EEPROM в регістр EEDR записується вміст відповідного рядка пам’яті EEPROM.
Адреса в пам'яті EEPROM в обох випадках визначається по вмісту регістра EEAR.
3.6 РЕГІСТР КЕРУВАННЯ EECR ПАМ'ЯТІ EEPROM
Регістр керування EECR пам'яті EEPROM знаходиться в області
вводу/виводу за адресою $1C (RAM: $3C) (рис. 3.4).
|
7 |
6 |
5 |
4 |
2 |
1 |
0 |
|
|
- |
- |
- |
- |
- |
EEMWE |
EEWE |
EERE |
Рис. 3.4 - Структура регістра керування EECR
У МК сімейства AVR використовуються лише розряди 0…1
(AT90S1200) або ж розряди 0…2 регістра EECR (доступні для читання і запису).
Останні розряди компанія Atmel зарезервувала для подальших застосувань і вони
доступні лише для читання (завжди містять лог. 0).
3.7 ЧИТАННЯ ПАМ'ЯТІ EEPROM ВСІХ ТИПІВ МК AVR
Для керування процесом читання використовується розряд EERE (EEPROM Read Enable - пам'ять EEPROM готова до читання). Після запису коректної адреси в регістр EEAR процес читання може бути активізований установкою розряду EERE в регістрі керування EECR.
У МК AT90S1200, особливо у варіантах для високих тактових частот розряд EERE необхідно встановлювати підряд двічі, щоб надати апаратній частині досить часу для читання елементів пам'яті EEPROM. Це показано на прикладі розглянутої нижче програми.
Після закінчення читання розряду EERE апаратне забезпечення прочитує необхідний байт в регістр EEDR, після чого вже немає необхідності знов опитувати розряд EERE, оскільки читання триває лише один цикл такту системної синхронізації. Після того, як розряд EERE встановлений в лог.1, центральний процесор буде затримано на два такти системної синхронізації перш ніж буде виконана наступна команда (це не відображується при тестуванні в AVR Studio аж до версії 1.5).
Перед початком операції читання програма користувача повинна
постійно опитувати розряд EEWE і чекати появи лог. 0. Якщо під час
програмування пам'яті EEPROM у відповідний регістр вводу/виводу пам'яті EEPROM
буде записана нова адреса або дані, то процес програмування, що ще
продовжується, буде перерваний і результат буде невизначеним.
.8 ЗАПИС В ПАМ'ЯТЬ EEPROM В МК АТ90S2313, AT90S4414 І
АТ90S8515
Розряд EEWE (EEPROM Write Enable - пам'ять EEPROM готова до запису) - це розряд керування процесом запису. Для запису байта в пам'ять EEPROM розряд EEWE необхідно встановити в лог. 1, якщо в регістрі EEАR знаходитися адреса пам'яті EEPROM, а в регістрі EEDR - байт даних, що підлягає програмуванню. Для запобігання невизначеності запису в пам'ять EEPROM розряд EEWE може бути встановлений лише в тому разі, якщо встановлений також і розряд EEMWE.
Для програмування пам'яті EEPROM мають бути виконані наступні дії:
. Діждатися закінчення процесу програмування пам'яті EEPROM( якщо він активний), тобто доки розряд EEWE не повернувся в стан лог. 0.
. Записати нову адресу в регістр EEAR пам'яті EEPROM (1 байт або 2 байти в разі використання МК АТ90С8515).
. Записати необхідний байт даних в регістр EEDR пам’яті EEPROM.
. Встановити розряд EEMWE в лог. 1.
. Впродовж наступних чотирьох періодів такту системи після установки розряду EEMWE в розряд EEWE має бути записана лог. 1, тим самим буде запущений процес програмування.
По закінченню циклу програмування (типова тривалість - 2,5 мс при робочій напрузі Vсс = 5 В і, відповідно, 4 мс при напрузі Vсс = 2,7 В), розряд EEWE за допомогою внутрішніх апаратних засобів МК автоматично встановлюється в лог. 0. Програма користувача повинна безперервно опитувати цей розряд, чекаючи появу лог. 0, перш ніж приступити до програмування наступного байту.
Після установки розряду EEWE в лог. 1 центральний процесор буде затримано на два такти системою синхронізації, після чого він може виконувати наступну команду (це не буде показано в результаті тестування в AVR Studio аж до версії 1.50; також не повністю врахована і тривалість процесу програмування).
При записі одного байту в пам'ять EPROM розряд EEMWE також має бути встановлений в лог. 1 (EEPROM Master Write Enable - загальний дозвіл запису в пам'ять EEPROM). Після того, як розряд EEMWE встановлений, рівень лог. 1 зберігається в ньому протягом чотирьох періодів такту системної синхронізації, а потім буде виконано апаратне скидання в лог. 0.
Програма користувача може програмувати байт за допомогою запису лог. 1 в розряд EEWE лише впродовж цих чотирьох тактів системної синхронізації. Якщо буде встановлений розряд EEWE, але без установки розряду EEMWE, то процес програмування розпочатий не буде.
Приклад програми, яка показує процес програмування і читання пам'яті EEPROM МК AT90S8515 наведений у додатку Б.
В такому вигляді програма буде читати з виводів порту С код $FF, оскільки вони находяться в третьому стані. Тому попередньо на виводах порту С треба встановити довільний код в межах $00…$FF (рис. 3.5).
На рисунках 3.5-3.9 наведені фрагменти виконання програми
програмування пам’яті EEPROM.