Перейти к содержанию
    

только начал работать с msp430f149. Что-то после AVR и 51-х грустно. Если не трудно, бросьте что-нибудь из примеров использования UART (на Си).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите на сайте TI "Code Examples"

http://focus.ti.com/mcu/docs/generalconten...430_desres_code

 

Ну и прилагаю свои тексты, не судите строго.

1.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не грусти, даже програмка есть, которая все пересчитает :)

лежит на этой страничке

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А предлагаемая программа не дает такой возможности.

 

ModulationRegister.xls - исходный файл

ModRegister_vai.xls - немного подправленый мной, т.к. мой эксель не хотел понимать "вражьи" функции, примененные в исходном файле.

2.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Есть сеть микроконтроллеров, канал связи - 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, там есть флаги прывания по передачи как от "буфер пуст", так и от "передатчик пуст"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это не есть хорошо. Лучше создавать свою тему со своим описанием.

Есть сеть микроконтроллеров, канал связи - RS485

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

 

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

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

 

я конечно выкрутился

вот даже пример

криво это выглядит

может я чего упустил и можно было сделать проще?

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

Это не то чтобы криво, а просто неправильно. Нужно не только дождаться окончания передачи символа, но еще и выждать паузу, чтобы возможные помехи от переключения линии (при выключении передатчика) не были восприняты принимающим устройством как начало следующего символа. Пауза эта конечно же зависит от примененного протокола и линии связи. Какие-то протоколу чувствительны к этому, какие-то нет. "Растяжка" линии тоже очень способствует улучшению связи.

А паузы формируйте таймерами, как минимум один таймер есть в любом кристалле MSP430. Посчитайте требуемую паузу, необходимую для передачи символа на данной скорости и паузу достаточную для удержания линии после передачи и сразу же после записи в UxTXBUF последнего байта установите CCRx какого-нибудь таймера. Когда пауза окончится, то при возникновении прерывания от CCRx переключайте линию RS485 на прием. Прерывание от CCRx конечно же должно быть заранее разрешено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно не только дождаться окончания передачи символа, но еще и выждать паузу ... А паузы формируйте таймерами ....

идея насчет таймеров мне понравилась, как раз есть один свободный.

не понятно только насчет паузы, зачем она нужна?

к томуже если пауза будет слишком большой я могу пропустить стартовый бит ответа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не понятно только насчет паузы, зачем она нужна?

к томуже если пауза будет слишком большой я могу пропустить стартовый бит ответа.

Какой протокол связи используете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интерфейс RS485

протокол "Многопроцессорный формат с адресным битом"

данных 7 бит, 2 стоповых, скорость 115200.

 

вот интересно флаг "передатчик пуст" выставляется именно после того как выслан 2 стоповый бит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не совсем про это спрашивал. Меня интересовал протокол верхнего уровня. Т.е. как быстро ведомый будет ответ передавать? Если ли какие-то символы начала и конца фрейма? Как реагирует ведомый на неверно принятый байт?

Например, в протоколе ModBus ASCII есть начало фрейма ":", окончание фрейма 0x0D и после этого передается символ готовности к приему 0x0A. Поэтому ведомый может передавать (если у него ответ уже готов) сразу же после приема символа 0x0A, следовательно ведущий должен освобождать линию сразу же после окончания передачи символа 0x0A.

В ModBus RTU конец фрейма определяется по паузе тишины длительностью 3.5 символа. Следовательно после передачи последнего символа фрейма ведущий должен удерживать линию как минимум в течение 3,5 символов, чтобы помеха от переключения передатчика или наведенная помеха на незанятую (свободную) линию не испортила весь фрейм.

В реальности для транспортной функции в протоколах связи для RS485 желательно реализовывать паузу для минимальной задержки ответа. Во время этой паузы будет происходить переключение линии с приема на передачу и обратно.

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

P.S. флаг TXEPT устанавливается после выдвижения последнего бита в выбранном формате. Если был выбран формат с 2 стоп-битами, то после выдвижения второго стоп-бита.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если про протокол верхнего уровня, то он у нас свободный

система наша, протокол наш.

пока остановились на таком варианте

мастер опрашивает модули по кругу

посылка мастера :

байт адреса (8ой бит 1) + байт команды (8ой бит 0)

если команда подразумевает чтения из модуля к мастеру то сразуже следует ответ модуля 2-5 байт (от 1 до 4 байт данных + CRC)

если команда - запись данных из мастера в устройство то следует еще 2-5 байт данных , и затем ответ модуля о доставке/ошибке посылки (1 байт)

Количество байт данных определяется командой

 

В реальной системе будет еще одно усовершенствование - т.к. бОльшую часть времени модули будут в режиме сна, а трансмитеры в режиме PowerDown

то что б не пропустить запрос мастера или модуля вводится однопроводная шина управления.

0 на шине управления - все трансмиеры в PowerDown. Если Модуль желает что б мастер его опросил он выставляем 1 на шине управления.Все модули переводят трансмитеры в режим чтения. Мастер циклически опрашивает модули, каждый из которых отвечает нужен ему запрос или нет. После с обмена с модулем, который послал запрос, шина управления переводтся в 0 - неактивное состояние. Все трансмитеры переводятся в режим PowerDown.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В реальной системе будет еще одно усовершенствование - т.к. бОльшую часть времени модули будут в режиме сна, а трансмитеры в режиме PowerDown

то что б не пропустить запрос мастера или модуля вводится однопроводная шина управления.

0 на шине управления - все трансмиеры в PowerDown. Если Модуль желает что б мастер его опросил он выставляем 1 на шине управления.Все модули переводят трансмитеры в режим чтения. Мастер циклически опрашивает модули, каждый из которых отвечает нужен ему запрос или нет. После с обмена с модулем, который послал запрос, шина управления переводтся в 0 - неактивное состояние. Все трансмитеры переводятся в режим PowerDown.

Простите если чего не понял, но зачем еще одна линия?

А нельзя сделать так?...

Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите если чего не понял, но зачем еще одна линия?

А нельзя сделать так?...

Допустим модуль спит, передатчик драйвера RS485 в модуле также спит, но линия RX микроконтроллера сконфгурирована как прерывание по фронту, когда начинается передача мастером- модули просыпаются, принимают данные, и т.д.

дело в том что трансмитер в режиме полного сна

т.е. не прием и не передача (приемник и передатчик управляются отдельными линиями)

в случае полоного PowerDownа на линии RX будет постоянная 1

сделано это ради экономии батарейки, трансмитер даже в режиме приема жрет на много больше чем в режиме PowerDown

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если про протокол верхнего уровня, то он у нас свободный

система наша, протокол наш.

пока остановились на таком варианте

мастер опрашивает модули по кругу

посылка мастера :

байт адреса (8ой бит 1) + байт команды (8ой бит 0)

если команда подразумевает чтения из модуля к мастеру то сразуже следует ответ модуля 2-5 байт (от 1 до 4 байт данных + CRC)

если команда - запись данных из мастера в устройство то следует еще 2-5 байт данных , и затем ответ модуля о доставке/ошибке посылки (1 байт)

Количество байт данных определяется командой

Вот потому, что у вас нет "обрамления" фрейма, а также длина пакета не имеет фиксированного значения и нужно делать паузы между переключением направления драйвера RS485 и началом/окончанием передачи пакета в начале и в конце фрейма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Так вот, задали мне там вопрос вроде простой, а на самом деле коварный (ответа я не знаю :() - программный или аппаратный модуль UART в контроллере? Что скажете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...