Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: приоритеты прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
shide_3
расскажите пожалуста, есть ли в msp 5 серии возможность управлять приоритетами прерываний? я пока не нашел..
просто usci_a0 и a1 такое ощущение что возникают коллизии.. хотя вроде приоритет за usci_a0
rezident
Нет. Приоритеты "жестко" определены.
Но вашу проблему можно локализовать и определить ее причину. Правда только в том случае, если вы сообщите подробности.
shide_3
Цитата(rezident @ Mar 20 2014, 13:12) *
Нет. Приоритеты "жестко" определены.
Но вашу проблему можно локализовать и определить ее причину. Правда только в том случае, если вы сообщите подробности.

ну, в общем, usci_a0 служит для приема/отправки символов Modbus RTU (да да, это тот же самый прожект sm.gif ), вот только RTU только сейчас появилась необходимость внедрить. А usci_a1 - для измерения интервалов 3,5 символа между пакетами. и есть подозрение, что эти 2 прерывания конфликтуют между собой, при использовании отдадчика мало что понятно, да и исследовать прерывания отладчиком не вмегда грамотно..
Dog Pawlowa
Цитата(shide_3 @ Mar 21 2014, 07:38) *
есть подозрение, что эти 2 прерывания конфликтуют между собой

Прерывания в принципе всегда конфликтуют между собой, потому что без вложенности прерываний пока не выполнится одно, не начнет выполняться другое, а со вложенностью, пока не выполнится второе, не закончится первое.
Скорее всего что-то не то Вы замутили.
shide_3
Цитата(Dog Pawlowa @ Mar 21 2014, 13:53) *
Прерывания в принципе всегда конфликтуют между собой, потому что без вложенности прерываний пока не выполнится одно, не начнет выполняться другое, а со вложенностью, пока не выполнится второе, не закончится первое.
Скорее всего что-то не то Вы замутили.

вообще, по даташиту, приоритет у usci a0, затем a1. по идее, если прием символов закончился (usci_a0), начинается отсчет интервалов 3,5 символа (usci_a1). главное, что на 149-м msp эта конструкция алгоритм работала, а на 5437a нет. вот код, может добавит немного ясности
CODE
#pragma vector=USCI_A0_VECTOR


__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break;
case 2:


b = UCA0RXBUF;


if ( UCA0STAT & UCRXERR ) return;
__no_operation();



if ( BlockReceive ) return;

if(ModBusMode == MODE_ASCII)
{
if ( ! FrameReady )
{
if(PDUlen >= 254){ PDUlen = 0; mbCRC16 = 0xFFFF; MB_Diag.BusCommErrorCount++; } //Message too long
if (! mbFrameStarted) // waiting for new frame
{
if (b == ':') // SOF
{
mbFrameStarted = 1;
mbAsciiChar = 0;
mbLRC = 0;
PDUlen = 0;
}
}
else
{
if((PDUlen != 0) && (b == ':')) { PDUlen = 0; MB_Diag.BusCommErrorCount++; } // SOF occured before previous EOF
if(b == 10)
{// EOF
if (mbLRC == 0)
{
FrameReady = 1;PDUlen--; mbFrameStarted = 0; eventAdd();
BlockReceive = 1;
return;
}
else
{
mbFrameStarted = 0; PDUlen = 0; MB_Diag.BusCommErrorCount++;
}
}

if (mbAsciiChar)
{
mbLRC += (serialPDU [PDUlen] = Get_ASCII_Byte(mbAsciiChar, cool.gif);
PDUlen ++;
mbAsciiChar = 0;
}
else
mbAsciiChar = b;
}
}
}
else
{ // RTU
if ( ! FrameReady )
{
CharCounter=0;
UCA1TXBUF=0;
UCA1IE |= UCTXIE ;
if(! mbFrameStarted) // starting new frame
{
mbFrameStarted = 1;

PDUlen = 0;
}

if ( PDUlen >= sizeof ( serialPDU ) )
{

PDUlen = 0;
}

serialPDU [PDUlen] = b;
if (PDUlen >= 2)
{
prev2CRC16 = prev1CRC16;
prev1CRC16 = mbCRC16;
}

nextCRC16(cool.gif;
*/
PDUlen ++;
}
}
}

break;

case 4:

break;

default: break;}

}


#pragma vector=USCI_A1_VECTOR

__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: break;
case 4:
++CharCounter;
if(CharCounter > 3 ) // end of frame period (3.5 ch) expired => complete frame
{
CharCounter=0;
if (ModBusMode == MODE_RTU)
{
if ( PDUlen > 3 )
{

if ( ! crc16_calc ( serialPDU, PDUlen ) )
{
CharCounter=0;
FrameReady = 1;
BlockReceive = 1;
mbFrameStarted = 0;
PDUlen -= 2;
eventAdd();
}
else
{
FrameReady = 0;
mbFrameStarted = 0;
MB_Diag.BusCommErrorCount++;
}
}
else
{
FrameReady = 0;
mbFrameStarted = 0;
MB_Diag.BusCommErrorCount++;
}
}
UCA1IE &= ~UCTXIE ;
}
else UCA1TXBUF = 0;

break;

default: break;

}

}
lsc
Может обработчики долговаты,
__interrupt void USCI_A0_ISR(void)
например ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.