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

 
 
> Передача по USART
d7d1cd
сообщение Aug 5 2012, 14:53
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем! Подскажите, могу ли я организовать передачу по USART (в режиме UART) без использования вектора прерывания для передачи? Сразу извиняюсь, если вопрос глуп...
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
sidy
сообщение Aug 5 2012, 16:18
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Есть такая возможность:
http://we.easyelectronics.ru/msp430/duplek...re-timer_a.html
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Aug 5 2012, 17:14
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(sidy @ Aug 5 2012, 20:18) *
Есть такая возможность:
http://we.easyelectronics.ru/msp430/duplek...re-timer_a.html

Спасибо за интересную статью, но мне не нужно "изобретать" модуль UART. Я хочу работать с имеющимся, только отправку реализовать без использования возможности прерывания.
Хочу попробовать реализовать следующий алгоритм. Адрес начала отправляемого блока данных и количество отправляемых байт передается через регистры. Использую отправку через USART0.

1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку);

2. Отправляю в регистр U0TXBUF очередной байт из блока данных;

3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3;

4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт;

5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2;

6. Разрешаю маскируемые прерывания.




Скажите, будет работать?

Go to the top of the page
 
+Quote Post
KARLSON
сообщение Aug 6 2012, 04:39
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



2. В регистр UCA0TXBUF.
3. бит UCA0TXIFG.

Ваш алгоритм работать будет. Только всё равно, правильно через прерывание, тот же самый алгоритм, только бит отправки проверять не надо, запрещать глобально прерывания не надо, если последний байт - запретить прерывание опустошения буфера.


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Aug 7 2012, 02:54
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Спасибо за комментарий. Вот только регистра UCA0TXBUF и бита UCA0TXIFG я в своем микроконтроллере MSP430F149 не нашел...
И еще, если этот же алгоритм применять в обработке прерывания на отправку, то как инициировать саму отправку, то есть что сделать, чтобы сработало прерывание на отправку? Установить бит UTXIFG0?
Go to the top of the page
 
+Quote Post
KARLSON
сообщение Aug 7 2012, 04:23
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



Да, в 1 и во 2 семействе разные USART. Я почему то подумал, что у вас 2-го семейства.
Если не ошибаюсь, нужно в основном цикле первый байт послать самому, перед этим разрешить прерывание передатчика.

Сообщение отредактировал KARLSON - Aug 7 2012, 04:24


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 7 2012, 06:52
Сообщение #7


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Вырвано из старого (2005г) прожекта, надеюсь поможет. Функции для работы по готовности там закомментированы, для работы через них не нужно разрешать прерывания при инициализации (убрать строку enable_USART0_RX_interrupt;).
Прикрепленный файл  USART0_430.c.txt ( 2.83 килобайт ) Кол-во скачиваний: 202



--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 8 2012, 18:41
Сообщение #8


Гуру
******

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



Цитата(d7d1cd @ Aug 5 2012, 19:53) *
Подскажите, могу ли я организовать передачу по USART (в режиме UART) без использования вектора прерывания для передачи?
Можно, по опросу флага UTXIFGx. Только состояние этого флага перед загрузкой нового байта а UTXBUFx нужно будет сбрасывать программно, т.е. сбросом бита UTXIFGx в регистре IFGx.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 9 2012, 15:06
Сообщение #9


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(rezident @ Aug 9 2012, 01:41) *
... состояние этого флага перед загрузкой нового байта а UTXBUFx нужно будет сбрасывать программно, ...

Это лишнее, у MSP430 UART нормальный, правильный:
Цитата
UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF

http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/13.htm


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 11 2012, 18:03
Сообщение #10


Гуру
******

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



Цитата(SSerge @ Aug 9 2012, 20:06) *
UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF
Правильно. А если это конец передачи и передавать больше не нужно, то флаг можно сбросить только программно.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Aug 12 2012, 05:15
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(rezident @ Aug 11 2012, 22:03) *
Правильно. А если это конец передачи и передавать больше не нужно, то флаг можно сбросить только программно.


Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид?


1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку);

2. Отправляю в регистр U0TXBUF очередной байт из блока данных;

3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3;

4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт;

5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2;


6. Сбрасываю бит UTXIFG0.

7. Разрешаю маскируемые прерывания.

Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 12 2012, 12:12
Сообщение #12


Гуру
******

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



Цитата(d7d1cd @ Aug 12 2012, 10:15) *
Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид?
В общем-то SSerge прав. UTXIFGx вам вообще можно не трогать. Точно также не нужно разрешать/запрещать немаскируемые прерывания все сразу. Исходно лишь UTXIEx в регистрах IEx должны быть сброшены.
Код
  do
  { if ((IFG1 & UTXIFG0) !=0)  //передатчик готов?
    { U0TXBUF = *pBuf++;
      --bufSize;
    }
  } while (bufSize != 0);

где pBuf - указатель на буфер отправляемых данных,
bufSize - размер буфера для отправки.
Чтобы не зациклится здесь навсегда можно дополнительно в цикл ввести счетчик, по превышению которого определять "неисправность" UART (отсутствие готовности передатчика по истечение времени отправки одного символа) и переинициализировать его.
Только не очень понятно, для чего вам нужен именно такой алгоритм работы? С UART "выгоднее" работать по прерываниям, т.к. скорости его обычно на порядок или два ниже тактовой частоты ядра. Вот при работе с SPI на максимально возможной частоте (MCLK/2) - там да, выгоднее по опросу флага готовности.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Aug 12 2012, 14:43
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Если я начну объяснять зачем мне именно такой алгоритм, то нарушу правила данного форума. А за алгоритм спасибо. Буду пробовать реализовывать.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 28 2012, 15:13
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Ребят, подскажите такой момент. Чтобы определить готов ли передатчик USART0 к передачи очередного символа, необходимо проверить бит UTXIFG0. В руководстве пользователя сказано, что этот бит устанавливается, когда U0TXBUF пуст. И написано, что будет ожидаться прерывание на передачу. Но ведь тогда получается, что если разрешить прерывание на передачу, а в обработке прерывания ничего не делать (просто делать возврат из прерывания), то прерывание на передачу будет вызываться бесконечно. Правильно это?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 28 2012, 15:35
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 28 2012, 18:13) *
Но ведь тогда получается, что если разрешить прерывание на передачу, а в обработке прерывания ничего не делать (просто делать возврат из прерывания), то прерывание на передачу будет вызываться бесконечно. Правильно это?

Скорей всего так и будет - прерывание будет происходить постоянно.
Это довольно стандартное решение для МК.
Чтобы прерывание не происходило постоянно нужно или послать что-нибудь в uart или запретить прерывание, если передавать нечего.
Если возникла необходимость передать данные, то прерывание разрешается.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 28 2012, 15:57
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(_Артём_ @ Sep 28 2012, 19:35) *
Чтобы прерывание не происходило постоянно нужно или послать что-нибудь в uart или запретить прерывание, если передавать нечего.



Так если отправить что-то в UART, то после того как он выдаст байт наружу, так сказать, то прерывание снова возникнет. Значит управлять процессом передачи нужно через разрешение\запрещение прерывания. Правильно?

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 28 2012, 16:11
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 28 2012, 18:57) *
Так если отправить что-то в UART, то после того как он выдаст байт наружу, так сказать, то прерывание снова возникнет. Значит управлять процессом передачи нужно через разрешение\запрещение прерывания. Правильно?

Да, разрешаете прерывание если нужно послать несколько байт.
В прерывании шлёте данные, если есть или запрещаете прерывания, если данных нет.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 28 2012, 16:55
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Ясно. А еще такой вопрос: запуск механизма передачи осуществляется автоматически при записи в регистр передачи байта? А после того, как байт полностью передан, в регистре будет 0x00 или там будет тот же байт, который был передан?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 28 2012, 17:06
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 28 2012, 19:55) *
А еще такой вопрос: запуск механизма передачи осуществляется автоматически при записи в регистр передачи байта?

Ну да.
Цитата(d7d1cd @ Sep 28 2012, 19:55) *
А после того, как байт полностью передан, в регистре будет 0x00 или там будет тот же байт, который был передан?

А зачем из него читать?
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 28 2012, 17:14
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(_Артём_ @ Sep 28 2012, 21:06) *
А зачем из него читать?

Мне читать оттуда не надо. Просто интересно что остается в регистре передачи после передачи.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 29 2012, 06:58
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Спасибо всем за помощь. Сегодня провел испытания программы, которая отправляет данные по UART0. Вот такой код на ассемблере получился:
Код
Адрес начала блока отправляемых байт 0x066A
Адрес переменной, хранящей число отправляемых байт 0x0913


PUSH    R4               Освобождаем регистр для счетчика
MOV.B   #0,R4            Обнуляем счетчик для передачи
BIT.B   #0080,&0002      Если передатчик USART0 не готов к передаче, то...
JZ      0F5BE            ...ждем готовности передатчика
MOV.B   066A(R4),&0077   Помещаем очередной байт в регистр для передачи
ADD.B   #1,R4            Увеличиваем счетчик переданных байт
SUB.B   #1,&0913         Уменьшаем число не отправленных байт
JNZ     0F5BE            Если не все байты переданы, то переходим проверке готовности передатчика
POP     R4               Восстанавливаем регистр из стека
RET                      Выходим из функции
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 19:24
Рейтинг@Mail.ru


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