Після попередніх глав настав час остаточно підключити зовнішні схеми до нашого мікроконтролера. Застосування зовнішніх схем, звичайно, все одно потребуватиме великих знань про ADuC 842, але вони будуть обговорюватися приємно поспіль, будуючи один на одного якомога більше.
З якими сигнальними пристроями найчастіше стикається пересічна людина? Ймовірно, світлофори. У цьому розділі ми їх змоделюємо. У цій главі вогні світлофорів представлені світлодіодами, і ми будемо використовувати фото ворота для позиціонування. Відтепер для вирішення кожного завдання завжди існує принципова схема. Підбір деталей, звичайно, не ексклюзивний; ми намагались зробити навчальну програму легкодоступною та. вибирайте дешеві елементи схеми. За винятком світлодіодів, кожен використовуваний компонент має електронний опис; вони містяться в окремому каталозі. Маючи належні знання в електротехніці, ми можемо впевнено вибирати й інші типи компонентів, нам потрібно щонайбільше змінити схему або код.
12.1. Управління світлофором
Змоделюйте основну функцію трифокусного світлофора, пов’язавши зміну кожного кольору із заздалегідь встановленим часом. [Код23, Код24]
Вирішити завдання дуже і дуже просто. Ми вмикаємо цей світлодіод, чекаємо часу для цієї фази, а потім рухаємось далі. Очікування може статися зі старою доброю підпрограмою DELAY, але давайте скористаємося перериванням лічильника інтервалу часу зараз! Вирішіть проблему, вказавши розрядні схеми та затримки, відповідальні за попереднє включення світлодіодів у пам’яті коду як дані.
Принципова електрична схема триколірної індикаторної лампи зі світлодіодами наведена в [12.2. фігура]. показано на малюнку. Баластні резистори світлодіодів можна вибирати досить вільно, тільки будьте обережні, щоб не генерувати занадто багато струму в кожній гілці. Його значення, звичайно, залежить від типів світлодіодів, але 10-15 мА зазвичай достатньо. З портів мікроконтролера ADuC 842 тепер ми могли використовувати 0 або 2. Оскільки ми до цього часу використовували порт 2 - оскільки до нього підключені маленькі світлодіоди, встановлені на панелі, давайте зараз виберемо нульовий порт! Однак будьте дуже обережні, щоб порти не могли використовуватися як активні виходи (виділено на [Рис. 12.1]). З іншого боку, за допомогою ніжок портів ми можемо без будь-яких зайвих зусиль тягнути підключені до них елементи ланцюга, оскільки ця земля є землею джерела живлення.
Конкретне призначення бітів порту 0 показано в [12.2. фігура]. Рис. 5 пов’язано з тим, що таким чином ми маємо більше місця на тестовій панелі для підключення, щоб зі смаком зіставити світлодіоди з 5-міліметровим корпусом, якщо такі використовуються. (І ми використовуємо їх у цьому підручнику.)
Зараз рішення супроводжується некласичною блок-схемою, оскільки сам код не дуже складний. Тепер цю операцію ілюструє графік переходу стану (див. [Рис. 12.3]), в якому стани позначаються вершинами графіка. Вони позначаються англійськими ініціалами кольорів, що належать до кожної фази: R - червоний, червоний; РА - червоно-бурштиновий, червоно-жовтий; A - бурштин, бурштин, G - зелений, зелений. Блоки з'єднані з вершинами на блок-схемі, показуючи кроки, що виконуються там; звичайно, тільки найважливіші з точки зору експлуатації. Переходи між станами представлені ребрами графіка, для яких ми пишемо умову переходу. Зверніть увагу, що додаткова бітова змінна в умовах завжди встановлюється на 1 за допомогою переривання, пов'язаного з лічильником інтервалів. Для кожного стану значення позначення TIC (Tn) полягає у звільненні переривання, пов’язаного з лічильником інтервалів (TIC), з часом очікування n-ї фази. Переривання наноситься окремо від графіка. (Для цього блоку ми зосереджуємось лише на біті прапора.)
Зверніть увагу, що байти даних можна писати, розділяючи їх комами, вам не потрібно всіх їх розставляти.!
Щоб зробити наступний підрозділ легшим для розуміння, ми трохи попрацюємо і покажемо інше рішення для [Завдання 16]. Принцип рішення буде практично таким же, як і раніше, тільки ми не використовуємо підрахунок інтервалів, але говоримо, що ми вибираємо 1/8 секунди як одиницю. Це встановлено на початку програми і більше не торкається. Ми робимо це, встановлюючи 1/128 с за допомогою TIMECON SFR і завантажуючи 16 в реєстр INTVAL. Це дає часовий зріз 16/128 с = 1/8 с. Ще раз підкреслимо, що ми не змінюємо підрахунок інтервалів під час роботи програми, її одиниця, іншими словами, її зріз часу, становитиме 1/8 с протягом усього запуску.
Вам потрібна змінна, за допомогою якої переривання TIC підраховує проміжок часу (рахунок). Тоді нам також потрібна змінна, в яку ми вводимо значення очікування, необхідне для кожної фази лампи, звичайно за 1/8 с одиниці (tvar). Після цього фактично все відбувається так само, як і в попередній програмі, за винятком тієї частини програми, яка обробляє переривання. Це завжди збільшує значення szaml на 1 і перевіряє, чи не досягло його значення tvar. Якщо ні, це збільшує значення підрахунку на 1. Якщо так, у нас все добре; всі малі часові інтервали необхідного очікування минули, і подальший біт можна встановити високим. Не забувайте починати змінну підрахунку з 1, оскільки при першому перериванні TIC минулий встановлений інтервал часу минув, тобто в цьому випадку 1/8 с. Модифікований графік переходу стану показаний на малюнку нижче.
Код принципу рішення, проілюстрований на малюнку вище, Code24, відрізняється від Code23 лише кількома рядками, тому в підручнику вказані лише рядки істотних відмінностей. Важливо, що в Code24 нам потрібно лише ініціалізувати лічильник інтервалів і годинник на самому початку основної програми. Після цього ми більше не будемо їх вимикати, тому немає необхідності їх перезапускати. З цієї причини нам не потрібно чекати зараз після присвоєння значень INTVAL. Повний код можна знайти в сховищі кодів.
12.2. Ще один спосіб оцінки відносин
У випадку представлених методів організації циклу (підрозділ [Розділ 8.3]), необхідно було вивчити змінну циклу у всіх випадках. Якщо вам цікаво, нуль батареї чи нуль, ви можете скористатися інструкціями JZ або JNZ. Це було більш складно, ніж це, але інструкція DJNZ також була пробита там же, тільки вона зменшує вміст даного реєстру на одиницю до іспиту. Ми змогли зробити більш вільне порівняння з інструкцією CJNE, яка дражнить, коли немає рівності. Все це добре, але чогось досі болісно не вистачає. Це робиться для оцінки того, чи є вміст одного реєстру меншим чи більшим, ніж вміст іншого реєстру. Ну, у нас немає подальших порівняльних інструкцій, але ми можемо використати такі для такого типу оцінки.
На додаток до заяви CJNE, ми можемо побачити це у багатьох резюме:
Графік переходу стану додається до рішення (див. [Рис. 12.5]), оскільки він тепер набагато інформативніший, ніж негабаритна блок-схема. Переходи, що належать до фаз лампи, розглядаються як події або натискання клавіш, що викликають зміну режимів, позначаються як різні події як події: перша - чорним, друга - червоним.
Код без підпрограми RESET128, показаний вище, знаходиться нижче. Зараз цей код досить складний, але графік переходу стану може бути чудовою підмогою, щоб уникнути його втрати в ньому. У той же час ми заспокоюємо читача; код, довший за цей, більше не відображатиметься в цьому підручнику. На початку програми, одразу після присвоєння значення реєстру INTVAL, згадуваного короткого очікування немає, оскільки незабаром після цього ми все одно викликаємо підпрограму RESET128, яка її містить; відразу на першій фазі нормальної роботи лампи. Ми не деталізуємо дані в кінці коду, оскільки вони точно такі ж, як і в Коді23. У коді ми використовуємо кольорове маркування, щоб чітко розрізнити деталі, що належать до кожного режиму.
У Code25 обробка переривань - це вже дуже складне рішення. Однак читач може виявити, що цей “центрований” стиль дещо гнітить. Немає проблем, ми показуємо інше рішення для [Проблема 17]. A [12.5. фігура]. Графік переходу стану, показаний на рисунку 1, залишається незмінним. Ключ до рішення зараз - знову витягнути стару добру підпрограму DELAY, але трохи її змінити. Тепер це буде обробляти очікування, необхідне для заданих фаз лампи, але ми включимо моніторинг прапорця натискання кнопки. Заглибтеся у внутрішній цикл, щоб якомога частіше сканувати біт. Функція переривання лічильника інтервалів тепер зменшена для усунення дрейфу. Так само, як при вирішенні [проблеми 15] (див. Кодекс22). Переривання натискання клавіші продовжується на один рядок порівняно з Code25: запускаючи лічильник інтервалів.
Підпрограма таймера призначена для виклику з точно однаковим часом очікування, як для Code24, так і для Code25. Це означає, що якщо при виклику вміст батареї становить 8, ми зачекаємо 1 секунду. Давайте розглянемо модифіковану підпрограму:
І тепер ми знову обчислюємо, скільки часу потрібно для запуску підпрограми. Візьміть значення батареї до 8! Інструкція NOP, вбудована в звичайну підпрограму DELAY, займає 1 тактовий цикл, біт JB, вбудований у підпрограму GDELAY, займає 4 реле, тоді як інструкція rel - 4. Отже, вся рутина тепер загальна
2 + (2 + (2 + (4 + 3) · 249 + 3) · 150 + 3) · 8 + 4 = 2 097 646
вимагає тактового циклу. При тактовій частоті за замовчуванням 2 097 152 Гц це означає 10002 с.
Суть теперішнього рішення полягає в тому, що підпрограма перетягування часу, якщо вона вже нічим не займається, окрім часу, добре підходить для перевірки якомога частіше, чи біт натискання клавіші (трасування) нахилений до 1. Якщо так, це негайно закінчується, і його запуск переривається. У головній програмі, після виклику підпрограми, ми вдруге перевіряємо, яке значення має біт прапора. Якщо 1, контроль повертається передчасно з підпрограми. А це означає, що ми можемо перейти до наступного режиму. У нижченаведеній програмі підпрограма, що затягує час, більше не повторюється. Також не є векторами переривань, оскільки вони залишаються незмінними.
Порівнюючи Code25 і Code26, ми бачимо, що останній дещо коротший і вимагає меншої кількості змінних. Обидва пропонують повчальне рішення, але в зовсім іншому стилі. Читачеві пропонується повністю проаналізувати та зрозуміти і те, і інше; в кожній деталі! Ви могли легко відчути набагато сильнішу симпатію до одного, ніж до іншого. Однак ваша робота - вибрати, з яким стилем ви досягнете своєї мети легше або просто елегантніше. І звичайно, читач може також реалізувати третю ідею, кардинально відмінну від двох вище, і вважати її найкращою ...
- Аварійний зарядний пристрій, акумулятор, зовнішній акумулятор ✔️ Ціни та покупка Extreme Digital
- Розділ 4 - Крок 2: Регулярне харчування
- Розділ 8 - Аналіз дерева подій (ETA)
- РОБОЧИЙ МАТЕРІАЛ. Йозеф Фаркас. Схеми для цифрових схем. Інтерпретація та підготовка принципових схем. Назва модуля вимог:
- Розділ 10: Рулон кошерної Тори