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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

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

Если этот алгоритм верен. То хотелось бы его рассмотреть более детально.
1.

Код: Выделить всё

  UCA0CTL1 |= UCSWRST; 
  UCA0CTL1 |= UCSSEL_2;
  UCA0BR0 = 0x68; 
  UCA0BR1 = 0x00;
  UCA0MCTL = 0x04;
  UCA0CTL1 &= ~UCSWRST; 
UCA0MCTL что это и с чем его едят?
Со вторым пунктом непонятно. Как получать данные? Как настроить Rx Tx что бы по USB передавались данные? Аналогично с получением.
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

По поводу регистра, посмотрите его писание в ДШ (стр. 431)
http://www.ti.com/lit/ug/slau144j/slau144j.pdf

Насчет конфигурации UART, советую начать с прочтения книги J. Davies "MSP430 microcontroller basics"
http://www.amazon.com/MSP430-Microcontr ... 0750682760
(видел также ее в сети для скачивания). В ней есть примеры работы с периферией. Примеры можно также скачать на сайте ТИ.
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

То что этот регистр отвечает за модуляцию (что, собственно написано в ДШ), мне понятно. Не понятно применение.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Детальное объяснение использования этого регистра приведено в секции 15.3.9 ДШ. Там-же в секции 5.3.13 приведены таблицы значений этого регистра для различных скоростей передачи.
Реклама
Эиком - электронные компоненты и радиодетали
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Код: Выделить всё

#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;		// **Initialize 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. Может кто глянет опытным глазом?
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Код: Выделить всё

        UCA0BR0 = 0x03;              // Делитель частоты для SMCLK (1000000 / 9600).
        UCA0BR1 = 0x03;
Если хотите скорость 9600, то согласно таблице 15-4 в ДШ нужно UCA0BR = 104

Код: Выделить всё

        UCA0BR0 = 104 ;              // Делитель частоты для SMCLK (1000000 / 9600).
        UCA0BR1 = 0;
А это зачем?

Код: Выделить всё

      IE2 |= UCA0RXIE;         // Включаем UART обратно.
У Вас-же нет обработчика прерываний.
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Та тут я оставил куски программы от другого варианта.
Мне удалось понять причину, почему ничего не выводится.

Код: Выделить всё

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.
Несмотря на то что в цикле она проинициализирована, и даже правильно определяется число символов в строке, тем неменее на протяжении всего цикла

Код: Выделить всё

 i = <unavailable>
не могу сообразить почему?
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Отвечу сам себе. проблема была не в этом, видимо на этапе проверки буфера приема программа уходит в бесконечный цикл.

Код: Выделить всё

while (!(IFG2&UCA0TXIFG));
. Не ясно почему.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Вот Вам рабочий код. Проверил только что на Launchpad. Компилировал на IAR IDE версия 6.6.

Код: Выделить всё

#include "msp430.h"

void initUART();
void UARTWriteString(char *str);
char *str = "Hello world!";

int main(void) 
{
	WDTCTL = WDTPW | WDTHOLD;   
 	DCOCTL = CALDCO_1MHZ;
	BCSCTL1 = CALBC1_1MHZ;
	initUART();
	while(1)
        UARTWriteString(str);
}

void initUART()
{
	P1SEL = BIT1 + BIT2 ;       
	P1SEL2 = BIT1 + BIT2 ;      
	UCA0CTL1 |= UCSWRST;        
	UCA0CTL1 |= UCSSEL_2;      
                             
        UCA0BR0 = 104;              
        UCA0BR1 = 0;
        UCA0MCTL = UCBRS0;   
        UCA0CTL1 &= ~UCSWRST;      
//        IE2 |= UCA0RXIE;         
}

void UARTWriteString(char *str)
{
	for (int i = 0; str[i]; i++)
	{
		while (!(IFG2&UCA0TXIFG));
		UCA0TXBUF = str[i]; 
	}
}
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Спасибо большое, однако дело, видимо не в коде. Я программу писал опираясь на примеры от ti. Однако решил себя проверить и загрузить пример в мк. Ни один из них не отсылает ничего. С джамперами играл, ничего не выходит.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Если это новый вопрос или просьба о дальнейшей помощи, то я не понял что Вы хотите узнать.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Ser60 писал(а):Если это новый вопрос или просьба о дальнейшей помощи, то я не понял что Вы хотите узнать.
Я очень извиняюсь, что, возможно задаю много вопросов (глупых). Без этого не научиться.
Просто не подскажете, в чем может быть проблема, если у меня ни один из примеров, в том числе и Ваш, не хотят запускаться. (Я в терминале не вижу той строки, которая мне нужна.)
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Мне сложно сказать в чем может быть проблема, не видя что Вы делаете. Джамперы на Launchpad должны стоять как на второй снизу картинке в моей статье http://radiokot.ru/circuit/analog/receiv_transmit/33/. Может у Вас терминальная программа не настроена на соответствующую скорость порта (9600), может и не на тот порт. Попробуйте установить терминалку ту, что описана в статье.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Спасибо большое!!! Ваша статья помогла мне разобраться!!! Я не разомкнул J3 и основное тактирование не настроил.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Поздравляю! А на будущее - здесь по Launchpad есть специальная тема.
http://radiokot.ru/forum/viewtopic.php?f=62&t=42019
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Еще вопрос. А есть ли рецепт как передавать другие типы данных? int? float и т.д.
Последний раз редактировалось TmYAG Пт окт 18, 2013 22:43:14, всего редактировалось 3 раза.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Точно также, как и байты. Int, например, занимает 2 байта, вот их и передавайте по-очереди, а на приемном конце собирайте их в клас int.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Попробовал сам. допустим у меня как в исходной задаче в переменной t хранится значение температуры, полученное с датчика с помощью int tempOUT() функции. Как в этом случае быть? Похоже на правду?

Код: Выделить всё

__interrupt void usart1_tx (void)
{
count = sizeof t;
if (count != 0)
{
    count--;
    UCA0TXBUF = t[count + 1];
}
}
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

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

Сообщение Ser60 »

Это легко самому проверить, попробовав скомпилировать. Если t типа int то компилятору не понравится обращение к ней как к массиву.

Я-бы сделал на передающем конце так:

Код: Выделить всё

  float f = 0x1234;
  int count = sizeof f;
  while (count)
  {
    while (!(IFG2&UCA0TXIFG));
    count--;
    UCA0TXBUF = *((char*) &f + count);
  }
При этом 4-байтная переменная f будет передана от старшего байта к младшему.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

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

Сообщение TmYAG »

Это легко самому проверить, попробовав скомпилировать. Если t типа int то компилятору не понравится обращение к ней как к массиву.
Собственно так и было.
Но для того, чтобы разобраться.
Если бы я объявил:

Код: Выделить всё

int *t;
int f();
....
t = f();//на такую запись тоже ругается(((
//и даьше пересылать указатель
насколько я понял выход только явно приводить типы?
Кстати в терминале я получаю одни точки, я так понял это некие символы команды. А как увидеть сами данные?
Вложения
Снимок.PNG
(27.18 КБ) 690 скачиваний
Ответить

Вернуться в «Разные вопросы по МК»