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

 
 
> странности в работе f5437a
shide_3
сообщение Dec 3 2013, 11:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Здравствуйте!прошу помочь советом или направить в нужное русло, потому как у самого идеи уже кончились. был проект на 149-м MSP, переделали его под msp430f5437a, соответственно ничего существенного в коде программы не меняли, только ноги и некоторые названия регистров, и само собой, настройка PMM. проблема такова- есть прерывания по uart rx и tx, при срабатывании RX (прием кадра modbus ascii) кадр принимается нормально (несколько символов), затем по программе должен формироваться кадр ответа, но программа не доходит до нужной подпрограммы, она просто зависает каждый раз в разных местах, но чаще всего на обработке TX (даже когда прерывание TX я специально отключаю!). повторюсь-в коде ничего существенно не меняли. работал с отладчиком TI USB-FET. скорость uart 115200, пробовал и 9600. (но похоже он тут ни при чем)
короче, в итоге устройство абсолютно нерабочее! прошу, подскажите пож. может кто-то испытывал подобные трудности.
кристалл работал вначале от внешнего резонатора 25 Мгц, после проявления вышеописанных проблем я перевел его на DCO (2 мгц), стало лучше, но выполнение программы заканчивается все равно раньше конца подпрограммы (я смотрел пошагово отладчиком).
может у кого были похожие симптомы? незнаю уже на кого грешить.
спасибо всем

Сообщение отредактировал shide_3 - Dec 3 2013, 11:39
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 4 2013, 09:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Кварц 25МГц ни при чем. Генераторы и на бОльшей частоте могут работать. Сейчас нет времени досконально разбираться с инициализацией. Отмечу пока только то, за что глаз "зацепился".
1. При начальной инициализации нужно все регистры прописывать явными значениями, а не накладывать маски на якобы дефолтные состояния. Я уже давно и настоятельно это всем рекомендую sm.gif
2. Зачем вы инициализируете UART в 7-ми битном режиме? Протокол Modbus 8-ми битные символы использует.
3. Работа модулятора в USCI отличается от работы модулятора в USART. Я бы на вашем месте вообще пока модуляцию не использовал. Тем более, что ошибка битовой частоты получается всего 0,2%=(1048576/109-9600)/9600*100%
4. Эмулятор при чтении регистров для отображения их в окне View может изменять их состояние, сбрасывая прерывания. Следует учитывать такой эффект. Это к вашему замечанию "интеррапт флаги usci автоматически сбрасываются". Кстати, неплохо бы еще и обработчик перывания посмотреть.
5. Был/есть какой-то глюк/нюанс при использовании DCO для тактирования USCI при синхронизации FLL от REFO или часового кварца. То ли в errata описанный, то ли еще где. Найду - напишу. Суть в том, что синхронизация и модуляция DCO приводит в результате к девиации битовой частоты, которая значительно влияет на работу UART. При использовании DCO для тактирования UART рекомендуется подключать источник синхронизации (REFO или LFXT) только на время (авто)подстройки частоты DCO. Затем источник синхронизации следует отключать, чтобы DCO работал на тех значениях, что получились в результате подстройки.
Подробнее разберу вечером, когду будет время.
Go to the top of the page
 
+Quote Post
shide_3
сообщение Dec 4 2013, 11:32
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(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, cool.gif);
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;}

}

Сообщение отредактировал shide_3 - Dec 4 2013, 11:35
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 5 2013, 19:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(shide_3 @ Dec 4 2013, 16:32) *
как раз в нашем случае ascii modbus - 7 битный, это RTU-8 битный. и софт с соответствующими настройками (на 7 бит).
В режиме ASCII используется бит четности и всего один стоповый бит. У вас четность не используется и два стоповых бита.
Цитата(shide_3 @ Dec 4 2013, 16:32) *
кстати, при 25 мгц программа затыкается немного раньше, и чаще всего попадает в обработчик прерывания TX.(там зацикливается). при DCO такого нет.

Я вам уже указал, что USCI отличается от USART в части обработки прерываний.
Цитата(shide_3 @ Dec 4 2013, 16:32) *
в мануале написано:
UCRXIFG and UCRXIE are reset by a
system reset PUC signal or when UCSWRST = 1. UCRXIFG is automatically reset when UCAxRXBUF is
read.

Правильно. В USART прерывание от приемника работает аналогично. Но, как я понял, проблема-то у вас с прерыванием от передатчика USCI! Вот сравните
Для USART
Цитата
UTXIFGx is automatically reset if the interrupt
request is serviced or if a character is written to UxTXBUF.

Для USCI
Цитата
UCTXIFG is
automatically reset if a character is written to UCAxTXBUF.

Отличие состоит в том, что в USART прерывание от передатчика сбрасывается в т.ч. просто при переходе по вектору прерывания передатчика. Это возможно, т.к. вектора прерываний для передатчика и для приемника UART разные. В USCI вектор прерывания расшарен и адрес у него один, поэтому сброс запроса прерывания только по факту перехода на обработку передатчика не работает. Если вы попали в прерывание от передатчика, но передавать уже нечего, то флаг UCTXIFG нужно сбросить "вручную". Либо запретить прерывание от передатчика, чтобы после выхода из прерывания не попасть в него вновь.

Цитата(shide_3 @ Dec 4 2013, 19:54) *
эх. было бы наверное интересно и полезно опробовать заведомо рабочий прожект для подобного кристалла на своем. разумеется, не столь лажовый, как Flashing LED.

У производителя на сайте есть примеры http://www.ti.com/lsds/ti/microcontroller/...tware.page#code
Go to the top of the page
 
+Quote Post
shide_3
сообщение Dec 6 2013, 08:42
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(rezident @ Dec 5 2013, 22:58) *
Либо запретить прерывание от передатчика, чтобы после выхода из прерывания не попасть в него вновь.


у меня на данный момент так и сделано
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- shide_3   странности в работе f5437a   Dec 3 2013, 11:38
- - rezident   Цитата(shide_3 @ Dec 3 2013, 16:38) был п...   Dec 3 2013, 15:20
- - shide_3   void UART_Init(unsigned long BaudRate,unsigned cha...   Dec 3 2013, 15:28
- - shide_3   может, 25 мгц виноваты- всетаки это предельная час...   Dec 4 2013, 09:06
- - shide_3   эх. было бы наверное интересно и полезно опробоват...   Dec 4 2013, 14:54
- - shide_3   интересно, неужели у всех кто юзал эти мспшники, б...   Dec 10 2013, 14:26
|- - rezident   Цитата(shide_3 @ Dec 10 2013, 19:26) инте...   Dec 10 2013, 15:06
|- - shide_3   Цитата(rezident @ Dec 10 2013, 18:06) В к...   Dec 10 2013, 15:48
|- - rezident   Цитата(shide_3 @ Dec 10 2013, 20:48) може...   Dec 14 2013, 16:35
|- - shide_3   Цитата(rezident @ Dec 14 2013, 19:35) Вме...   Dec 14 2013, 20:24
|- - rezident   Цитата(shide_3 @ Dec 15 2013, 01:24) у ме...   Dec 14 2013, 21:02
|- - shide_3   Цитата(rezident @ Dec 15 2013, 00:02) Пок...   Dec 16 2013, 18:38
|- - rezident   Цитата(shide_3 @ Dec 16 2013, 23:38) а об...   Dec 16 2013, 19:00
- - shide_3   теперь ясно,спасибо! не догадался что можно фр...   Dec 17 2013, 06:16


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 05:02
Рейтинг@Mail.ru


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