Наявність в програмі функцій накладає відбиток на побудову лістингу Оглядово можна виділити кілька конструкцій:

• програма має тільки системні функції («Архітектура-1»)

• програма має системні і внутрішні функції («Архітектура-2»)

• програма має обробник переривань («Архітектура-3»)

• програма має системні та зовнішні функції («Архітектура-4»)

Теоретично будь-яку Мікроконтроллерні Сі-програму можна побудувати по будь-якій з перерахованих архітектур, але відрізнятися вони будутдліной лістингу та швидкістю виконання операцій Найчастіше зустрічаються програми, в яких змішано декілька архітектур Наприклад, мирно уживаються системні, внутрішні і зовнішні функції, доповнені обробником переривань

«Архітектура-1» (системні функції)

Лістинг, наведений на Рис 67, відносяться до «Архітектурі-1», оскільки містить одну лише системну функцію «main» В інших, більш складних програмах, системних бібліотечних функцій може бути кілька (Мал 628)

Рис 628 Структурна схема Сі-програми з «Архітектурою-1»

Виконання програми починається з «Оператора-1» головною системної функції «main» Як тільки управління перейде до оператора «_delay_ms (10)», компілятор визначає, що це бібліотечна функція і автоматично підставляє замість неї певний блок асемблерних команд, що виконують затримку часу рівно на 10 мс Оскільки втрутитися в даний процес не можна, то функція виходить не залежної від бажання програміста, тобто системна

У AVR-GCC багато системні функції починаються з символу підкреслення «_» або мають цей символ всередині назви функції Практична рекомендація – при складанні своїх власних функцій, їх назви не повинні починатися з символу «_»

«Архітектура-2» (системні і внутрішні функції)

Філософія мови Сі полягає в толерантності до вибору алгоритмів Ніхто не засудить людини, який складе просту і довгу, як «трубопровід», програму з використанням «Архітектури-1» Лише б терпіння і уважності вистачило, та коди прошивки помістилися в память MK

Однак рано чи пізно приходить розуміння того, що фізичні можливості MK не безмежні Проблема скорочення обсягу програми змушує шукати більш економічні побудови

На Рис 629 показані взаємозвязки в Сі-програмі з «Архітектурою-2», де застосовується внутрішня функція з абстрактним імям «test»

Рис 629 Структурна схема програми з «Архітектурою-2»

Робота програми, як і колись, починається з функції «main» Виконується «Оператор-1» і далі до рядка «test ()», після чого нормальний хід програми переривається і керування передається на «Оператор-N», але вже функції «test» Потім послідовно виконуються оператори «N» .. «T» і по команді «return» відбувається повернення в основну програму до наступного за рахунком «Оператору-К»

«Архітектура-3» (системні функції і переривання)

Переривання, таймери і лічильники в микроконтроллерной техніці – це особливий клас понять Їх зручно застосовувати, але складно вивчати, особливо на початковому етапі Основна проблема криється не в ідеології обробки переривань, а в заплутаній системі ініціалізації регістрів спеціальних функцій

Щоб полегшити завдання, пропонується для кожного різновиду переривань конкретного MK складати таблицю Сі-операторів, що відповідають за активацію певних режимів Програмісту знадобиться лише правильно скомпонувати Сі-оператори стосовно до необхідних режимам і вставити їх єдиним блоком в програму На жаль, універсальної таблиці для всіх AVR-контролерів зробити не вийде У кожному конкретному випадку треба уважно чітатьдаташіти, написані мовою Шекспіра, або ознайомитися з їх русифікованими перекладами [6-21]

Таймери / лічильники є базовими елементами системи переривань будь-якого MK По внутрішньому устрою це набори регістрів, в які можна записати і з яких можна вважати інформацію Кількість таймерів / лічильників і їх функції розрізняються у різних моделей сімейства ATmega Позначаються вони індексами «0» .. «5» Щоб не розпорошуватися, далі будуть розглянуті тільки найпростіші таймери / лічильники з індексом «0»

Переривання діляться на внутрішні, залежні від таймінгу тактового генератора MK, і зовнішні, де керуючі сигнали подаються ззовні через строго призначені лінії портів

У фірмовому даташіте MKATmega48A [6-9] фігурує узагальнене поняття «таймер / лічильник» (Timer / Counter) Однак не буде великою крамоли, якщо для полегшення розуміння розбити одне ціле на дві частини: таймер і лічильник

Таймер в MK схожий на звичайний секундомір, тільки відраховує він не секунди, а машинні такти Тривалість одного машинного такту обернено пропорційна F_CPU – тактовій частоті MK Знаючи її, неважко підрахувати фізичний час по зворотній пропорції 1 / F_CPU Наприклад, для частоти 1 МГц час одного «тика» таймера MK складає рівно 1 МК с

Таймер можна образно представити у вигляді механічного будильника, який «гуде» рівно в 12 годин Після цього він або продовжує вільний рахунок до повного обходу циферблата, або його стрілки примусово переводяться вперед, наприклад, на 9:00 43 хвилини У першому варіанті таймер буде подавати сигнал кожні 12 годин, у другому – кожні 2 години 17 хвилин Під словом «сигнал» програмісти розуміють переривання

У ATmega48A налічується три таймера, а саме, 8-бітний «Таймер-0», 16-бітний «Таймер-1» і 8-бітний «Таймер-2» Таймери працюють незалежно один від одного і від основної програми, в тому сенсі, що програмісту не треба вставляти в лістинг оператори, постійно коригувальні «годинник» Головне, спочатку правильно налаштувати режим рахунку за допомогою регістрів

Найпростішим для вивчення є «Таймер-0» Саме він відповідає за режим Normal, при якому по кожному тактовому імпульсу змінюється стан певного рахункового регістра від 0x00 до OxFF, а в момент переходу через 0x00 виникає переривання (Табл 610)

Таблиця 610 Установка режиму Normal «Таймера-0» в MKATmega48A

Лічильник в MK схожий на вертушку в метро, ​​автоматично підраховують число перетинають її пасажирів Лічильник можна налаштувати так, щоб він видавав сигнал (читай, переривання) після кожного входить людини або після певного числа відвідувачів Зрозуміло, замість людей MK підраховує електричні імпульси, що надходять на його лінії портів з альтернативними назвами INTx або Tx, де «х» – порядковий номер індексу

У мікросхемі ATmega48A є входи INT0 (висновок 4), INT1 (висновок 5), ТО (висновок 6), T1 (висновок 11) В умовному позначенні MK їх легко знайти з написів через дріб, наприклад, PD2/INT0/PCINT18 (Мал 69)

Лічильники, як і таймери, працюють автономно Як можна здогадатися за назвами сигналів, до «Лічильнику-О» відноситься вхід 1NT0 (лічильник одиночних імпульсів або, по-іншому, реєстратор фронтів сигналу), а також вхід ТО (лічильник пачок приходять імпульсів)

Лічильник одиночних імпульсів INT0 генерує переривання по наростаючому / спадающему фронту вхідного сигналу або при появі низького рівня (Табл 611)

Таблиця 611 Установка режимів лічильника одиночних імпульсів в MKATnega48A

Лічильник пачок імпульсів ТО працює подібно «Таймер-0», але тільки замість внутрішніх «тиків» тактової частоти F_CPU він підраховує кількість зовнішніх імпульсів на вході ТО (Табл 612)

Загальний заборона переривань виробляється системної функцією «C1i ()», загальний дозвіл – системної функцією «sei ()»

Таблиця 612 Установка режимів лічильника пачок імпульсів в MK AThiega48A

Переривання в MK – це програмна реакція на деякі важливі події Серед них можуть бути сигнали оповіщення від таймерів / лічильників, від каналів UART, АЦП, аналогового компаратора і тд Кожне переривання оформляється в лістингу як внутрішня функція, але з наперед заданим системним імям

На жаль, розробники компіляторів не змогли домовитися про єдиний стандарт Тому, назву < < 1SR (SIG_1NTERRUPR0) >>, що застосовується в компіляторі AVR-GCC, буде видавати помилку в компіляторі lCCAVR і навпаки Більш того, в колишніх версіях WinAVR використовувалися інші назви функцій переривання, що слід враховувати при портировании «старих» лістингів З повним списком системних переривань, застосовуваних у WinAVR-20100110, можна ознайомитися в «Бібліотечному керівництві»

На Рис 630 показані взаємозвязки в Сі-програмі з «Архітектурою-3», що використовує обробник переривань Головна її відмінність від раніше розглянутої конструкції на Рис 629 полягає в плаваючою точці виходу з основної програми Це логічно, оскільки переривання може наступити в будь-який момент часу після будь-якого з операторів «1» .. «М»

Рис 630 Структурна схема програми з «Архітектурою-3» Робота програми починається з «Оператора-1» У ньому або в кількох наступних операторах повинен бути налаштований режим переривання Для цього використовуються тексти з правих колонок Табл 611, Табл 612 Закінчуватися блок ініціалізації повинен командою «sei ()», роздільної переривання

У ході виконання програми всі активні джерела переривань непомітно прослуховуються апаратними засобами MK Якщо який-небудь з джерел «спрацював», то відразу ж буде проведений виклик обробника переривань, в даному випадку «ISR» (Interrupt Service Routines) Вихід з нього здійснюється на наступну за рахунком рядок програми Наприклад, якщо вхід до переривання був з «Оператора-3», то повернення з переривання буде на «Оператор-4»

Наочно уявити собі, як відбуваються переривання, допоможе колоритна картинка з повсякденного життя Припустимо, людина вдома, в кріслі, читає газету Задзвонив телефон, значить необхідно перервати читання, підійти до телефону, поговорити, потім повернутися назад і продовжити читання Не виключено, що телефон задзвонить ще раз і всю процедуру доведеться повторити заново

Стосовно до MK, «читання газети» – це процес послідовного виконання операторів в програмі «Дзвінок» – запит на переривання «Відповідь на дзвінок» – процедура обробки переривання «Продовження читання» – Повернення з переривання в основну програму

Як відомо, після початкового рестарту MK компілятор AVR-GCC забороняє всі переривання Проводячи аналогію, можна сказати, що перед читанням газети телефон був вимкнений з розетки Однак його в будь-який момент можна включити назад, якщо очікується важливий дзвінок Точно так само і в MK існують системна функція «sei ()», яка оперативно включає (дозволяє) переривання

«Архітектура-4» (системні і зовнішні функції)

Зовнішні функції за структурою аналогічні внутрішнім функцій, але оскільки вони оформляються у вигляді одного або декількох окремих файлів, то мають особливості компіляції Взаємозвязки показані на Рис 631

Рис 631 Структурна схема програми з «Архітектурою-4» Головний файл «examplec» містить функцію «main», що і визначає його верховенство Зовнішній файл «патес» починається з власного заголовка, в якому, як і належить, перераховуються бібліотеки, змінні, константи, макроозначення

Звязок між функціями файлів «examplec» і «патес» здійснюється за допомогою ключового слова «extern» в третьому зверху рядку головний програми Це скорочення від англ EXTERNal – «зовнішній, зовнішній»

Зовнішніх файлів, як і зовнішніх функцій, може бути декілька Наприклад, в одному з них зберігаються функції введення даних, в іншому – виведення сигналів, в третьому – індикації РКІ і тд Надалі дрібні зовнішні файли можуть бути обєднані в користувальницькі бібліотеки для швидкої збірки великих за обсягом проектів

Змінні, що використовуються в різних зовнішніх файлах, можна зробити загальними знову-таки через «магічне» слово «extern» Інший варіант – створити власний заголовний файл з розширенням « H», в якому будуть перераховані прототипи функцій, загальні змінні і тд Якщо лістинг складається з декількох сотень або тисяч рядків, то такий підхід є єдино правильним

Джерело: Рюмік, С М, 1000 і одна мікроконтролерна схема Вип 2 / С М Рюмік – М: ЛР Додека-ХХ1, 2011 – 400 с: Ил + CD – (Серія «Програмовані системи»)