|
подскажите по 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 в контроллере? Что скажете?
|
|
|
|
|
Aug 22 2005, 15:25
|

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

|
подскажите по uart
подскажите пожалуйста, какие уровни соответствуют логической 1 и 0 на выводах UART в MSP430.
|
|
|
|
|
Aug 23 2005, 10:54
|

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

|
VAI, спасибо. никак не мог найти.
|
|
|
|
|
Aug 23 2005, 22:58
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-08-05
Пользователь №: 7 898

|
Может ежли не секрет скажешь на каком форуме. Аналогичную задачку решаю.
|
|
|
|
|
Aug 23 2005, 23:02
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-08-05
Пользователь №: 7 898

|
Цитата(KaeMZer @ Aug 22 2005, 04:21) Пытаюсь реализовать обмен данными контроллера MSP430F133 и PC по COM-порту. Сейчас на другом форуме разбираемся с проблемами, связанными с программой, выполняющейся на компе (там разберусь и сюда переберусь  ). Так вот, задали мне там вопрос вроде простой, а на самом деле коварный (ответа я не знаю  ) - программный или аппаратный модуль UART в контроллере? Что скажете? Может ежли не секрет скажешь на каком форуме. Аналогичную задачку решаю.
|
|
|
|
|
Aug 23 2005, 23:36
|

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

|
Цитата(Dimka84 @ Aug 24 2005, 02:02) Может ежли не секрет скажешь на каком форуме. Аналогичную задачку решаю. а что за задачка? и как успехи?
|
|
|
|
|
Aug 24 2005, 08:45
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-08-05
Пользователь №: 7 898

|
Цитата(KaeMZer @ Aug 24 2005, 03:36) а что за задачка? и как успехи? 14 устройств на линии. PC - мастер. Со стороны PC прогу для работы с COM нормально написать не могу. Приём пришлось делать отдельным потоком. Кто-нибудь ReadFileEx использовал? p.s. Могу дать свой код MSP430f1xx UART И прогу для отладки приёма-передачи со стороны PC
|
|
|
|
|
Aug 24 2005, 11:50
|

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

|
Цитата Со стороны PC прогу для работы с COM нормально написать не могу. в чём проблема заключается? не получется работа именно с com-портом на РС или уже не идёт совместная работа с контроллером? можно попробовать посмотреть исходники. кстати, я ОЧЕНЬ много времени потратил на программную часть (вроде всё просто - у меня пока только учебная задача - байт отослать на контроллер, байт от него принять - а не получалось никак). проблема оказалась в железе - преобразователь уровня выдавал "левый" по уровню сигнал. так что рекомендую глянуть напряжение на ножках. сейчас вот переделываю. ЗЫ. я чайник в этих делах пока что.
|
|
|
|
|
Aug 24 2005, 12:06
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-08-05
Пользователь №: 7 898

|
Основная проблема, это COM. А именно приём. Я обращаюсь к ReadFile и делаю выход по таймауту. Но прога много процессорного времени жрёт.
|
|
|
|
|
Aug 24 2005, 12:33
|

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

|
мне видится вот какое решение: создать отдельный поток для чтения, в этом потоке настроить маску отслеживаемых событий так, чтобы отслеживалось событие - приём байта в буфер (см. SetCommMask). затем вызываем функцию ожидания события WaitCommEvent и поток (только он, а не вся программа) тормозится до прихода байта в буфер. ну а потом уже вызываем ReadFile, которая и прочитает пришедший байт. Разница будет в том, что процессорное время мы не занимали. более подробно это всё описано в статье Олега Титова "Работа с коммуникационными портами (COM и LPT) в программах для Win32." (я по сути лишь кратко пересказал содержание  ) Раньше статья была по адресу http://www.rs232.ru/doc002.html но теперь эта ссылка вроде не работает. Поищите в Интернете, её часто цитируют.
|
|
|
|
|
Aug 24 2005, 14:40
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-08-05
Пользователь №: 7 898

|
Наверное так и придётся делать. Статья есть здесь: http://morgeyz.narod.ru/comlpt.htmСейчас почитаю.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|