русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Системи керування.


Дата добавления: 2015-08-14; просмотров: 1006; Нарушение авторских прав


2.1 Робота із зовнішніми перериваннями МК AVR.

Переривання це подія, при якому відбувається призупинення основної програми і перехід на виконання підпрограми переривання. Щоб дізнатися, які ж є переривання в МК, необхідно відкрити Datasheet мікроконтролера та зайти на вкладку Interrupts і там на самому початку побачимо таблицю векторів переривань. Наприклад, для МК Atmega8 вона виглядає як наведено в табл.1.

У кожному векторі переривання знаходиться команда переходу з адресою початку підпрограми переривання. Будь-яка програма починається з Reset, в якому знаходиться команда переходу до блоку ініціалізації. А далі, кожне переривання налаштований на якусь подію і при спрацьовуванні цієї події програма переходить до сценарію обробки цього переривання. Видно, що кожному перериванню відповідає свій вектор переривання. Чим вище адреса переривання, тим нижчий пріоритет переривання. Тобто в черзі переривань, переривання з великим пріоритетом будуть виконуватись раніше. Якщо почалася обробка якого-небудь переривання, жодне інше переривання не може бути викликано, навіть з більшим пріоритетом. Інакше виходив би рекурсивний (нескінченний) виклик обробників переривань і складніше було б відстежити роботу програми.

При виклику обробника будь-якого переривання біт глобального дозволу переривань I регістра SREG (status register - регістр стану) скидається в "0" і тільки по завершенні обробки переривання знову встановлюється в "1" і дозволяє почати обробку наступного переривання в черзі. Щоб встановити примусово цей біт існує функція sei(), а щоб скинути - cli(). При запуску програми цей біт завжди скинутий і щоб переривання спрацьовували його потрібно встановити (викликати sei()).

Отже, у цьому параграфі нас будуть цікавити тільки зовнішні переривання, тобто переривання, що виникають при зміні стану певних входом МК. З таблиці векторів переривань видно, що у МК ATmega8 таких переривань 2 - INT0 і INT1 і їх пріоритет вище інших переривань. При детальному розгляді Datasheet External Interrupts і виявляємо, що для налаштування цих переривань потрібно скористатися регістром MCUCR (MCU Control Register - регістр управління) і GICR (General Interrupt Control Register - загальний регістр управління перериваннями). Розглянемо їх детальніше.



 

 

Таблиця 1 – Вектори переривань МК Atmega8.

 

Регістр MCUCR.

 

Біт 1, 0 - ISC01, ISC00: Налаштування умови спрацьовування переривання INT0 (таблиця 2).

Таблиця 2 – Налаштування умов спрацювання переривання INT0.

 

Біт 3, 2 - ISC11, ISC10: Налаштування умови спрацьовування переривання INT1 (таблиця 3).

Таблиця 3 – Налаштування умов спрацювання переривання INT1.

(Біти 4-7 відносяться до управління живленням і тут розглядати не будемо).

 

Регістр GICR

 

Біт 7 - INT1: Дозволяє зовнішнє переривання 1 ("1" - дозволено, "0" - заборонено).

Біт 6 - INT0: Дозволяє зовнішнє переривання 0 ("1" - дозволено, "0" - заборонено).

 

Також будь-яке переривання має свій прапор переривання. Цей прапор встановлюється в "1" у момент, коли мало відбутися переривання, навіть якщо переривання глобально заборонені і відповідна програма обробки переривання не викликається. Можна, наприклад, усередині якого-небудь обробника переривання по цьому прапору перевіряти було якесь переривання чи ні. Прапори зовнішніх переривань є 7-м і 6-м бітами регістра GIFR. Прапори переривань скидаються записом у них "1".

Регістр GIFR

 

Біт 7 - INTF1: Прапор зовнішнього переривання 1.

Біт 6 - INTF0: Прапор зовнішнього переривання 0.

 

Розглянемо приклад роботи з перериванням. На рис.1 наведена принципова схема пристрою. У нормальному режимі світлодіод D2 світиться, а світлодіод D1 – ні. Якщо натиснути кнопку то навпаки, світлодіод D2 не буде світитися, а світлодіод D1 – буде. Розглянемо програму зроблену у середовищі CodeVisionAVR, що реалізує даний пристрій.

 

Рисунок 1. – Принципова схема пристрою.

 

 

#include <mega8.h>
#include <delay.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) // підпрограма обробки //переривань (якщо натиснута кнопка)
{ // Place your code here
PORTC.0=0; // якщо кнопка натиснута діод D2 не світиться
PORTB.0=1; // якщо кнопка натиснута діод D1 світиться
delay_ms(100); // чекаємо 100 мс
}
// Declare your global variables here
void main(void)
{
DDRB.0=1; // 0 біт порту В налаштовуємо на вихід
PORTB.0=0; // подаємо логічний «0» на 0 біт порту В
DDRD.2=0; // налаштовуємо 2 біт порту D
PORTD.2=1; // як вхід з «підтяжкою»
DDRC.0=1; // 0 біт порту С налаштовуємо на вихід
PORTC.0=0; // подаємо логічний «0» на 0 біт порту С
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level // INT1: Off
GICR|=0x40; // записуємо у регістр GICR число 0100 0000 та дозволяємо // переривання за INT0
MCUCR=0x00; // налаштовуємо вхід INT0 на умову спрацювання //переривання за низьким рівнем
GIFR=0x40; // скидаємо прапор переривань за INT0 // Global enable interrupts
#asm("sei") // дозволяємо обробку переривань
while (1)
{
// Place your code here
PORTB.0=0; // поки кнопка не натиснута діод D1 не світиться
PORTC.0=1; // поки кнопка не натиснута діод D2 світиться ;)
}
}

 



<== предыдущая лекция | следующая лекция ==>
Початкові дані для проектування. | Робота з таймерами/лічильниками МК AVR


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.552 сек.