реклама на сайте
подробности

 
 
> FIQ и IRQ LPC 2106
xelax
сообщение Nov 8 2006, 14:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



прерывание от MR1 таймера Timer0, раз в миллисекунду.
Код
void InitTimer1 (void)
{
   T1TCR = 0x00000002; // синхронный сброс счётчика таймера и счётчика предделителя
   T1PR  = 0x0000170A;
   T1MR1 = 0x00000009;
   T1MCR = 0x00000018;  // разрешаю прерывание по 1 мс  
   T1TCR = 0x00000001;   // старт таймера
}

// конфигурирование контроллера прерываний
void InitVIC(void)
{
  /*  // Setup interrupt controller.    
    VICVectCntl3=0x00000025;
    VICVectAddr3 =(unsigned )Timer1Int;
//   VICIntSelect |=0x20;
    VICIntEnable |=0x20;
     VICVectAddr = 0;        
}

#pragma vector=0x1C
__fiq __arm void interrupt_function(void)
{      
  
   T1IR = 0x000000FF;
  
   if (IOPIN_bit.P0_14)  
      IOCLR_bit.P0_14=1;  
   else
      IOSET_bit.P0_14=1;  
}

__arm static void Timer1Int(void)
{        
   T1IR = 0x000000FF;
  
   if (IOPIN_bit.P0_14)
      IOCLR_bit.P0_14=1;  
   else
      IOSET_bit.P0_14=1;  
}



#pragma vector=0x18
__irq __arm void isr_handler_irq(void)
{
  void (*interrupt_function)();
  unsigned int adrvector;

  adrvector = VICVectAddr;                    
  interrupt_function = (void(*)())adrvector;
  (*interrupt_function)();                  

  VICVectAddr = 0;
}


Наблюдаю следующую картину осциллом на 14 пине, когда использую FIQ вместо меандра вижу иногда проскакивают увеличенные в два раза по времени импульсы. Иногда посередине этого импульса виден узкий пичёк. Такое ощущение, что FIQ происходит два раза подряд. Что в коде не так??? IRQ работает нормально.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Nov 9 2006, 08:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Похоже проблема разрешилась.
Дело было вот в чём. В основном цикле был сброс внешнего WDT
Код
if(IOPIN_bit.P0_31){IOCLR_bit.P0_31=1;}
          else {IOSET_bit.P0_31=1;}

В прерывании менялся 14 бит порта. ИМХО операция записи бита в порт происходит (очень приблизительно) 1 .чтение порта + 2. наложение маски + 3. запись в порт. Предположим что в основном цикле записываем 31 бит.
И если между 1 и 2 этапом происходит прерывание, прочитанное значение сохраняется в стек. В прерывании меняется допустим 14 бит. Возвращаемся из прерывания, считывается значение из стека (с неизменённым в прерывании 14 битом), меняется 31 бит и значение пишется в порт. В итоге значение 14 бита потеряно.

Убрав из основного цикла изменение 31 бита, глюк полечился. Возможно мои домыслы неверны, так как начал писать под АРМ неделю назад wink.gif.
Что скажут старожилы форума?

И как вообще такой ситуации избежать?

З.Ы. Забыл самое важное пишу на IAR

Сообщение отредактировал xelax - Nov 9 2006, 08:55
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016