Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Debug IAR MSP430F5438 - что за хрень с отладкой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
k155la3
IAR, MSP340F5438A, "Debug" с отключенной оптимизацеий.

(?)
Работа switch() в ISR.
Почему при отладке упорно влетает в точку BP2, хотя должно
(хотя кто нам чего должен ?) вродекак в BP1.
Были у кого такие грабли, или просто я такой счасливый ?




Baser
С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах.
Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI,
причем первым возникает прерывание со смещением не равным 4.
И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV,
сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте).

Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4
Как то так...
sasa_c
Согласен с Baser, Возможно необходимо добавить поля case с всеми возможными состояниями UCB1IV, даже если эти комбинации в этом векторе не используются. В этих полях после case поставить break;
k155la3
Цитата(Baser @ Feb 1 2016, 01:23) *
С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах.
Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI,
причем первым возникает прерывание со смещением не равным 4.
И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV,
сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте).

Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4
Как то так...



Baser, sasa_c, спасибо за ответы. Так и есть.

Вчера провел изыскания.
Если возникает одновременно 2 прерывания, то они отображаются в UCB1IFG,
а в обработчик вход идет с UCB1IV == 0x00. Это означает нечто вроде "есть несколько прерываний. Уточнить по UCB1IFG"
Чтобы все работало, надо в case-0 сбросить один из флагов. Тогда сразу генерируется
следующее прерывание (пере-вход в обработчик с "новым" UCB1IV == 0x04),
соотв-ее "очередному" флагу в UCB1IFG. В моем случае это UCNACKIFG.


Код
    
  . . . . . .
switch( UCB1IV )
  {
   case  0:
        {
        OSC_D2_L1;
        rr = rr + 2; rssi = 100;
                __no_operation();
                UCB1IFG &= ~UCTXIFG;
        OSC_D2_L0;
        }
        break;
      case  4:
        {
        OSC_D2_L1;
        rr = rr + 1; rssi = 104;
                __no_operation();
                UCB1IFG &= ~UCNACKIFG;
        OSC_D2_L0;
        }
        break;                           // Vector  4: NACKIFG

. . . . . .
mcheb
Цитата(k155la3 @ Feb 3 2016, 11:25) *
Вчера провел изыскания.

Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?
k155la3
Цитата(mcheb @ Feb 3 2016, 17:46) *
Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?

Согласен. Из-за "одноразовости" чтения UCB1IV надо использовать в switch директиву __even_in_range( UCB1IV, 12).
Она дает "вычисляемый" переход по switch.

(?)
Что означает вход по UCV1IV == 0x00, "No interrupt pending"


mcheb
Не знаю, а так работает
Код
#pragma vector = USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
    uint8_t u;
    switch(UCA0IV>>1)
    {
    case 0:
        break;
    case UCRXIFG:
        u=ToUpper(UCA0RXBUF);   // RXed character rxBuf[0]
        if(u=='\n' || u =='\r') cmdUart=1;
        uartRxBuf[uartRxIn++] = u;
        break;
    case UCTXIFG:
        UCA0IE &=~UCTXIE;
//        if(uartTxOut==uartTxIn) UCA0IE &=~UCTXIE;
//        else UCA0TXBUF=uartTxBuf[uartTxOut++];
        break;
    default:
        break;
    }
    LPM3_EXIT;
}
k155la3
Цитата(mcheb @ Feb 4 2016, 11:54) *
Не знаю, а так работает


Ok - спасиб sm.gif

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.