shide_3 0 20 марта, 2014 Опубликовано 20 марта, 2014 · Жалоба расскажите пожалуста, есть ли в msp 5 серии возможность управлять приоритетами прерываний? я пока не нашел.. просто usci_a0 и a1 такое ощущение что возникают коллизии.. хотя вроде приоритет за usci_a0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 марта, 2014 Опубликовано 20 марта, 2014 · Жалоба Нет. Приоритеты "жестко" определены. Но вашу проблему можно локализовать и определить ее причину. Правда только в том случае, если вы сообщите подробности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 21 марта, 2014 Опубликовано 21 марта, 2014 · Жалоба Нет. Приоритеты "жестко" определены. Но вашу проблему можно локализовать и определить ее причину. Правда только в том случае, если вы сообщите подробности. ну, в общем, usci_a0 служит для приема/отправки символов Modbus RTU (да да, это тот же самый прожект :) ), вот только RTU только сейчас появилась необходимость внедрить. А usci_a1 - для измерения интервалов 3,5 символа между пакетами. и есть подозрение, что эти 2 прерывания конфликтуют между собой, при использовании отдадчика мало что понятно, да и исследовать прерывания отладчиком не вмегда грамотно.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 21 марта, 2014 Опубликовано 21 марта, 2014 · Жалоба есть подозрение, что эти 2 прерывания конфликтуют между собой Прерывания в принципе всегда конфликтуют между собой, потому что без вложенности прерываний пока не выполнится одно, не начнет выполняться другое, а со вложенностью, пока не выполнится второе, не закончится первое. Скорее всего что-то не то Вы замутили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 1 апреля, 2014 Опубликовано 1 апреля, 2014 (изменено) · Жалоба Прерывания в принципе всегда конфликтуют между собой, потому что без вложенности прерываний пока не выполнится одно, не начнет выполняться другое, а со вложенностью, пока не выполнится второе, не закончится первое. Скорее всего что-то не то Вы замутили. вообще, по даташиту, приоритет у usci a0, затем a1. по идее, если прием символов закончился (usci_a0), начинается отсчет интервалов 3,5 символа (usci_a1). главное, что на 149-м msp эта конструкция алгоритм работала, а на 5437a нет. вот код, может добавит немного ясности #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, B)); 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(B); */ 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; } } Изменено 1 апреля, 2014 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lsc 0 11 апреля, 2014 Опубликовано 11 апреля, 2014 · Жалоба Может обработчики долговаты, __interrupt void USCI_A0_ISR(void) например ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться