В этом материале познакомимся с прерыванием - 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.
В данном материале мы познакомились с системой вызова прерывания по низкому уровню, практическое применение данного метода довольно обширное если включить фантазию, начиная от пробуждения микроконтроллера из спящего режима и заканчивая системами умного дома!