Есть следующая проблема: В обработчике прерываний от PIOE в самом начале считываю статусный регистр PIOE_ISR, и иногда получаю ноль, хотя прерывание вызывается. При этом больше нигде этот регистр не читаю, поэтому резетиться он не должен. Ноль получается достаточно случайно. Тестирую подачей квадратурного сигнала с периодом ~100мкс, иногда получаются редкие пропуски по 2-3 раза из 20 фронтов в разных местах, независимо от того спад это или нарастание, иногда подряд 10-15 раз.
Код прост: _INTERRUPT void vKeyboard_IT_Handler(void) { int tmp; unsigned long u4Temp_ISR; // Здесь читаю этот регистр u4Temp_ISR = *AbsPIOE_ISR;
if(u4Temp_ISR == 0) { // u4Temp_ISR = 1; // так все работает }
// Определяю какая из ног дернула (0 или 2) u4Temp_ISR &= 0x05; // Determine interrupt source if(u4Temp_ISR & 0x01) { // для тестирования осцилом зажигаю седьмой пин, когда все ОК *AbsPIOE_SODR = 0x80; // просто задержка ~10мкс for(tmp = 50; tmp > 0; tmp--); }
*AbsPIOE_CODR = 0x80; }
Проц не совсем обычный, секьюрный Atmel SO101. Может ли что-то портить JTAG Emulator?
Буду благодарен за любую помощь...
|