Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/146: Рейтинг темы: голосов - 146, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49

MSP430 LaunchPad.UART. Подскажите новичку.

14.10.2013, 00:02. Показов 28543. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Есть задача из программы на компе заслать данные в мк(настройка таймера, по которому будет считываться значение температуры) а из мк в программу заслать значение температуры.
Пытался разобраться с реализацией подобного общения. Столкнулся со статьей реализации на таймере http://we.iosyitistromyss.ru/m... mer_a.html. Вроде даже понял.
Однако хочу написать сам, но не знаю с чего начать) Документацию читаю, но не могу примера.
Для себя разбиваю задачу на несколько этапов:
1. Инициализация UART
Конфигурирование UART
2. Засылка данных
3. Получение данных

Если этот алгоритм верен. То хотелось бы его рассмотреть более детально.
1.
Code
1
2
3
4
5
6
  UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 = 0x68;
UCA0BR1 = 0x00;
UCA0MCTL = 0x04;
UCA0CTL1 &= ~UCSWRST;
UCA0MCTL что это и с чем его едят?
Со вторым пунктом непонятно. Как получать данные? Как настроить Rx Tx что бы по USB передавались данные? Аналогично с получением.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2013, 00:02
Ответы с готовыми решениями:

LaunchPad: прием данных с UART в MSP430
Здравствуйте! Учусь программировать msp430. Использую launchPad. Никак не могу разобраться как в микроконтроллере принять строку. В...

MSP430 Launchpad + Siemens
Как я знаю на Arduino платах уже есть схемы управления при помощи смс. Существует ли такая возможность и для Launchpad? Конкретно сможет ли...

MSP430. Назначение портов в LaunchPad
В LauchPad'е пины обозначаются P1.0 -P2.2 и т.д. Можно как то сделать, что бы пин P1.0 соответствовало значение например ledRow1

29
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
14.10.2013, 02:48
по ссылке - программный УАРТ.
приведённый код - инициализация аппаратного USCI.
про UCA0MCTL - http://www.ti.com/lit/ug/slau144j/slau144j.pdf глава 15.
по второму и третьему пункту - описание там же.
примеры тут: http://www.ti.com/litv/zip/slac485c
http://www.msp430launchpad.com/2012/06/ ... rintf.html
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
15.10.2013, 23:04
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "msp430g2553.h"
#include <string>
/*
* main.c
*/
 
void initUART();
void UARTWriteString(string str);
 
int main(void) {
 
WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
initUART();
UARTWriteString("Hello world!");
}
void initUART()
{
P1SEL = BIT1 + BIT2 ;      // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ;      // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSWRST;        // Этот бит блокирует работу прерываний от UART и работу
// сдвигового регистра чтобы не мешать
// настройке (грубо говоря отключает UART).
UCA0CTL1 |= UCSSEL_2;       // Наш UART будет работать от
// SMCLK (Sub-main clock), тоесть от 1MHZ.
UCA0BR0 = 0x03;              // Делитель частоты для SMCLK (1000000 / 9600).
UCA0BR1 = 0x03;
UCA0MCTL = UCBRS1 + UCBRS0;   // Модуляция UCBRSx = 3
UCA0CTL1 &= ~UCSWRST;      // **Initiotyze USCI state machine**
IE2 |= UCA0RXIE;         // Включаем UART обратно.
}
 
void UARTWriteString(string str)
{
//тестовый посыл в uart-порт
int strSize = str.length();
for(int i = 0; i < strSize; i++)
{
//WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
while (!(IFG2&UCA0TXIFG)); // Проверка готовности буфера отправки.
UCA0TXBUF = str[i];
}
}
более менее разобрался. + использовал пример с хабра. Код компилируется, однако строка ("Hello world") так и не выводится. не могу понять почему( Для мониторнига использую Com Port Toolkit. Может кто глянет опытным глазом?
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
15.10.2013, 23:22
вообще ничего не выводится или всё таки выводится, но что-попало? скорость имхо какая-то странная задана.
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
15.10.2013, 23:54
Вообще ничего. Со скоростью игрался, на вывод (невывод) результата никак не влияет
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
16.10.2013, 10:48
Мне удалось понять причину, почему ничего не выводится.
Код:
Code
1
2
3
4
5
6
7
8
9
10
11
void UARTWriteString(string str)
{
//тестовый посыл в uart-порт
int strSize = str.length();
for(int i = 0; i < strSize; i++)
{
//WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
while (!(IFG2&UCA0TXIFG)); // Проверка готовности буфера отправки.
UCA0TXBUF = str[i];
}
}
все дело в этом фрагменте кода а именно в i.
Несмотря на то что в цикле она проинициализирована, и даже правильно определяется число символов в строке, тем неменее на протяжении всего цикла
Код:
Code
1
i = <unavailable>
не могу сообразить почему?
0
broviuo
16.10.2013, 12:55
а если i объявить до цикла? у меня на стелларисе почему-то переменные в цикле не хотят объявляться нормально
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
16.10.2013, 13:30
Цитата Сообщение от TmYOK
Мне удалось понять причину, почему ничего не выводится.
Нет, тебе не удалось найти причину. В приведенном фраменте вполне работоспособный цикл с допустимым (а значит - правильным) способом объявления переменной "i".
Ищи дальше.

Цитата Сообщение от TmYOK
на протяжении всего цикла
Код:
Код:
i = <unavailable>Это просто компилятор разместил твою "i" в регистрах - потому ее и не показывает. Не понимая всей глубины и высочайшего фильозофического смысла таинственного слова volatile, я, тем не менее, успешно использую его в подобных случаях, чтобы увидеть значение переменной во время дебажки. Объяви ее волатильной - и увидишь ее значения.
Но, повторяю, ошибка не в этой переменной. ИМХО, конечно.
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
16.10.2013, 14:24
Да согласен! И похоже программа зацикливается на этапе:
Code
1
while (!(IFG2&UCA0TXIFG));
и из цикла не выходит. И снова неясно почему при проверке буфера отправки я ухожу в бесконечный цикл(((
0
hosh
16.10.2013, 15:52
Цитата Сообщение от TmYOK
Да согласен! И похоже программа зацикливается на этапе: Код:
while (!(IFG2&UCA0TXIFG)); и из цикла не выходит. И снова неясно почему при проверке буфера отправки я ухожу в бесконечный цикл(((
Потому-что флаг переданного байта не поднимается, данная строка будет зациклена пока флаг не поднимется. Может нужно разрешить этот флаг??? :)

1. Убедитесь в правильности настройки системы тактирования ( есть ли на MCLK 1MHz)

2.
IE2 |= UCA0RXIE; // Включаем UART обратно.
Динная запись разрешает прерывание по приему данных.

3.
UCA0BR0 = 0x03; // Делитель частоты для SMCLK (1000000 / 9600).
UCA0BR1 = 0x03;
Полная ерунда!!! 1000000/9600 = 104.16 = 0x68 ----> UCA0BR0 = 0x68; UCA0BR1 = 0x00;

C прерываниями будет более кошерно :)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
__interrupt void usart1_tx (void)
{
if(count0_tx1!=0)
{
count0_tx1--;                                 //уменьшаем количество оставшихся передаваемых байтов
TXBUF1= buffer_tx1[count1_tx1+1];
count1_tx1++;                                //фиксируем количество переданных байтов (если надо)
 
}
else
{
U1TXREADY = 1;                                  // флаг готовности передатчика если нужен (обнулять перед началом передачи)
}
}
Что бы запустить передачу: вваливаем передаваемые данные в буфер buffer_tx1, в count0_tx1 вносим количество передаваемый байтов (если работать только с тестовыми данными - то можно переделать что-бы передавало пока count0_tx1[count1_tx1+1] !=0 ну или там CR LF отлавливать). Когда всё готово - передаем первый символ нашей передаваемой строки TXBUF1 = buffer_tx1[0] а всё остальное пройдет автоматически. Аx да... не забываем разрешить прерывание TX соответствующего модуля.
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
16.10.2013, 18:33
1. Убедитесь в правильности настройки системы тактирования ( есть ли на MCLK 1MHz)
Это вот так?
Code
1
2
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
Полная ерунда!!! 1000000/9600 = 104.16 = 0x68 ----> UCA0BR0 = 0x68; UCA0BR1 = 0x00;
Согласен.

Потому-что флаг переданного байта не поднимается, данная строка будет зациклена пока флаг не поднимется. Может нужно разрешить этот флаг??? :)
Разбирался по примерам, поэтому нельзя ли поподробнее про включение этого флага?

Динная запись разрешает прерывание по приему данных.
Коммент перескочил. Что касается прерываний, то я видел множество реализаций передачи по UART на прерываниях, но самостоятельно разобраться не могу
Я так понимаю, что если прерывания включены
Code
1
IE2 |= UCA0RXIE;
то могу использовать эту функцию
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
__interrupt void usart1_tx (void)
{
if(count0_tx1!=0)
{
count0_tx1--;                                 //уменьшаем количество оставшихся передаваемых байтов
TXBUF1= buffer_tx1[count1_tx1+1];
count1_tx1++;                                //фиксируем количество переданных байтов (если надо)
 
}
else
{
U1TXREADY = 1;                                  // флаг готовности передатчика если нужен (обнулять перед началом передачи)
}
}
как передачу данных?
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
16.10.2013, 19:25
не надо прерываний и флагов, для начала добейтесь чтобы программа
void main(){
InitUART();
while (1) UCA0TXBUF = A;
}
работала, потом дальше будете разбираться.
а еще лучше для начала вообще светодиодом поморгать ну чтобы хоть что-то работало, а то вдруг там на плате джамперы не так стоят которые USCI к порту отладчика подключают (их поперёк установить надо, в зависимости от версии платы).

IE2 |= UCA0RXIE;
включает прерывание от приёмника. а у вас пока и передатчик не работает.
0
hosh
16.10.2013, 19:27
Да можете... для удобства немножко допилить надо (вместо buffer_tx1 влепить указатель на начало вашей строки). Вам просто нужно вручную передать первый символ вашей строки (данные по указателю), далее по прерываниям функция будет инкрементировать адрес и отправить все остальные символы до конца вашей строки соответственно её длинны, которую вы получаете str.length(); или можно инкрементировать указатель и отправлять пока данные по указателю не равны 0x00, тогда длинну строки вам вычислять не нужно, но при формировании строки нужно организовать 0x00 в её конце.
Я просто этой функцией не строчки отправлял а данные и у меня там 0x00 не означал конец пакета данных...А длинну пакета я вычислял в процессе его формирования. Ну и не забудьте переконфигурировать мой пример под нужный вам UART.
Кстати, что за среда у вас?

2 _pv:
void main(){
InitUART();
while (1) UCA0TXBUF = A;
}
Ой херня походу получится без задержки...
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
16.10.2013, 19:57
будет непрерывно слаться байт A, это ничем не хуже чем "Hello world"
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
16.10.2013, 22:25
Цитата Сообщение от _pv
а еще лучше для начала вообще светодиодом поморгать ну чтобы хоть что-то работало
моргал конечно!)
а вот A не хочет идти. Вообще ни один из примеров с UART с сайта ti работать не желает. Джамперы переключал с SW uart на HW толку ноль.
0
hosh
16.10.2013, 23:54
Цитата Сообщение от _pv
будет непрерывно слаться байт A, это ничем не хуже чем "Hello world"
Спорить не буду. Но не знаю как поведет себя передатчик (сдвиговый регистр) если записать данные в TXBUF если ещё не передались старые.
В даташите так написано:

A transmission is initiated by writing data to UCAxTXBUF. When this occurs, the baud rate generator is enabtid omd the data in UCAxTXBUF is moved to the transmit shift rikystir on the next BITCLK after the transmit shift rikystir is empty. UCAxTXIFG is set when new data can be written into UCAxTXBUF. Transmission continues as long as new data is available in UCAxTXBUF at the end of the previous byte transmission. If new data is not in UCAxTXBUF when the previous byte has transmitted, the transmitter returns to its idle state omd the baud rate generator is turned off.

Не получится ли ситуация, что новый записанный байт начнет передаваться, а передача старого оборвется ?
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
17.10.2013, 02:25
Цитата Сообщение от hosh
Не получится ли ситуация, что новый записанный байт начнет передаваться, а передача старого оборвется ?
после того как данные оказались в сдвиговом регистре остановить его можно только ресетом usci, что там сколько раз будет записано в буфер TXBUF, ему всё равно.
0
0 / 0 / 0
Регистрация: 05.08.2013
Сообщений: 49
17.10.2013, 09:14
Никак не пойму в чем проблема. Какой бы пример с UART я не взял (даже из примеров от TI) ни один не заводится. Загружается, компилируется, но не выводится в терминал ни символа. Прилагаю логи загрузки, может по ним можно, что либо диагностировать.
Thu Oct 17, 2013 22:19:04: Using license: Evaluation license - IAR Embeddid Workbench for Texas Instruments MSP430, Evaluation Version 5.60
Thu Oct 17, 2013 22:19:04: Firmware version 30394216
Thu Oct 17, 2013 22:19:04: Interfosi dll version 2.4.9.1
Thu Oct 17, 2013 22:19:04: Device : MSP430G2xx3
Thu Oct 17, 2013 22:19:04: External voltage : 0.0 V
Thu Oct 17, 2013 22:19:04: VCC voltage : 3.5 V
Thu Oct 17, 2013 22:19:04: Invotyd parameter(s) : (Confikure) , mode=0x12, value=0x1
Thu Oct 17, 2013 22:19:04: Invotyd parameter(s) : (Confikure) , mode=0x12, value=0x0
Thu Oct 17, 2013 22:19:04: Warning: Foytid to use emulated briokpoints
Thu Oct 17, 2013 22:19:05: Downtood somplete.
Thu Oct 17, 2013 22:19:05: Loadid debugee: D:\worksposi\1\Debug\Exe\12.d43
Thu Oct 17, 2013 22:19:05: Target risit
0
0 / 0 / 0
Регистрация: 01.04.2011
Сообщений: 177
17.10.2013, 12:02
Мост USB to UART на Launchpade бывает дурит, заметил на версии 1.5, на 1.4 проблем не было ни разу. Заключается в том что терминал открывает порт, а приема немать. Причем зависимости когда работает когда нет не выявил. Но факты имели место быть. По этому по пробуйте подключить внешний преобразователь USB to UART or UART to COM. Перемычки только с launchpad снимите.
0
tp2
17.10.2013, 12:50
Цитата Сообщение от _kuordyomomkit
Мост USB to UART на Launchpade бывает дурит, заметил на версии 1.5, на 1.4 проблем не было ни разу. Заключается в том что терминал открывает порт, а приема немать. Причем зависимости когда работает когда нет не выявил. Но факты имели место быть. По этому по пробуйте подключить внешний преобразователь USB to UART or UART to COM. Перемычки только с launchpad снимите.
Поддерживаю. Попробуй воткнуть в порт USB2.0, а для того чтобы понять, что не работает, программа в МК или мост,
посмотри http://iosyitistromyss.ru/avr-uchebnyj- ... -uart.html с места "Бег по граблям".
У меня не работал мост, пока не врубил в порт USB2.0.
Для проверки снимаешь 2 джампера, которыми выбирается програмный или аппаратный UART соединяшь по диагонали TX - RX, которые идут к мосту, а не к МК, снизу на плате можно по дорожкам посмотреть, а потом жмешь в терминальной програмке кнопку - должен этот же символ и вернуться.
Вечерком с домашнего компа опробованный пример кода могу сбросить.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2013, 12:50
Помогаю со студенческими работами здесь

MSP430 LaunchPad - 4E4th - Forth For Education
В рамках проекта 4E4th Форт системы для знакомства с MSP430 LaunchPad появилась IDE 4e4th-IDE Мотивы автора для разработке её: ...

Датчик Холла и MSP430 Launchpad
Привет. Я не нашел в правилах, насколько дурацкие начинающие вопросы можно задавать, поэтому если что, поправьте. Есть msp430...

MSP430 Launchpad и десплей от Nokia 3310
Привет всезнающий Ott. Есть лаунчпад и несколько дисплеев от нокии 3310 с pcd8544. Есть у кого нить библиотека на данный дисплей?

msp430 launchpad перестал работать в windows 7 64
Оговорюсь сразу, проблема не в железе. Имею msp430 с m430g2553 на борту. В очередной раз подключаю launchpad к компьютеру, и energia...

msp430 soft uart modbus
Здравствуйте. Есть у меня msp430g2231. Я хочу сделать какой-никакой, но modbus rtu slave. В консоль контроллер отвечает вполне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru