Управляем частотой мигания светодиода с помощью прерываний по каналам int0 и int1 микроконтроллера ATmega8515.
Сигнал по int1 увеличивает частоту импульсов на пине порта С (увеличивает границу счёта), сигнал по int0 уменьшает частоту (уменьшает границу счёта).
Программа на CodeVisionAVR:
#include <mega8515.h>
long i, x; // i - счётчик циклов, x - граница, до которой счётчик считает.
//Обработчик прерываний по int1 ________________________________________________________________
interrupt[3] void Ext_Int1(void) //Обработчик прерываний на int1 (Порт D, вывод 3).
{
x = x + 200; // При нажатии на кнопку увеличивем границу счёта на 200 (можно менять).
}
//Обработчик прерываний по int0 ________________________________________________________________
interrupt[2] void Ext_Int0(void) //Обработчик прерываний на int0 (Порт D, вывод 2).
{
x = x - 200; // При нажатии на кнопку уменьшаем границу счёта на 200 (можно менять).
}
//Основная программа ________________________________________________________________________
void main(void)
{
DDRD=0b00000000; // Выводы порта D настраиваем как вход (0-вход, 1-выход)
PORTD=0b11111111; /* Подключаем внутренние подтягивающие резисторы к выводам порта D.
(0-высокоимпедансное состояние, 1-подтягивающий резистор) */
DDRC = 0b11111111;
x = 10000; // Начальное значение границы (можно менять).
GICR=0b11000000; /* Регистр General Interrupt Control Register разрешает внешние прерывания
10 000000 - по выводу int1;
01 000000 - по выводу into;
11 000000 - по обоим выводам */
MCUCR=0b00001010; /* Регистр Micro Controller Unit Control Registr настраивает прерывание на срабатывание:
0000 10 00 - по спадающему фронту сигнала на выводе int1;
0000 11 00 - по нарастающему фронту сигнала на выводе int1;
0000 00 00 - по низкому уровню на выводе int1;
0000 01 00 - по любому изменению уровня на выводе int1 */
SREG |= 0b10000000; // Status Register, 7 бит разрешает общие прерывания.
while(1)
{
PORTC ^= 0b00000001; // На каждой итерации перекидываем пин порта на противоположный.
for(i=0; i<=x; i++) // Цикл задержки, микроконтроллер выполняет счёт до "x".
{
}
}
}