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

 
 
 
Reply to this topicStart new topic
> Usart не работает, Usart не работает
Рома81
сообщение Nov 7 2006, 09:25
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 4-11-06
Пользователь №: 21 974



такая вот ситуация:
просматриваю порт RS485 (c UARTа - постоянно посылаю байт), с другого контроллера (мастер -ICPDAS - там простая програма считывания байта с порта RS485)

и вот приходит сначала все нормально, что послано то и приходит, а потом начинается глюк, приходит непонятно что и функция готовности порта (показывает что с порта что то пришло) скачет (то true, то false) потом через некоторое время, снова все налаживается и.т.д.

некоторые намекают на не стабильность такотвого генератора, иногда сразу после RESET возникает бит сбоя DCO (если прирывание разрешить), и потом висит постоянно, после следующего RESET не появлется,

мож кто обяснит в чем дело

использую MSP430FE427 - на ACLK (это вроде LFT1CLK) кварц 32768 Гц, на MCLK и SMCLK = ACLK*32 = 1MГц. - это устанавливется после сброса, и регистры все проверены поэтому FLL не настраивается в программе.

SCFQCTL = 1F (умножается на 32)
SCIFO = 00 (деление на 1, диапазон от 0,6 - 6МГц)
FLL_CTL0 = 00

приведу код мож кто найдет ошибку:

void init_UART(unsigned long baud)

P2SEL |= (BIT4 + BIT5); // P2.4,5 = USART0 TXD/RXD

P2DIR |= BIT4+BIT3; // P2.4 на вывод - UTXD0
// P2.3 на вывод - SVS - направление передачи для RS485
// P2.5 на ввод - URXD0
U0CTL = SWRST;
U0CTL = CHAR + SWRST;

switch(baud)
{
case 9600:

UTCTL0 = SSEL1;
UBR00 = 0x6D; // 1MHz/9600
UBR10 = 0x00; //
UMCTL0 = 0X03;

break;

case 19200:
UTCTL0 = SSEL1;
UBR00 = 0x36; // 1MHz/19200
UBR10 = 0x00; //
UMCTL0 = 0x6B;
break;

case 115200:
UTCTL0 = SSEL1;
UBR00 = 0x09; // 1Mhz/115200
UBR10 = 0x00; //
UMCTL0 = 0x08; //
break;
default:
while(1){;}
//break;
} // окончание switch(baud)


U0ME |= UTXE0+URXE0;

U0IFG &= ~URXIFG0; //очистка флагов
U0IFG &= ~UTXIFG0;

UCTL0 &= ~(SWRST);
U0IE |= URXIE0+UTXIE0;

}

int main(void)
{


WDTCTL = WDTPW + WDTHOLD;
init_system(); //для портов
init_UART(9600)

P2OUT |= BIT3; //на передачу P2.3 = (1) ..
//P2OUT &= ~BIT3; // на прием P2.3 = (0)

_EINT();

while (1)
{ if (UTXIFG0==0x80) TXBUF0=0x01;

}

}
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 8 2006, 15:45
Сообщение #2


Гуру
******

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



Любопытно, а зачем нужна вот эта операция, которая всегда дает TRUE?
Код
if (UTXIFG0==0x80) TXBUF0=0x01;


Ваш бесконечный цикл эквивалентен такому
Код
while (1)
{ TXBUF0=0x01;
}

Сами поймете почему или пояснить? wink.gif
Если поймете, то думаю сразу догадаетесь отчего возникает переполнение потока через UART.

P.S. в конце выделенного оператора не хватает точки с запятой.
Цитата
WDTCTL = WDTPW + WDTHOLD;
init_system(); //для портов
init_UART(9600)

P2OUT |= BIT3; //на передачу P2.3 = (1)
Go to the top of the page
 
+Quote Post
Рома81
сообщение Nov 9 2006, 05:08
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 4-11-06
Пользователь №: 21 974



Любопытный ответ, особенно насчет точки с запятой!
Как вы думайте запустилась такая программа?
Ессно здесь код не полностью.
И чего вам не понравилось в бесконечном цикле и записи в регистор передачи я не понял.

Отвечать - "сами разберетесь или нет", по меньшей мере не профессионально, коль уж отвечать взялись,
если б я сам разобрался я б сюда не писал.
Хотя если помочь ничем конкретно не можете - не отвечайте. мож кто другой нужную идею подкинет.

А проблема в следующем - меня беспокоит периодическое возникновение бита сбоя генератора DCO, он то устанавливается, то сбрасывается причем не постоянно а время от времени, проц уходит в прерывание от неисправности
осцилятора и сидит там очень долго (сек от 10 до 20 ) потом выходит работает некоторое время и снова туда. Когда нет сбоя, Usart передает как надо, хоть один байт хоть 20 - все на месте.
Причем здесь переполнение потока?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 9 2006, 10:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Рома81 @ Nov 9 2006, 08:08) *
Отвечать - "сами разберетесь или нет", по меньшей мере не профессионально, коль уж отвечать взялись, если б я сам разобрался я б сюда не писал.
Хотя если помочь ничем конкретно не можете - не отвечайте. мож кто другой нужную идею подкинет.

И у меня такая идея есть!
Относитесь доброжелательно к любым советам - может оказаться так, что других и не будет :-)


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Shread
сообщение Nov 9 2006, 14:52
Сообщение #5


иногда заглядывающий
****

Группа: Свой
Сообщений: 900
Регистрация: 18-05-05
Из: Зеленоград
Пользователь №: 5 170



Цитата(Dog Pawlowa @ Nov 9 2006, 13:15) *
Цитата(Рома81 @ Nov 9 2006, 08:08) *

Отвечать - "сами разберетесь или нет", по меньшей мере не профессионально, коль уж отвечать взялись, если б я сам разобрался я б сюда не писал.
Хотя если помочь ничем конкретно не можете - не отвечайте. мож кто другой нужную идею подкинет.

И у меня такая идея есть!
Относитесь доброжелательно к любым советам - может оказаться так, что других и не будет :-)

bb-offtopic.gif
Присоединяюсь к последнему оратору. Думается что не вам судить о профессионализме Rezident'a. Вместо того, чтоб искать что-то обидное для себя, лучше б поискали рациональное зерно в его ответе, которое вообщем-то лежит на поверхности.
p.s Усердию Rezident'a в грамотных ответах на вопросы в этой конфе, в том числе и на очень простые вопросы(ответы на которые не раз встречались на сахаре, телесистемах или здесь) можно позавидовать. Прежде чем обижать хороших людей, иногда полезно думать.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 9 2006, 16:10
Сообщение #6


Гуру
******

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



Нда. Не догадались или лень читать User's Guide? Ну тогда подсказываю, что нет такого регистра UTXIFG0. UTXIFG0 это флаг который находится в регистре IFG1. Ваша проверка на готовность буфера передатчика UART и передача в цикле, должны были выглядеть так.
Код
while (1)
{ if ((IFG1&UTXIFG0)!=0) TXBUF0=0x01;
}

Нет никакого смысла постоянно писать в буфер UART, до того момента, пока он не освободился для передачи следующего байта. Кстати, что за переменные или регистры под именами U0IFG, U0ME и U0IE? Это для меня тоже загадка. Среди стандартных имен TI и/или компилятора IAR я таких не встречал. cranky.gif Если это ваши собственные, то неплохо бы еще и хидер в комплекте прилагать.

По поводу неустойчивой работы генератора мне сложно что-то сказать определенное, т.к. вы ни код (инициализации и обработки ошибок осциллятора) не привели, ни схему подключения (обвязку) осциллятора не описали. А применять для этого экстрасенсорные способности (и додумывать пропущенные точки с запятой) в принципе можно, но довольно сложно smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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