В этом материале познакомимся с прерыванием - interrups, будем останавливать нашу основною программу вызванным внешним прерыванием.

Начнем с алгоритма работы нашей программы!

1. При включении питания начинает работать счетчик от 0 до 9, это будет основной программой.

2. При нажатии на кнопку КН1 имитируем внешнее прерывание.

3. Включается светодиод на порту PB7.

4. Основная программа останавливается и ждет пока не пропадет прерывание.

5. Отпускаем кнопку, светодиод выключается, основная программа начинает работать с того места, на котором остановилась.

Перейдем к написанию программы и рисованию электрической схемы!

1. Создаем новый проект в Atmel Studio 7 по пути File > New > Projec..., выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).

2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.

Программа нам выдает код в файле main.c*

Приводим его к читабельному виду, удаляем лишние комментарии.

Рисуем электрическую принципиальную схему:

И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, к порту PB через токоограничительные резисторы номиналом 300Ом подключен семисегментный индикатор и светодиод, на порт PD2 кнопка, а также обозначены выводы для подключения программатора, вернемся к программе.

Настроим в программе ножки порта РB на выход, допишем в программе DDRB = 0b11111111;.

С настройкой портов закончили, присвоим директиве #define имя S которое будет хранить данные о задержке на 1 секунду. Добавим в программу библиотеку задержек #include <util/delay.h>, для задержки будем использовать функцию _delay_ms(), а также добавим для нас новую библиотеку прерываний #include <avr/interrupt.h>, далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.

Добавим массив int puls [10] = {}; - с цифрами от 0 до 9 и переменную int r=0; - присвоим ей значение 0.

Вот такой получился код:

Теперь займемся вызовом вектора прерывания и его настройкой , допишем в нашу программу вектор прерывания.

В прерывании будем опрашивать нашу кнопку которая подключена к поту PD2, как мы знаем Atmega8 имеет два порта под прерывания PD2(INT0) и PD3(INT1) соответственно, мы будем использовать PD2(INT0). Запишем в вектор прерывания уже знакомый нам код опроса кнопки и настроим ножку порта PD2(INT0) на вход с подтяжкой к +5В через внутренний резистор, так как к нему подключена кнопка КН1.

Наше прерывание может работать в нескольких режимах, мы будем работать с первым режимом - если низкий уровень на INT0 генерируем запрос прерывания. Выделил его красным.

Допишем в программе

Режимы работы и настройка взяты из datasheet на ATmega8, разрешаем глобальное прерывание командой asm("sei"); - это обязательно, без этой команды работать не будет и допишем в бесконечный цикл основную программу взятую из материала подключение семисегментного индикатора к микроконтроллеру AVR , счетчик от 0 до 9.

В данном материале мы познакомились с системой вызова прерывания по низкому уровню, практическое применение данного метода довольно обширное если включить фантазию, начиная от пробуждения микроконтроллера из спящего режима и заканчивая системами умного дома!

 

 

Исходный код программы Скачать архив