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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> подскажите по uart
yung
сообщение Mar 25 2005, 12:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



только начал работать с msp430f149. Что-то после AVR и 51-х грустно. Если не трудно, бросьте что-нибудь из примеров использования UART (на Си).
Go to the top of the page
 
+Quote Post
VAI
сообщение Mar 25 2005, 13:12
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Посмотрите на сайте TI "Code Examples"
http://focus.ti.com/mcu/docs/generalconten...430_desres_code

Ну и прилагаю свои тексты, не судите строго.
Прикрепленные файлы
Прикрепленный файл  1.rar ( 3.08 килобайт ) Кол-во скачиваний: 162
 


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
kpv
сообщение Mar 25 2005, 13:18
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27



не грусти, даже програмка есть, которая все пересчитает smile.gif
лежит на этой страничке
Цитата
Эта программа поможет рассчитать коэфициенты для MSP-шного UART-а по заданной частоте тактирования BRCLK и требуемой битовой скорости BR. Автор: Александр Конузин


--------------------
Go to the top of the page
 
+Quote Post
VAI
сообщение Mar 26 2005, 05:17
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Более точно можно посчитать значения регистров используя прилагаемые ниже экселевские файлы. Там можно поиграться битами UMCTL и посмотреть полученый результат.
А предлагаемая программа не дает такой возможности.

ModulationRegister.xls - исходный файл
ModRegister_vai.xls - немного подправленый мной, т.к. мой эксель не хотел понимать "вражьи" функции, примененные в исходном файле.
Прикрепленные файлы
Прикрепленный файл  2.rar ( 35.76 килобайт ) Кол-во скачиваний: 162
 


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 9 2005, 07:45
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Чтоб не создавать новую тему, решил залать вопрос здесь

Есть сеть микроконтроллеров, канал связи - RS485
т.к. это полудуплекс, то необходимо управление трансмитером - прием/передача.

однако сложность в том чт опрерывание по передачи выставляется не когда передатчик пуст а раньше - когда пуст буфер передатчика.
Соответственно это прерывание мне бесполезно (я не могу здесь перевести трансмиттре на режим приема - еще передача идет)

я конечно выкрутился
вот даже пример
Код
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
if(tx_count==0)
   {
   _BIC_SR_IRQ(LPM0_bits);  // Clear LPM0, выполняем ожидание конца передачи
   return;
   }
else{
  .........
  // передача посылки из N байт
  tx_count--;
   }
}

//это в main
 for (;;)
   {
   _BIS_SR(LPM0_bits);         // Enter and stay in LPM0
   _NOP();
   while (!(UTCTL0 & TXEPT));  // ждем пока буфер передатчика UART0 не будет пуст
   P1OUT &= ~0x0C;             // запрет передачи
   }


криво это выглядит
может я чего упустил и можно было сделать проще?
как , например в AVR, там есть флаги прывания по передачи как от "буфер пуст", так и от "передатчик пуст"
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 9 2005, 09:36
Сообщение #6


Гуру
******

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



Цитата(-=Space=- @ Jun 9 2005, 13:45)
Чтоб не создавать новую тему, решил залать вопрос здесь

Это не есть хорошо. Лучше создавать свою тему со своим описанием.
Цитата(-=Space=- @ Jun 9 2005, 13:45)
Есть сеть микроконтроллеров, канал связи - RS485
т.к. это полудуплекс, то необходимо управление трансмитером - прием/передача.

однако сложность в том чт опрерывание по передачи выставляется не когда передатчик пуст а раньше - когда пуст буфер передатчика.
Соответственно это прерывание мне бесполезно (я не могу здесь перевести трансмиттре на режим приема - еще передача идет)

я конечно выкрутился
вот даже пример
криво это выглядит
может я чего упустил и можно было сделать проще?
как , например в AVR, там есть флаги прывания по передачи как от "буфер пуст", так и от "передатчик пуст"
*

Это не то чтобы криво, а просто неправильно. Нужно не только дождаться окончания передачи символа, но еще и выждать паузу, чтобы возможные помехи от переключения линии (при выключении передатчика) не были восприняты принимающим устройством как начало следующего символа. Пауза эта конечно же зависит от примененного протокола и линии связи. Какие-то протоколу чувствительны к этому, какие-то нет. "Растяжка" линии тоже очень способствует улучшению связи.
А паузы формируйте таймерами, как минимум один таймер есть в любом кристалле MSP430. Посчитайте требуемую паузу, необходимую для передачи символа на данной скорости и паузу достаточную для удержания линии после передачи и сразу же после записи в UxTXBUF последнего байта установите CCRx какого-нибудь таймера. Когда пауза окончится, то при возникновении прерывания от CCRx переключайте линию RS485 на прием. Прерывание от CCRx конечно же должно быть заранее разрешено.
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 9 2005, 10:44
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Цитата(rezident @ Jun 9 2005, 13:36)
Нужно не только дождаться окончания передачи символа, но еще и выждать паузу ... А паузы формируйте таймерами ....
*

идея насчет таймеров мне понравилась, как раз есть один свободный.
не понятно только насчет паузы, зачем она нужна?
к томуже если пауза будет слишком большой я могу пропустить стартовый бит ответа.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 9 2005, 13:36
Сообщение #8


Гуру
******

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



Цитата(-=Space=- @ Jun 9 2005, 16:44)
не понятно только насчет паузы, зачем она нужна?
к томуже если пауза будет слишком большой я могу пропустить стартовый бит ответа.
*

Какой протокол связи используете?
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 9 2005, 17:00
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Интерфейс RS485
протокол "Многопроцессорный формат с адресным битом"
данных 7 бит, 2 стоповых, скорость 115200.

вот интересно флаг "передатчик пуст" выставляется именно после того как выслан 2 стоповый бит?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 9 2005, 17:40
Сообщение #10


Гуру
******

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



Я не совсем про это спрашивал. Меня интересовал протокол верхнего уровня. Т.е. как быстро ведомый будет ответ передавать? Если ли какие-то символы начала и конца фрейма? Как реагирует ведомый на неверно принятый байт?
Например, в протоколе ModBus ASCII есть начало фрейма ":", окончание фрейма 0x0D и после этого передается символ готовности к приему 0x0A. Поэтому ведомый может передавать (если у него ответ уже готов) сразу же после приема символа 0x0A, следовательно ведущий должен освобождать линию сразу же после окончания передачи символа 0x0A.
В ModBus RTU конец фрейма определяется по паузе тишины длительностью 3.5 символа. Следовательно после передачи последнего символа фрейма ведущий должен удерживать линию как минимум в течение 3,5 символов, чтобы помеха от переключения передатчика или наведенная помеха на незанятую (свободную) линию не испортила весь фрейм.
В реальности для транспортной функции в протоколах связи для RS485 желательно реализовывать паузу для минимальной задержки ответа. Во время этой паузы будет происходить переключение линии с приема на передачу и обратно.
Все это делается для более устойчивой связи в условиях протяженных линий и сильных помех. Если же линии RS485 короткие и применены дополнительные растяжки линии, то наверное можно обойтись и без этих задержек.
P.S. флаг TXEPT устанавливается после выдвижения последнего бита в выбранном формате. Если был выбран формат с 2 стоп-битами, то после выдвижения второго стоп-бита.
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 9 2005, 18:31
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Если про протокол верхнего уровня, то он у нас свободный
система наша, протокол наш.
пока остановились на таком варианте
мастер опрашивает модули по кругу
посылка мастера :
байт адреса (8ой бит 1) + байт команды (8ой бит 0)
если команда подразумевает чтения из модуля к мастеру то сразуже следует ответ модуля 2-5 байт (от 1 до 4 байт данных + CRC)
если команда - запись данных из мастера в устройство то следует еще 2-5 байт данных , и затем ответ модуля о доставке/ошибке посылки (1 байт)
Количество байт данных определяется командой

В реальной системе будет еще одно усовершенствование - т.к. бОльшую часть времени модули будут в режиме сна, а трансмитеры в режиме PowerDown
то что б не пропустить запрос мастера или модуля вводится однопроводная шина управления.
0 на шине управления - все трансмиеры в PowerDown. Если Модуль желает что б мастер его опросил он выставляем 1 на шине управления.Все модули переводят трансмитеры в режим чтения. Мастер циклически опрашивает модули, каждый из которых отвечает нужен ему запрос или нет. После с обмена с модулем, который послал запрос, шина управления переводтся в 0 - неактивное состояние. Все трансмитеры переводятся в режим PowerDown.
Go to the top of the page
 
+Quote Post
Alex2172
сообщение Jun 10 2005, 06:43
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 25-08-04
Пользователь №: 537



Цитата(-=Space=- @ Jun 9 2005, 21:31)
В реальной системе будет еще одно усовершенствование - т.к. бОльшую часть времени модули будут в режиме сна, а трансмитеры в режиме PowerDown
то что б не пропустить запрос мастера или модуля вводится однопроводная шина управления.
0 на шине управления - все трансмиеры в PowerDown. Если Модуль желает что б мастер его опросил он выставляем 1 на шине управления.Все модули переводят трансмитеры в режим чтения. Мастер циклически опрашивает модули, каждый из которых отвечает нужен ему запрос или нет. После с обмена с модулем, который послал запрос, шина управления переводтся в 0 - неактивное состояние. Все трансмитеры переводятся в режим PowerDown.
*

Простите если чего не понял, но зачем еще одна линия?
А нельзя сделать так?...
Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д.
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Jun 10 2005, 07:14
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Цитата(Alex2172 @ Jun 10 2005, 10:43)
Простите если чего не понял, но зачем еще одна линия?
А нельзя сделать так?...
Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д.
*

дело в том что трансмитер в режиме полного сна
т.е. не прием и не передача (приемник и передатчик управляются отдельными линиями)
в случае полоного PowerDownа на линии RX будет постоянная 1
сделано это ради экономии батарейки, трансмитер даже в режиме приема жрет на много больше чем в режиме PowerDown
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 10 2005, 09:42
Сообщение #14


Гуру
******

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



Цитата(-=Space=- @ Jun 10 2005, 00:31)
Если про протокол верхнего уровня, то он у нас свободный
система наша, протокол наш.
пока остановились на таком варианте
мастер опрашивает модули по кругу
посылка мастера :
байт адреса (8ой бит 1) + байт команды (8ой бит 0)
если команда подразумевает чтения из модуля к мастеру то сразуже следует ответ модуля 2-5 байт (от 1 до 4 байт данных + CRC)
если команда - запись данных из мастера в устройство то следует еще 2-5 байт данных , и затем ответ модуля о доставке/ошибке посылки (1 байт)
Количество байт данных определяется командой
*

Вот потому, что у вас нет "обрамления" фрейма, а также длина пакета не имеет фиксированного значения и нужно делать паузы между переключением направления драйвера RS485 и началом/окончанием передачи пакета в начале и в конце фрейма.
Go to the top of the page
 
+Quote Post
KaeMZer
сообщение Aug 22 2005, 00:21
Сообщение #15





Группа: Новичок
Сообщений: 8
Регистрация: 11-08-05
Из: Minsk, Belarus
Пользователь №: 7 563



Пытаюсь реализовать обмен данными контроллера MSP430F133 и PC по COM-порту. Сейчас на другом форуме разбираемся с проблемами, связанными с программой, выполняющейся на компе (там разберусь и сюда переберусьsmile.gif).

Так вот, задали мне там вопрос вроде простой, а на самом деле коварный (ответа я не знаю sad.gif) - программный или аппаратный модуль UART в контроллере? Что скажете?
Go to the top of the page
 
+Quote Post

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

 


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


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