Регістри Robotic & Microcontroller Educational Knowledgepage - Network of Excellence

Найчастіше для початківців «регістр» є найбільш складною частиною мікроконтролерів. На жаль, без цього поняття не обійтися, якщо є бажання займатися мікроконтролерами. Щоб читач зміг ознайомитися з поняттям регістру, даний матеріал спрощений рівня початківця.

Регістри можна порівняти з кнопковою панеллю будь-якого домашнього пристрою, де є вимикачі, які можна вмикати та вимикати. Наприклад, касетний магнітофон, який мав шість кнопок:

Кожна кнопка має своє призначення, але при правильному використанні. Наприклад, кнопка «Стоп» не робить нічого раніше, ніж запустити грати касету, тільки після цього вона зможе щось зробити – зупиняє гру касети. Кнопки перемотування "Вперед" або "Назад" можна в будь-який момент натискати, т.к. стрічка почне крутитись як під час гри касети, так і під час стопу. Запис магнітофона розпочнеться лише в тому випадку, якщо натиснути кнопку «Запис» разом із кнопкою «Відтворення».

Регістри мікроконтролера, так само як і кнопки касетного магнітофона, мають свої певні функції. Звичайно, в регістрах таких кнопок, як у магнітофона немає, але існує безліч транзисторів, які включають та вимикають електрику. У найпростіших мікропроцесорів регістр складається з електричних вимикачів, заснованих на 8 транзисторах. Регістр можна розглянути з прикладу 8-бітної системі числення, де кожен біт вказує стан кнопки. Наприклад, значення біта 1 свідчить про включену кнопку, а 0 – на вимкнену.

Оскільки стан вимикачів регістру можна порівняти з числами та навпаки, то регістр можна порівняти з пам'яттю, яка здатна зберігати дані розміром в одне число. Завдяки цим порівнянням ми прийшли до того,що насправді регістри це і є осередки пам'яті. Завдання осередку пам'яті полягає зазвичай у тому, щоб зберігати інформацію, а регістрі ця інформація чимось управляє. Якщо в зображений на малюнку регістр вписати бітове значення 01100001, то 3 уявних вимикача натискаються і щось починає відбуватися.

Використання

У програмі мови Сі для записування чи читання значення регістру необхідно щодо нього звернутися як до змінної. Наступний приклад демонструє запис бінарного значення вигаданий регістр REG і читання цього значення змінну reg. Перед бінарним значенням пишеться 0b (попереду нуль), щоб компілятор зрозумів систему числення.

У записі та читанні значень регістрів нічого складного немає, складність з'являється тоді, коли необхідно змінити значення окремих бітів у регістрі. Для зміни бітів спочатку необхідно вивчити бінарні операції та різні системи числення. Ніхто не забороняє використовувати бінарні числа, але робота з ними незручна через їх довжину і зазвичай використовують шістнадцяткові числа, які коротші.

educational

На відміну від бінарної системи, де числа 0 і 1 або від десяткової системи, де числа від 0 до 9, у шістнадцятковій системі – від 0 до F. Одне шістнадцяткове число утворюється із чотирьох бітів. На наведеній таблиці показані шістнадцяткові числа та відповідні бінарні числа. Черговість їх зчитування зліва направо та їх нумерація починається з нуля. Попереду наведено бінарне значення регістру 01100001, яке у шістнадцятковій системі числення відповідає 61, а мовою Сі пишеться як 0x61 (попереду нуль).

Для зміни окремих бітів у числі (реєстрі, змінній або деінде), потрібно використовувати бінарні операції. Бінарна операція – це операціяміж бінарними числами, де між бітами цих чисел відбуваються окремі логічні операції. У більшості мікроконтролерів використовують чотири бінарних операції, у кожної з яких кілька назв. Далі наведена відповідна всім чотирма бінарним операціям логічна операція з окремим бітом або бітами.

Все вищенаведене необхідне зміни значень окремих бітів. Але лише теорії буде недостатньо, тому далі наведені деякі типові приклади з регістрів.

Налаштування окремого біта високим

Для того, щоб один або кілька бітів у регістрі налаштувати високими тобто. одиницею, необхідно використовувати операцію логічного складання. Один операнд операції додавання має бути регістром, другий бінарним числом, де високий тільки той біт, який бажають налаштувати високим і в регістрі. Це друге бінарне число називають бітовою маскою. Поруч зображена операція мовою Сі виглядає так:

Налаштування окремого біта низьким

А, щоб один чи кілька бітів налаштувати низькими, тобто. нулем, необхідно використовувати операцію логічного множення. Один операнд операції має бути регістром, інший бітовою маскою, де низьким налаштований лише той біт, який бажають налаштувати низьким і регістрі. Зображена поруч операція мовою Сі виглядає так:

Операція інвертування біта

Для інвертування одного чи кількох бітів у регістрі необхідно використовувати операцію нерівнозначності. Один з операнда операції має бути регістром, другий бітовою маскою, де високим налаштований тільки той біт, який бажають інвертувати і в регістрі. Операція, зображена поруч, мовою Сі виглядає так:

Інвертування всього регістру

Дляінвертування бітів всього регістру необхідно використовувати операцію заперечення. Ця операція має лише один операнд. Операція, зображена поруч, мовою Сі виглядає так:

Читання значення окремого біта

Для читання одного або кількох значень біта з регістру, необхідно використовувати ту саму операцію, що й при обнуленні – логічне множення. Один з операнда операції має бути регістром, інший бітовою маскою, де високим налаштований тільки той біт, значення якого бажають вважати з регістра. Операція, зображена поруч, виглядає мовою Сі наступним чином:

Зміщення біта

Насправді, у багатьох мовах програмування, крім бінарних операцій, існують і деякі бітові операції, які полегшують роботу програмістів. Такими є операції усунення біта, які в бінарному числі зміщують біти ліворуч або праворуч. Основна цінність операцій зі зміщення полягає в тому, що вони здатні перетворювати розряди бітів на бітову маску і навпаки.

На вказаному поруч зображенні наведено приклад операції зі зсуву біта вліво. Зсув не є логічною операцією і у нього відсутнє відповідне позначення, а мовою Сі це “““. Зсув ліворуч використовується для перетворення бітового розряду на бітову маску. Наприклад, якщо бажають маску 6 біта (NB! розряд 5), потрібно число 1 зрушити вліво 5 разів. Операція, наведена в прикладі, виглядатиме мовою Сі наступним чином:

Подібно до зсуву вліво, працює і операція зрушення вліво. Позначення цієї операції мовою Сі - “»“. Зсув праворуч використовується для знаходження логічного значення біта з бітової маски. Попереду було наведено приклад операції зчитування значення одиночного біта. Припустимо, що біт, які треба рахувати не з найменшимрозрядом, а наприклад, з розрядом 5. У цьому випадку відповідь зчитування була б 0х20 або 0х00, але іноді потрібна відповідь 1 або 0 і тоді приходить на допомогу зсув вправо. Операція, наведена в прикладі, виглядатиме мовою Сі наступним чином:

Якщо операції зрушення біта, біт зрушується з низького розряду вправо чи з високого вліво, він зникає. У деяких мовах програмування існують операції зсуву бітів, що обертаються, де біт не зникає, а рухається з одного кінця в інший. На мові Сі операції, що обертаються, зсуву біта відсутні, але при бажанні їх можна написати самим.

Усі переведені приклади операцій працюють крім регістрів і зі змінними та константами. Останні може бути лише операндами, а чи не відповідями.

Регістри AVR

Для того, щоб зробити щось реальне з регістрами мікроконтролера, потрібно знати, як користуватися конкретним мікроконтролером. До кожного мікроконтролера додається одна або кілька специфікацій, що описує структуру та функціональність мікроконтролера. У специфікації описані та регістри. Далі вивчимо, як розібратися в описі регістрів у специфікації AVR.

На зображенні наведено регістр UCSRnA мікроконтролера ATmega128, повна назва якого USART Control and Status Register A. Це регістр, з допомогою якого конфігурується модуль USART AVR-а якого можна вважати стану цього модуля. Всі назви регістрів AVR пишуться великими літерами, але уважний читач зауважить, що в цьому регістрі є маленька літера n. Маленькою літерою n позначається індекс якогось модуля. Так як в ATmega128 є 2 дуже схожі USART модулі, то в регістрі вони не записуються подвійно, а тільки один раз і замість літери n повинен читач вставляти "0" або "1". З чогослід, що ATmega128 є регістри UCSR0A і UCSR1A.

Вміст регістру зазначено у ящику з 8 осередками, виділеним товстою лінією. Кожен осередок позначає один біт. Над ящиком наведено черговість бітів, вони зростають праворуч наліво. Так як AVR - це 8-бітний мікроконтролер, більшість регістрів так само 8-бітні. Є деякі винятки у вигляді 16-бітових регістрів, які складаються з двох 8-бітових регістрів. На додачу до регістрів назва має кожен біт регістра, так само як і кнопки магнітофона. У специфікації є пояснення до кожного біта. Назви бітів – це скорочення і букву n у яких слід замінити індексом модуля. У деяких регістрах використані в повному обсязі біти, й у разі осередок біта позначається знаком тире.

Під бітами регістру наведено два рядки, де написано, чи є біт читаним (R), записуваним (W) або тим і іншим (R/W). Наприклад, біт стану не можна переписати, і навіть у разі, якщо це намагаються зробити в програмі, не набуває біт бажаного значення. У випадку з бітом, який можна тільки записувати, вказано одне конкретне значення, яке завжди з'являється при його читанні. У другому стоку під бітами вказано стандартне значення, яке є у біта після запуску мікроконтролера (англ. reset).