У меня в программе есть три цикла, первые два это настройка железа, завершаются по достижения нужных параметров. Последний бесконечный - контроль параметров.
И есть внешняя кнопка, которая переводит в режим ожидания. Вот на эту ногу и надо сделать прерывание, нажата она может быть в любой момент исполнения программы, даже перед включением.
Как мне понятно, что эта функция работает про простому изменение уровня. То есть нажали кнопку произошло прерывание, отпустили, опять произошло прерывание?
Подскажите как можно организовать работу с этим прерыванием, чтобы при нажатии конпки мы выполняли один и тот же цикл (например мигание светодиодом), а при отпускании начинали тот цикл в котором произошло прерывание?
И еще такой вопрос это прерывание всё таки на весь порт, или на отдельную ногу? меня смущает, то что мне CAVR предлагает создать свою функцию по этому прерываню, как весь порт:
CODE
interrupt [PC_INT2] void pin_change_isr2(void)
{
// Place your code here
}
{
// Place your code here
}
Но при этом есть настройка указать какую ногу использовать :
CODE
// Interrupt on any change on pins PCINT16-23: On
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
PCMSK2=(1<<PCINT23) | (0<<PCINT22) | (0<<PCINT21) | (0<<PCINT20) | (0<<PCINT19) | (0<<PCINT18) | (0<<PCINT17) | (0<<PCINT16);
PCIFR=(1<<PCIF2) | (0<<PCIF1) | (0<<PCIF0);
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
PCMSK2=(1<<PCINT23) | (0<<PCINT22) | (0<<PCINT21) | (0<<PCINT20) | (0<<PCINT19) | (0<<PCINT18) | (0<<PCINT17) | (0<<PCINT16);
PCIFR=(1<<PCIF2) | (0<<PCIF1) | (0<<PCIF0);