Отлаженый проект переношу с MEGA324P на AT90USB1287. После соответствующей коррекции программы перестало отрабатывать нажатия на матричной клавиатуре 4х4. Изменилась схема подключения клавиатуры: раньше COL и RAW подключались к двум разным портам. Теперь занимают один PORTF. И, так как у AT90USB1287 только PORTB имеет PCINT (зачем было так ограничивать функциональность МК ?!!), то выводы RAW через диоды анодами подключены к выводу внешнего прерывания INT6 (PORTE6). Прерывания настраиваю как обычно:
Код
int main()
{
// Initialise
ACSR = (1<<ACD); // Analog Comparator Disable
.................
PORTE = (1<<KEY_INT); // INT6 -> input, pull-up - ON
key_Init();
__enable_interrupt(); // set the Global Interrupt Enable Bit
.....................................
///////////////////////////////////////////
#define ENABLE_INT6 {EIFR |= (1<<INTF6); EIMSK |= (1<<INT6);}// Clear interrupt status flag, Enable external interrupt INT6
#define DISABLE_INT6 EIMSK &= ~(1<<INT6) // Disable external interrupt INT6
void key_Init(void)
{
/* Init ports */
KEYMATRIX_DDR = 0x0f; // Set row lines to input, Set column lines to output
KEYMATRIX_PORT = 0xf0; // Pull row lines high, Drive all column lines low
/* Enable external interrupt */
ENABLE_INT6; // Enable pin change interrupt INT6
}
Выяснилось, что не вызывается обработчик прерывания INT6. Проверяю по звуковому сигналу BEEP.
В симуляторе в AVRSTUDIO тоже прогнал - не вызываются прерывания: ни по низкому уровню, ни по фронтам (заднему и переднему). АЦП (PORTF) не использую. В чем дело?
PS. Схему и код выкладываю, чтобы не возникало лишних вопросов.