Безкоштовна технічна бібліотека ЕНЦИКЛОПЕДІЯ РАДІОЕЛЕКТРОНІКИ ТА ЕЛЕКТРОТЕХНІКИ Модульне програмування систем управління MCS48. Енциклопедія радіоелектроніки та електротехніки Енциклопедія радіоелектроніки та електротехніки / Мікроконтролери Відомо, що той самий мікроконтролер може керувати як складним технологічним обладнанням, так і побутовою кавомолкою або електронним годинником. Адаптація до конкретного об'єкта здійснюється зміною програми мікроконтролера, апаратні засоби майже не торкаються. Пропонована стаття присвячена прийомам програмування мікроконтролерів серії МСS48, які широко використовуються в системах управління різного призначення. Її основні положення справедливі й у більш сучасних приладів. Розробка та модернізація програм управління значно полегшуються, якщо будувати їх за модульним принципом. В цьому випадку після накопичення деякого досвіду, а головне - власної бібліотеки налагоджених модулів, програмування нової системи управління (СУ) зводиться до заміни деяких модулів вже діючої та налагодженої програми та, можливо, доповнення її фрагментами, що враховують особливості конкретної системи. Цей принцип закладено у структуру багатьох мов високого рівня (PASCAL, C++), і програміст буквально змушений його слідувати. На жаль, асемблери (у тому числі для МСS48), надаючи програмісту велику свободу вибору засобів і методів вирішення завдань, як правило, зовсім не стежать за дотриманням дисципліни програмування. Це нерідко призводить до створення настільки заплутаних програм, що навіть їхні автори не можуть через деякий час розібратися в тому, що було зроблено, не кажучи вже про використання налагоджених фрагментів в інших програмах. Свідоме дотримання загальних модульних концепцій значно полегшує та прискорює програмування мікроконтролерів. Приклад типової модульної програми для СУ наведено у таблиці. Її синтаксис відповідає табличному асемблеру ТАSМ у варіанті для мікропроцесора 8048. Як бачимо, на початку тексту програми директивами ЕQU константам даються імена і присвоюються значення. Користуватися іменованими константами завжди краще, ніж вказувати числові значення у виконуваних командах процесора. Наприклад, витримка часу, що реалізується однією з підпрограм, що розглядаються нижче, визначається трьома числами. Вони задані константами N1, N2 та N3. Якщо потрібно змінити витримку .достатньо в операторах ЕQU вказати нові значення. В іншому випадку довелося б розшукувати у всій програмі команди з операндами, рівними цим числам, вирішувати, чи кожна з них відноситься до витримки часу, і в потрібних випадках вказувати нові значення. Очевидно, що така робота вимагає багато часу і часто не обходиться без помилок. Особливо ускладнює її те, що в деяких командах може використовуватися не число цілком, а, наприклад, його старший чи молодший байт. АССЕМБЛЕР вже на етапі трансляції програми здатний обчислити деякі константи, зважаючи на значення інших. Цю можливість ілюструє обчислення старшого (NЗН) та молодшого (N3L) байтів числа N3. Далі у програмі виділяють пам'ять для змінних. Роблять це тими самими директивами ЕQU, але на відміну описів констант задають не числові значення змінних, а адреси осередків пам'яті. Якщо дозволяє АССЕМБЛЕР, не слід нехтувати можливістю використання макрокоманд. Кожна з них є як би новою командою, що виконує операцію, прямо не передбачену системою команд процесора. Описуючи макрокоманду, програміст дає їй ім'я (звісно, що не збігається з ім'ям жодної з "справжніх" команд) і задає необхідні дії у вигляді Послідовності машинних команд. Щоразу, зустрівши макрокоманду у програмі, АССЕМБЛЕР замінить її зазначеною послідовністю. У прикладі Використовуються дві макрокоманди. Один із них пересилає вміст акумулятора в задану параметром макрокоманди осередок пам'яті даних, іншу - назад. Після ввімкнення живлення (або подачі сигналу скидання) мікроконтролер починає виконувати програму з нульової адреси. За цією адресою зазвичай записують команду безперечного переходу на дійсну точку початку програми (у даному випадку, на мітку START). Це необхідно тому, що апаратні переривання завжди передають управління за фіксованими адресами 3 і 7 (у мікроконтролерів інших типів адреси можуть бути іншими, але все одно вони розташовані на початку пам'яті програм). Команди безумовного переходу на підпрограми обслуговування відповідних переривань, що знаходяться за цими адресами, основна програма повинна "обійти". Наступний етап - встановлення режимів роботи контролера (наприклад, вибір банків пам'яті та регістрів), ініціалізація змінних та зовнішніх пристроїв. Типова помилка програмістів-початківців - вважати, що відразу після пуску програми змінні вже мають якісь певні значення. Зміцненню цієї помилки сприяє передбачене в деяких мовах високого рівня (наприклад, BASIC) автоматичне присвоєння всім змінним початкового нульового значення. У програмах мовою АССЕМБЛЕРа (і багатьох інших мовах) програміст повинен сам подбати, щоб до першого зчитування значення змінної у відведений їй осередок пам'яті вже було щось записано. Хороший стиль програмування вимагає, щоб початкові значення були присвоєні змінним на початку роботи програми. В цьому випадку це робить підпрограма 1INIT. Розділ ініціалізації зовнішніх пристроїв зазвичай виглядає як почерговий виклик підпрограм, кожна з яких призводить до вихідного стану одного з них (аналого-цифровий перетворювач, світлодіодний індикатор, кнопковий пульт тощо) і може бути легко замінена при доробці та вдосконаленні системи. Нерідко ці підпрограми перевіряють працездатність пристроїв. Далі більшість керуючих програм входить у основний цикл, що нескінченно повторюється, виконання якого припиняється тільки для обробки переривань. Цикл складається з підпрограм опитування клавіатури та інших датчиків, перевірки прапорів, що виставляються підпрограмами обробки переривань (наприклад, прапора закінчення заданого інтервалу часу або закінчення роботи аналого-цифрового перетворювача), обробки інформації, що надійшла відповідно до заданого алгоритму управління, виведення керуючих впливів на виконавчі пристрої виведення інформації про стан технологічного процесу на рідкокристалічне табло або інші індикатори Вихід із основного циклу зазвичай передбачається лише в аварійних ситуаціях, наприклад, якщо для ліквідації наслідків збою необхідно повторити ініціалізацію всіх змінних та зовнішніх пристроїв, а також при обробці переривань. Таким чином, програма, побудована за модульним принципом, представляє собою набір підпрограм. Якщо нова СУ застосована, наприклад, інша клавіатура, досить буде замінити підпрограму BUTT. Для того щоб така заміна була простою і безболісною, слід виробити і завжди дотримуватись певних правил. Підпрограми, по можливості, повинні зберігати вміст всіх регістрів контролера, отримувати вихідні дані і видавати результати роботи в одних і тих же регістрах і осередках пам'яті, користуватися одним і тим самим кодуванням символів і т.п. Слід боротися з природним (особливо для програмістів, які подолали перші труднощі та починають відчувати себе професіоналами) прагненням спростити програму за рахунок відходу від суворих правил та застосування нестандартних прийомів. Здається, невиправданим ускладнення цілком окупиться полегшенням налагодження та переробки програми в цілому. Розглянемо деякі особливості підпрограм. I NCREM і DЕСRЕМ виконують необхідні операції операції збільшення або зменшення на задану величину 16-розрядного двійкового числа (його старший і молодший байти знаходяться відповідно в регістрах R6 і R5). Константи, що задають величину збільшення, описані на початку програми. Так як будь-який мікроконтролер працює значно швидше за технологічне обладнання, дуже важливо вміти організовувати в програмі витримку часу. У цьому випадку використано внутрішній лічильник/таймер процесора. Він має обмежену ємність і переповнюється за час, що вимірюється мілісекундами. Кожне переповнення генерує запит переривання. Підпрограма обслуговування переривань від таймера (TIME) підраховує їх і при досягненні заданого числа надає поодиноке значення прапору закінчення часу FLT. Всім підпрограмам, робота яких залежить від часу, залишається аналізувати стан цього прапора. Так вдається реалізувати витримки за кілька секунд і навіть хвилин. Для того щоб почати відлік нового інтервалу, необхідно занести вихідні значення до робочих осередків підпрограми TIME і включити таймер. Підпрограма SET2М, наприклад, визначає витримку часу, рівну 2 хв. Розрахунок вихідних значень має кілька тонкощів. Відомо, що в мікроконтролерах серії МСS48 на вхід внутрішнього лічильника/таймера імпульси надходять із частотою, у 480 разів меншою за частоту кварцового генератора. Наприклад, при частоті кварцового резонатора 7 МГц число, записане в лічильник, змінюється кожні 480/7000000 = 0,00006857 = 68,57 мкс. Так що лічильник переповниться (і буде сформований запит переривання) через 68,57-(256-N1) мкс, де N1-число, спочатку записане в лічильник. Якщо щоразу починати новий рахунок із цього числа, то за 0,1 с (мінімальна витримка часу) відбудеться N2 = 0,1 · 7000000/[1480 · (256-N1)] переповнень. Очевидно, ту саму витримку часу можна отримати при різних N1 і N2, але так як ці числа не можуть бути дробовими, вона буде реалізована з деякою помилкою. Завдання полягає у підборі такої пари значень, у яких помилка мінімальна. У цьому випадку найкращий варіант N1 = 13, N2 = 6, Витримка часу, що дорівнює 2 хв, виходить повторенням описаної процедури N3 = 1200 разів. Часто буває необхідно в різних режимах роботи програми застосовувати різні процедури обробки тих самих апаратних переривань. Один із способів зробити це ілюструє підпрограму INTER. Вона аналізує код типу переривання, занесений основною програмою в комірку INTT, і в залежності від його значення викликає одну з підпрограм обслуговування переривання ISR1 або ISR2. Зауважимо, що обидві вони закінчуються командою RET, а не RETR. Число варіантів обробки неважко збільшити і навіть зробити так, що при деякому значенні коду викликатимуться одна за одною різні підпрограми. Не обов'язково записувати всі необхідні підпрограми в текстовий файл основної програми. Налагоджені та неодноразово використані в різних програмах модулі можуть знаходитись в окремих файлах та підключатися до основної програми директивами INCLUDE. Кожен файл може містити одну або кілька підпрограм. Недолік такого способу полягає в тому, що імена змінних, констант і міток у всіх модулях не повинні повторюватися. Позбавлений цього дефекту метод роздільної трансляції модулів з наступним об'єднанням їх на рівні об'єктного коду, на жаль, не підтримується асемблером ТАSМ. Автор: Д.Рижов, м.Володимир Дивіться інші статті розділу Мікроконтролери. Читайте та пишіть корисні коментарі до цієї статті. Останні новини науки та техніки, новинки електроніки: Запрацювала найвища у світі астрономічна обсерваторія
04.05.2024 Управління об'єктами за допомогою повітряних потоків
04.05.2024 Породисті собаки хворіють не частіше, ніж безпородні
03.05.2024
Інші цікаві новини: ▪ Прилад для вимірювання характеристик діелектричних та магнітних матеріалів ▪ Пізня вечеря шкодить пам'яті Стрічка новин науки та техніки, новинок електроніки
Цікаві матеріали Безкоштовної технічної бібліотеки: ▪ розділ сайту Досліди з хімії. Добірка статей ▪ стаття Юнкер Шмідт із пістолета хоче застрелитися. Крилатий вислів ▪ стаття Офіціант. Посадова інструкція ▪ стаття Зворотний перетворювач напруги. Енциклопедія радіоелектроніки та електротехніки
Залишіть свій коментар до цієї статті: All languages of this page Головна сторінка | Бібліотека | Статті | Карта сайту | Відгуки про сайт www.diagram.com.ua |