Цитата(rezident @ Dec 4 2013, 12:34)

2. Зачем вы инициализируете UART в 7-ми битном режиме? Протокол Modbus 8-ми битные символы использует.
как раз в нашем случае ascii modbus - 7 битный, это RTU-8 битный. и софт с соответствующими настройками (на 7 бит). кадр то нормально принимается, и скорее всего uart тут не виноват(может сам процессор?), программа просто затыкается на полпути при формировании фрейма ответа...
кстати, при 25 мгц программа затыкается немного раньше, и чаще всего попадает в обработчик прерывания TX.(там зацикливается). при DCO такого нет.
Цитата(rezident @ Dec 4 2013, 12:34)

4. Эмулятор при чтении регистров для отображения их в окне View может изменять их состояние, сбрасывая прерывания. Следует учитывать такой эффект. Это к вашему замечанию "интеррапт флаги usci автоматически сбрасываются".
в мануале написано:
UCRXIFG and UCRXIE are reset by a
system reset PUC signal or when UCSWRST = 1.
UCRXIFG is automatically reset when UCAxRXBUF is
read.а вот обработчик
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
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; Lock(); eventAdd();// UCA0IE |= UCTXIE ;
BlockReceive = 1;
return;
}
else
{
mbFrameStarted = 0; PDUlen = 0; MB_Diag.BusCommErrorCount++;
}
}
if (mbAsciiChar)
{
mbLRC += (serialPDU [PDUlen] = Get_ASCII_Byte(mbAsciiChar,

);
PDUlen ++;
mbAsciiChar = 0;
}
else
mbAsciiChar = b;
}
} // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
break;
case 4:
// if ( FrameReady )
if ( BlockReceive )
{
if ( PDUlen >= ResponseLength )//ResponseLength
{
PDUlen = 0;
ResponseLength = 0;
FrameReady = 0;
mbFrameStarted = 0;
// while ((UCA0IFG & UCTXIFG) != UCTXIFG);
P7OUT &= ~BIT0; // RS485 direction = RECIEVE
UnLock();
BlockReceive = 0;
UCA0IE &= ~UCTXIE ;
}
else
__no_operation();
//UCA0TXBUF = serialPDU[1];}
UCA0TXBUF = (ModBusMode == MODE_ASCII)? transmitBuf[PDUlen++] : serialPDU[PDUlen++];}
//UCA0IE &= ~UCTXIE ;
}
break;
default: break;}
}