|
подскажите по uart |
|
|
|
Mar 25 2005, 13:18
|

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

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

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

|
Более точно можно посчитать значения регистров используя прилагаемые ниже экселевские файлы. Там можно поиграться битами UMCTL и посмотреть полученый результат. А предлагаемая программа не дает такой возможности. ModulationRegister.xls - исходный файл ModRegister_vai.xls - немного подправленый мной, т.к. мой эксель не хотел понимать "вражьи" функции, примененные в исходном файле.
Прикрепленные файлы
2.rar ( 35.76 килобайт )
Кол-во скачиваний: 162
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Jun 9 2005, 07:45
|
Частый гость
 
Группа: Свой
Сообщений: 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, там есть флаги прывания по передачи как от "буфер пуст", так и от "передатчик пуст"
|
|
|
|
|
Jun 9 2005, 09:36
|
Гуру
     
Группа: Свой
Сообщений: 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 конечно же должно быть заранее разрешено.
|
|
|
|
|
Jun 9 2005, 10:44
|
Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962

|
Цитата(rezident @ Jun 9 2005, 13:36) Нужно не только дождаться окончания передачи символа, но еще и выждать паузу ... А паузы формируйте таймерами .... идея насчет таймеров мне понравилась, как раз есть один свободный. не понятно только насчет паузы, зачем она нужна? к томуже если пауза будет слишком большой я могу пропустить стартовый бит ответа.
|
|
|
|
|
Jun 10 2005, 06:43
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 25-08-04
Пользователь №: 537

|
Цитата(-=Space=- @ Jun 9 2005, 21:31) В реальной системе будет еще одно усовершенствование - т.к. бОльшую часть времени модули будут в режиме сна, а трансмитеры в режиме PowerDown то что б не пропустить запрос мастера или модуля вводится однопроводная шина управления. 0 на шине управления - все трансмиеры в PowerDown. Если Модуль желает что б мастер его опросил он выставляем 1 на шине управления.Все модули переводят трансмитеры в режим чтения. Мастер циклически опрашивает модули, каждый из которых отвечает нужен ему запрос или нет. После с обмена с модулем, который послал запрос, шина управления переводтся в 0 - неактивное состояние. Все трансмитеры переводятся в режим PowerDown. Простите если чего не понял, но зачем еще одна линия? А нельзя сделать так?... Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д.
|
|
|
|
|
Jun 10 2005, 07:14
|
Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962

|
Цитата(Alex2172 @ Jun 10 2005, 10:43) Простите если чего не понял, но зачем еще одна линия? А нельзя сделать так?... Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д. дело в том что трансмитер в режиме полного сна т.е. не прием и не передача (приемник и передатчик управляются отдельными линиями) в случае полоного PowerDownа на линии RX будет постоянная 1 сделано это ради экономии батарейки, трансмитер даже в режиме приема жрет на много больше чем в режиме PowerDown
|
|
|
|
|
Jun 10 2005, 09:42
|
Гуру
     
Группа: Свой
Сообщений: 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 и началом/окончанием передачи пакета в начале и в конце фрейма.
|
|
|
|
|
Aug 22 2005, 00:21
|

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

|
Пытаюсь реализовать обмен данными контроллера MSP430F133 и PC по COM-порту. Сейчас на другом форуме разбираемся с проблемами, связанными с программой, выполняющейся на компе (там разберусь и сюда переберусь  ). Так вот, задали мне там вопрос вроде простой, а на самом деле коварный (ответа я не знаю  ) - программный или аппаратный модуль UART в контроллере? Что скажете?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|