Розглянемо практичні варіанти використання зовнішніх переривань МК.
1. Використання переривання для роботи з кнопками.
2. Використання переривання для реагування на зовнішній сигнал.
В принципі обидва варіанти схожі (по суті, спрацювання кнопки і є зовнішній сигнал). Проте ми розглянемо їх як варіанти використання різних типів зовнішніх переривань. Адже в МК АВР існує два типи зовнішніх переривань.
1. Переривання типу INT - генерується при поданні на вхід зовнішнього переривання (позначається в даташитах як INT0, INT1 і. т. д) визначеного сигналу (наприклад при наявності низького рівня, переходу з високого рівня в низький (спадання сигналу) чи навпаки (наростання сигналу)). Вид сигналу, що викликає переривання настроюється за допомогою керуючих регістрів. Входів, що підтримують ці переривання може бути декілька, але кожному з них буде відповідати своє переривання.
2. Переривання типу PCIE - генерується при будь-якій зміні рівня на любому з виводів, що підтримують таке переривання (позначається в даташитах як PCINT0,PCINT1 і. т. д). Зазвичай переривань такого типу э 1-2, а виводів, що пыдтримують його - багато. Таким чином одне переривання стосується групи виводів і МК в момент виникнення переривання "не знає", сигнал на якому саме виводі його спричинив.
Таким чином, для опитування кнопок краще використати переривання PCIE, що викликається групою виводів, до яких приєднані кнопки. При натисканні будь-якої кнопки, або відпусканні вже натиснутої буде виконане переривання, в обробнику переривань зчитуємо значення порта вводу, що відповідає виводам до яких приєднані кнопки. Таким чином, не потрібно буде кожен раз проводити зчитування в основному циклі програми.
Якщо ж стоїть завдання забезпечення реакції програми на певний зовнішній сигнал (наприклад на зростаючий фронт вхідного імпульсу) то необхідно використовувати переривання типу INT.
Розглянемо практичну реалізацію опитування кнопок в перериванні.
Напишемо програму, яка буде виводити в порт А певне число. При натисканні кнопки S1 число збільшується на 1, при натисканні S2 - зменшується. Натискання кнопок обробляємо в перериванні.
Тут слід зауважити, що явище "дрижання" контактів кнопки при спрацюванні буде викликати багаторазове виникнення переривання. Щоб уникнути цього можна застосувати вже показаний раніше програмний метод (або ігнорувати після першого спрацювання наступні зміни стану входів на протязі певного часу, або взагалі заборонити переривання PCIE на цей самий час).
Розглянемо безпосередньо порядок налаштування переривання. У різних МК АВР різний набір переривань і відповідно, регістрів для їх налаштування. Докладніше про конкретну модель можна дивитися в даташитах або в книзі Евстифеєва. Я розгляну МК, що встановлений на моїй макетці - ATTiny 26.
По перше, слід дозволити відповідне зовнішнє переривання за допомогою запису 1 у потрібний біт регістра GIMSK (General Interrupt Mask Register). У ATTiny 26 це біти 6(INT0), 5(PCIE1), 4(PCIE0).
Тут э один нюанс - хоча бітів, що стосуються переривань типу PCIE два (PCIE0 і PCIE1), МК ATTiny 26 має лише одне переривання PCIE, а біти відповідають лишень за групи виводів, сигнали на яких спричиняють переривання.
Отже:
1. При встановленні біта 4 регістра GIMSK (PCIE0) у 1 дозволяється виклик зовнішнього переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB0, PB1, PB2, PB3.
2. При встановленні біта 5 регістра GIMSK (PCIE1) у 1 дозволяється виклик зовнішнього переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB4, PB5, PB6, PB7, PA3, PA6, PA7.
3. При встановленні біта 6 регістра GIMSK (INT0) у 1 дозволяється виклик зовнішнього переривання INT0 при певному виді сигналу на виводі INT0 (PB6). Умова генерацій переривання (вид сигналу) налаштовується додатково за допомогою регістра MCUCR.
По друге, при використанні переривання INT0 слід налаштувати умову його генерації. Для цього, як уже вказувалося використовуємо регістр MCUCR, а точніше його біти 0 (ISC00) і 1 (ISC01). Інші біти даного регістра не стосуються зовнішніх переривань, але можуть використовуватись при налаштуванні інших переривань.
Тут налаштування виглядатиме таким чином:
Для МК ATTiny 26 недоступні налаштування переривання типу PCIE, крім вибору групи виводів, що спричиняє це переривання. В деяких інших МК існують додаткові регістри налаштувань переривання PCIE (PCMSK), зхміною значень яких можна вибрати конкретні виводи, що будуть генерувати переривання PCIE.
По перше, слід дозволити відповідне зовнішнє переривання за допомогою запису 1 у потрібний біт регістра GIMSK (General Interrupt Mask Register). У ATTiny 26 це біти 6(INT0), 5(PCIE1), 4(PCIE0).
Тут э один нюанс - хоча бітів, що стосуються переривань типу PCIE два (PCIE0 і PCIE1), МК ATTiny 26 має лише одне переривання PCIE, а біти відповідають лишень за групи виводів, сигнали на яких спричиняють переривання.
Отже:
1. При встановленні біта 4 регістра GIMSK (PCIE0) у 1 дозволяється виклик зовнішнього переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB0, PB1, PB2, PB3.
2. При встановленні біта 5 регістра GIMSK (PCIE1) у 1 дозволяється виклик зовнішнього переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB4, PB5, PB6, PB7, PA3, PA6, PA7.
3. При встановленні біта 6 регістра GIMSK (INT0) у 1 дозволяється виклик зовнішнього переривання INT0 при певному виді сигналу на виводі INT0 (PB6). Умова генерацій переривання (вид сигналу) налаштовується додатково за допомогою регістра MCUCR.
По друге, при використанні переривання INT0 слід налаштувати умову його генерації. Для цього, як уже вказувалося використовуємо регістр MCUCR, а точніше його біти 0 (ISC00) і 1 (ISC01). Інші біти даного регістра не стосуються зовнішніх переривань, але можуть використовуватись при налаштуванні інших переривань.
Тут налаштування виглядатиме таким чином:
Біти
|
Умова генерації переривання INT0
|
|
ISC01
|
ISC00
|
|
0
|
0
|
По НИЗЬКОМУ рівні на виводі INT0
|
0
|
1
|
При будь-якій зміні рівня
на виводі INT0
|
1
|
0
|
По спадаючому фронту сигналу на виводі INT0 (перехід з 1 в 0)
|
1
|
1
|
По зростаючому фронту сигналу на виводі INT0 (перехід з 0 в 1)
|
Для МК ATTiny 26 недоступні налаштування переривання типу PCIE, крім вибору групи виводів, що спричиняє це переривання. В деяких інших МК існують додаткові регістри налаштувань переривання PCIE (PCMSK), зхміною значень яких можна вибрати конкретні виводи, що будуть генерувати переривання PCIE.
Ну і, безпосередньо перед початком головного циклу необхідно глобально дозволити переривання командою SEI. (встановлює флаг I регістра SREG).
ОБидва зовнішніх переривання встановлюють флаги (за виключенням випадку INT0 по низькому рівню ), тобто навіть при заборонених перериваннях флаг I регістра SREG = 0 флаг буде встановлено, і після дозволу переривань (командою SEI) виконається обробник переривання. В МК ATTiny 26 ці флаги містяться в регістрі GIFR.
Флаги скидаються апаратно при запуску підпрограми обробника відповідного переривання, або примусово, ЗАПИСОМ "1" У ВІДПОВІДНИЙ БІТ РЕГІСТРА!!!
У ВИПАДКУ НАЛАШТУВАННЯ INT0 по низькому рівню, переривання буде генеруватися весь час, поки на виводі INT0 присутній низький рівень!!! (звичайно, якщо це переривання дозволене). Тобто, обробник переривань буде виконуватися після кожної команди головного циклу!!! Слід пам'ятати про це і обережно користуватися таким перериванням.
Повернемось до практичної реалізації опитування кнопок. До виводів порта А приєднаємо аноди семисегментного індикатора, любий з катодів - до "маси" (GND). Ми будемо виводити в порт числа від 0 до 9, перекодовані у семисегментний код. Підпрограму перекодування використаємо з попередніх прикладів. В головному циклі буде виконуватись тільки перекодування значення регістра (назвемо його outdigit) в семисегментний код і вивід його у порт А.
Налаштуємо переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB0, PB1, PB2, PB3 (як раз сюди приєднані кнопки 1...4).
У обробнику переривання PCIE виконуємо перевірку значення 0 і 1 бітів порта Б (нагадую що зчитування відбувається з регістра PINB). В залежності чи натиснута кнопка 1 чи 2 виставляємо флаги 0 чи 1 у регістрі keyflag (програма виконана по архітектурі "флагового автомата"), у випадку натиснутої кнопки ініціалізується програмний таймер затримки для придушення "дрижання контактів" і забороняється переривання PCIE.
Повернемось до практичної реалізації опитування кнопок. До виводів порта А приєднаємо аноди семисегментного індикатора, любий з катодів - до "маси" (GND). Ми будемо виводити в порт числа від 0 до 9, перекодовані у семисегментний код. Підпрограму перекодування використаємо з попередніх прикладів. В головному циклі буде виконуватись тільки перекодування значення регістра (назвемо його outdigit) в семисегментний код і вивід його у порт А.
Налаштуємо переривання PCIE при будь-якій зміні стану (перехід з 0 в 1 чи навпаки) любого з виводів PB0, PB1, PB2, PB3 (як раз сюди приєднані кнопки 1...4).
У обробнику переривання PCIE виконуємо перевірку значення 0 і 1 бітів порта Б (нагадую що зчитування відбувається з регістра PINB). В залежності чи натиснута кнопка 1 чи 2 виставляємо флаги 0 чи 1 у регістрі keyflag (програма виконана по архітектурі "флагового автомата"), у випадку натиснутої кнопки ініціалізується програмний таймер затримки для придушення "дрижання контактів" і забороняється переривання PCIE.
Код прошивки на асемблері можна скачати ТУТ
Як бачимо, виконуваний код програми починається з директив.cseg і .org0, яка вказує компілятору на необхідність розміщення наступної команди по нульовій адресі програмної памяті.
Потім іде таблиця векторів переривань, вже розглянута у теоретичній частині (попередній пост). У частину ініціалізації крім стеку і портів додалася ініціалізація переривання PCIE зміною значень регістра GIMSK. Перед початком головного циклу вмикаємо глобальний дозвіл переривань командою SEI.
В головному циклі виконуємо процедури перевірки флагів натиснутих кнопок (флаговий автомат), в залежності від стану флагів запускаємо підпрограми інкременту/декременту числа, виклик підпрограми перекодування і вивід значення у портА. Також запускаємо підпрограму обробки програмного таймера для придушення дрижання контактів (затримка на дозвіл переривання PCIE після натискання кнопок ВВЕРХ або ВНИЗ).
Підпрограми декременту/інкременту числа схожі, в них крім безпосередньо дій з числом виконуються також перевірки для уникнення виходу числа з діапазону 0...9.
Підпрограма перекодування числа у семисегментний код взята з попередніх програм.
Програмний таймер затримки виконаний трьохбайтним. Насправді, для нього стало і 2-ох байтного (до 65536), проте я підбирав число циклів затримки дослідним шляхом, починаючи від 100000. При вказаному числі у 50000 (timdelay=50000) не спостерігається "запізнення" чи неспрацювання при повторному натисканні кнопок і в той же час, ефект "дрижання" успішно придушується. Принцип обробки програмного таймера аналогічний до розглянутого у попередніх експериментах, проте перевірки на 0 тепер виконуються для кожного байта таймера (якщо всі три байта рівні 0 то таймер відпрацював). При умові відпрацювання таймера, виконується переініціалізація переривання PCIE, якщо ж змінна програмного таймера не рівна 0, то виконується її декрементування (віднімання 1 від багатобайтного числа вже розглядалося).і повернення до основного циклу програми. (для збільшення швидкодії можна було б ще ввести флаг спрацювання таймера, і перевіряти його в головному циклі, щоб не виконувати кожен раз перевірку трьох байтів на нульове значення). Таким чином, після натискання кнопки переривання буде заборонене на протязі 50000 циклів головної програми.
Після підпрограм розміщуються обробники переривань. В принципі обробник написаний тільки для потрібного переривання PCIE, інші ж - це просто "заглушки" з однієї команди повернення з обробника. Вони потрібні по перше тому що мітки їх об'явлені у таблиці векторів переривань, по друге - раптом виникне якесь інше переривання (наприклад при помилках в настройках :-)).
Розглянувши обробник переривання PCIE бачимо на початку процедуру збереження SREG в стек:
in inttemp,sreg; копіюємо значення sreg в регістр inttemp
push inttemp; зберігаємо в стек
а перед виходом з обробника - зворотню процедуру відновлення значення SREG зі стеку:
pop inttemp; Завантажуємо зі стека збережене значення sreg в регістр inttemp
out sreg,inttemp; Виводимо значення inttemp в sreg.
Необхідність цих дій описана у теоретичній частині, адже в нашому обробнику переривань змінюються флаги регістра SREG (по перше командами порівняння, по друге - арифметичними операціями), а в основній програмі є команди, які працюють з SREG (наприклад двохбайтне додавання в підпрограмі перекодування числа в семисегментний код). І якщо переривання виникне мід двома складовими цієї операції - ми матимемо на виході зовсім не правильний результат.
Прошиємо контролер і спробуємо проекспериментувати.(я покажу підбір затримок для придушення "дрижання контактів кнопок").
В головному циклі виконуємо процедури перевірки флагів натиснутих кнопок (флаговий автомат), в залежності від стану флагів запускаємо підпрограми інкременту/декременту числа, виклик підпрограми перекодування і вивід значення у портА. Також запускаємо підпрограму обробки програмного таймера для придушення дрижання контактів (затримка на дозвіл переривання PCIE після натискання кнопок ВВЕРХ або ВНИЗ).
Підпрограми декременту/інкременту числа схожі, в них крім безпосередньо дій з числом виконуються також перевірки для уникнення виходу числа з діапазону 0...9.
Підпрограма перекодування числа у семисегментний код взята з попередніх програм.
Програмний таймер затримки виконаний трьохбайтним. Насправді, для нього стало і 2-ох байтного (до 65536), проте я підбирав число циклів затримки дослідним шляхом, починаючи від 100000. При вказаному числі у 50000 (timdelay=50000) не спостерігається "запізнення" чи неспрацювання при повторному натисканні кнопок і в той же час, ефект "дрижання" успішно придушується. Принцип обробки програмного таймера аналогічний до розглянутого у попередніх експериментах, проте перевірки на 0 тепер виконуються для кожного байта таймера (якщо всі три байта рівні 0 то таймер відпрацював). При умові відпрацювання таймера, виконується переініціалізація переривання PCIE, якщо ж змінна програмного таймера не рівна 0, то виконується її декрементування (віднімання 1 від багатобайтного числа вже розглядалося).і повернення до основного циклу програми. (для збільшення швидкодії можна було б ще ввести флаг спрацювання таймера, і перевіряти його в головному циклі, щоб не виконувати кожен раз перевірку трьох байтів на нульове значення). Таким чином, після натискання кнопки переривання буде заборонене на протязі 50000 циклів головної програми.
Після підпрограм розміщуються обробники переривань. В принципі обробник написаний тільки для потрібного переривання PCIE, інші ж - це просто "заглушки" з однієї команди повернення з обробника. Вони потрібні по перше тому що мітки їх об'явлені у таблиці векторів переривань, по друге - раптом виникне якесь інше переривання (наприклад при помилках в настройках :-)).
Розглянувши обробник переривання PCIE бачимо на початку процедуру збереження SREG в стек:
in inttemp,sreg; копіюємо значення sreg в регістр inttemp
push inttemp; зберігаємо в стек
а перед виходом з обробника - зворотню процедуру відновлення значення SREG зі стеку:
pop inttemp; Завантажуємо зі стека збережене значення sreg в регістр inttemp
out sreg,inttemp; Виводимо значення inttemp в sreg.
Необхідність цих дій описана у теоретичній частині, адже в нашому обробнику переривань змінюються флаги регістра SREG (по перше командами порівняння, по друге - арифметичними операціями), а в основній програмі є команди, які працюють з SREG (наприклад двохбайтне додавання в підпрограмі перекодування числа в семисегментний код). І якщо переривання виникне мід двома складовими цієї операції - ми матимемо на виході зовсім не правильний результат.
Прошиємо контролер і спробуємо проекспериментувати.(я покажу підбір затримок для придушення "дрижання контактів кнопок").
Використання переривання типу INT для реагування на зовнішній сигнал.
Розглянемо другу задачу - використання переривання типу INT. Нехай, при певному сигналі, що приходить на вхід INT0 МК будемо засвічувати на 0,25с світлодіод, підключений до виводу 0 порта А, а також виводити короткий звуковий сигнал на "пищалку", підключену до виводу 1 порта А (через підсилювач на транзисторі). Для подання сигналу використаємо датчик Холла (реагує на магнітне поле) від комп'ютерного вентилятора. Вибір датчика обумовлений відсутністю ефекту "дрижання контактів", також я спробую використати щілинний оптичний датчик. "Пищалка" - динамік від комп'ютерного корпуса, або малогабаритний з комплекту материнської плати, або будь-який інший з опором від 8 до 100 ом. Можна спробувати також п'єзодинамік (такі використовувалися у електронних годинниках), але скоріше за все рівень звукового сигналу з таким випромінювачем буде низький, так як для спрощення програми частота сигналу буде складати приблизно 1000 Гц, а "п'єзотаблетки" добре відтворюють сигнал від 3000-5000 Гц.
"Виготовлення" датчиків
1. Датчик Холла
Беремо старий вентилятор від комп'ютера. Підійде як процесорний кулер так і вентилятори від блока живлення/корпуса. Вентилятор повинен бути робочим. Я використав старий кулер, який сильно шумів внаслідок зносу втулок в яких обертається вал крильчатки.
Відламуємо (відкручуємо) вентилятор
Ззаду бачимо наклейку, знімаємо її і резинову пробку
Піддіваємо тонкою викруткою фторопластову шайбу/фіксатор і знімаємо її з вала
Виймаємо крильчатку.
Варварськи видираємо обмотки і плату з корпуса :-). На платі бачимо той самий датчик Холла, не пошкодьте під час демонтажу
От і він
Насправді це мікросхема, яка крім датчика Холла містить ще силові ключі для комутації обмоток і, ймовірно тригер. Має 2 вихода, які є інверсними - коли один ключ ввімкнений, інший розімкнутий і навпаки. Логіка роботи - при піднесенні магніта північним полюсом вмикається ключ 1, південним - ключ 2. При відсутності магнітного поля залишається відкритим останній ввімкнутий ключ (тому і думка про тригер) У старих вентиляторах можна зустріти окремо датчик і силові ключі на транзисторах.
Змальовуємо розпайку датчика, відмічаючи на які ножки подається + і -, інші 2 ножки - виводи ключів.
Випаюємо датчик.
2. Оптичний щілинний датчик
Оптичний щілинний датчик складається зі світлодіода (в основному інфрачервоного) і фототранзистора (відкривається при попаданні світла на чутливий елемент). У вихідному стані світлодіод світить на фототранзистор і він відкритий, при введенні непрозорого предмету в щілину датчика світловий потік переривається і транзистор закривається. Можна купити оптичний датчик типу HINT-2600 чи подібний (наприклад
Я ж знайду такий датчик у купі старих деталей відл різної електронної техніки :-). Найчастіше оптичні датчики можна знайти у принтерах. Там вони використовуютьтся як датчик наявності паперу в лотку, закриття кришки чи положення інших механічних частин. Я взяв з Canon Ip1800 (дешманський "одноразовий" принтер, цына комплекту картриджыв до якого дорывнюэ цыны нового принтера, тому після відмови катриджів (звичайно катриджі заправляються) просто купляється новий принтер). Бачимо дачтики на окремих платах
З розпайкою виводів проблем немає - на датчику є значок діода (це світлодіод)
По розводці доріжок бачимо, що катод (-) світлодіода з'єднаний з одним з виводів фототранзистора. Це емітер.
Замальовуємо розпайку виводів
Випаюємо датчик
Зкомпонуємо схему з двох датчиків. Ключі датчика Холла виконані зі спільним емітером, тобто при відкритті замикають вихід на землю (-). В навантаження ключам поставимо два червоних світлодіода з струмообмежуючими резисторами.
Для оптичного датчика слід підібрати струмообмежуючий резистор для світлодіода. Згідно моїх експериментів, для надійного відкриття фототранзистора (напруга на колекторі не перевищує 1,2в, що буде однозначно сприйматися МК як лог.0), струм через світлодіод повинен складати близько 10мА. При струмі в 5 мА транзистор повністю не відкривався (напруга на колекторі складала 2,6-2,7В). Тому струмообмежуючий резистор може бути в межах 430 - 510 ом. Резистор навантаження в колі колектора фототранзистора може бути від 3 кОм до 6 кОм, його значення в цих межах практично не впливає на напругу на колекторі у відкритому стані.
Зпаюємо усе на макетній платі
Кінці дротів оснажені контактними штирьками, що будуть підключатися у роз'єми на платі з МК.
З'єднання на макетній платі з МК
Плату з датчиками слід приєднати до точок живлення (земля є біля кожного з виводів портів, +5В я додатково допаяв роз'єми на макетку) і до виводу INT0 (PB6) (будемо почергово під'эднувати магнітний датчик і оптичний). В роз'єм РА0 вставляємо світлодіод. В роз'єм РА1 вмикаємо базу одного з транзисторів, розпаяних на платі (використовувались у експериментах з динамічною індикацією). Вивід колектора через резистор на 51...100 Ом з'єднуємо з одним з виводів динаміка, другий вивід під'єднуємо до +5В.
Програма МК
Для реалізації програми потрібно провести налаштування переривання INT0, наведеним вище способом. Значення відповідних бітів MCUCR будемо змінювати перед прошивкою, таким чином перевіримо усі можливі варіанти переривання INT0.
Основний цикл програми в даному випадку не буде містити ніяких команд, усе виконаємо в обробнику переривання (для демонстрації, в реальних проектах не слід робити подібні речі, обробник переривань має бути якомога коротшим). Єдине, що нам буде потрібне - підпрограма часової затримки з попередніх проектів.
Для виводу звукового сигналу частотою 1кГц будемо циклічно змінювати стан РА1 з 0 на 1. Період зміни становитиме 1/1000с = 1 мс. Насправді це буде виглядати таким чином - встановлюємо лог 1 - затримка 0,5мс - встановлюємо лог. 0 - затримка 0,5 мс. Кількість циклів - 250, що дасть нам час звучання сигналу 0,25с. Перед виконанням циклу засвічуємо світлодіод, подаючи лог. 1 на РА0, після завершення циклу - гасимо його обнулюючи РА0.
Скачати асемблерний код можна ТУТ
Як бачимо, початок програми з таблицею векторів переривань залишається аналогічним до попередньої, відрізняється лише частина ініціалізації переривання. Тепер значення регістра GIMSK відповідає дозволу переривання INT0 і додалася ініціалізація регістра MCUCR (налаштування сигналу, при якому відбудлеться переривання). Так як регістр MCUCR містить біти, які стосуються не тільки переривання INT0, я спочатку зчитую існуюче значення цього регістра, а потім змінюю тільки 0-ий і 1-ий біт. Взагалі для зміни конкретних бітів можна використати команди SBI та CBI, я зробив інакше тільки з метою прискорення змін в програмі в процесі експерименту. Основний цикл програми містить тільки команду зациклення.
У обробниках переривань тепер "заглушки" використані для усіх переривань крім INT0. Обробник INT0 описаний вище і не містить якихось особливостей.
Прошиваємо МК і перевіряємо роботу з різними датчиками. Також будемо змінювати значення MCUCR і після перепрошивки оцінимо результати роботи з кожним видом сигналу.
Отже ми розглянули один вид переривань, що часто зустрічаються в проектах на мікроконтролерах. Наступна стаття буде присвячена ще одній темі, без якої не обходиться ні один більш менш серйозний проект - це використання апаратних таймерів. Можливо цьому питанню доведеться присвятити і не одну статтю, так як таймери досить багатофункціональні. До зустрічі!
У обробниках переривань тепер "заглушки" використані для усіх переривань крім INT0. Обробник INT0 описаний вище і не містить якихось особливостей.
Прошиваємо МК і перевіряємо роботу з різними датчиками. Також будемо змінювати значення MCUCR і після перепрошивки оцінимо результати роботи з кожним видом сигналу.
Отже ми розглянули один вид переривань, що часто зустрічаються в проектах на мікроконтролерах. Наступна стаття буде присвячена ще одній темі, без якої не обходиться ні один більш менш серйозний проект - це використання апаратних таймерів. Можливо цьому питанню доведеться присвятити і не одну статтю, так як таймери досить багатофункціональні. До зустрічі!
Немає коментарів:
Дописати коментар