FrostedVic

Msp430. Uart. Помогите Новичку

2 сообщения в этой теме

FrostedVic    0

Всем привет! Возник вопрос о том как осуществить передачу данных по UART.

#include "msp430.h"
/*
* main.c
*/
//const char string[] = { "Hello World\r\n" };
void initADC(void);
int tempOUT(void);
void initUART();

int main(void) {
int t ;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
initADC();
initUART();
//__bis_SR_register(CPUOFF + GIE);
while(1)
{
__delay_cycles(1000);//Сюда нужно передавать задержку переданную с компа
t = tempOUT();
__delay_cycles(1000);//...и сюда
}
return 0;
}
void initADC()
{
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON; // Включаем АЦП
ADC10CTL1=INCH_10+ ADC10DIV_3;//Канал с которого ведется преобразование 10(INCH_10)
	 //ADC10DIV_3- контролирует время разрешенное на преобразование
}
int tempOUT()
{
int T = 0;
int tmp = 0;
ADC10CTL0 |= ENC + ADC10SC; //Включаем преобразование когда ENC = 1
	 //Начинам преобразование, когда ADC10SC = 1
while(ADC10CTL1 & ADC10BUSY);
T = ADC10MEM;
ADC10CTL0&=~ENC;
tmp = (0.413 * T - 277.7 );
return(int)(tmp);
}
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(char ch)
{
//тестовый посыл в uart-порт
int strSize = sizeof();
for(int i = 0; i < strSize; i++)
{
//WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
while (!(IFG2&UCA0TXIFG))
; // Проверка готовности буфера отправки.
UCA0TXBUF = str[i];
}
}*/

Как инициализировать я разобрался. А вот как передать значение температуры догнать не могу. На хабре наткнулся на статью http://habrahabr.ru/post/137719/ .Там все просто для понимания, однако string в заголовках вроде бы не отвечает стандарту Си.

Нашел еще примеры с прерываниями, и реализация на таймере. И тут совсем запутался. Как все-таки осуществить прием и передачу данных? Какие тонкости? Заранее благодарю!

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


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

А что непонятно-то?

Сходу пару замечаний.

IE2 |= UCA0RXIE; // Включаем UART обратно.

Вот это совершенно ни к чему, т.к. прерывания ты всё равно не используешь.

Для передачи используй:

while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = очередной байт данных;

Т.е. дожидаемся освобождения буфера передатчика и закидываем в него очередной байт данных. Можно засунуть в цикл и повторять сколько надо.

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

while (!(IFG2&UCA0RXIFG));

Ждём установки флага прерывания. После этого читаем UCA0RXBUF - там принятый байт.

  • Одобряю 1

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


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • @Крашер да.некоторые парни малость перебарщивают..но все-таки в этом случае ТС надо бы обратиться к мастеру(что-бы в конец не угробить)..а хамить тут любят..этакие великие Гуру..
    • Сегодня весь вечер провозился с оплатой 50 рублей за микросхемы на Али, с карты Мастеркард. При попытке оплаты выходит вот такое сообщение, а не телефон, вместо суммы, приходит слово "ОТКАЗ":

      При повторных попытках оплаты  постоянно возникает вот такое сообщение:

      Потеряв кучу времени, решил переключить валюту, с рублей на доллары. И чудо... всё стало работать без проблем. Только в телефон, вместо рублей, пришла оплата в долларах. Я оплатил запрошенные 0,78 доллара, пересчитал их потом в рубли по остатку на карте, и получил цену товара, указанную в рублях. Т.е. всё ровно. Ради интереса попробовал переключить валюту на Евро... и получил то же самый ОТКАЗ и те же сообщения, как при попытке оплаты рублями.
      Что это за нововведение Сбербанка,.. для чего оно...  А может это какой-то глюк.. не понятно. Если у кого-то такое было, интересно узнать в чём причина.
    • Спасибо всем!   Q1 - это что за зверь? какой-то (какой) транзистор с диодом или что-то единое? 74AC00 =КФ1554ЛА3 так? и безопасно-ли использовать 9в?   спасибо, схему сохранил. для начала попробую ту, что с регуляторами
    • Ох а я думал уже все тут странно агрессивные) Погуглю через сингапурский прокси и вообще буду надеяться на лучшее и ждать доброго "гуру") Как вы верно себя описали)
    •   Да, не всё можно заменить русскими словами, чтоб смысл и ёмкость слова точно сохранить...   Русский язык вообще странный. Вот неряха - плохо. И ряха - плохо. Фигня какая-то...  _______________________________________________________________________________________________ Нарисовано как положено, слева вход, справа выход?!
    • @dimanaviator Дима! Хорошо, если бы Вы смогли контролировать частоту частотомером. В 90-х годах я собирал часы "Электроника 6" . Собрал 160 штук. Одни у меня до сих пор дома идут. В месяц спешат на 1 секунду. Бытовые кварцы ( не прецизионные ) имеют большой разброс частоты. Измерение я проводил частотомером Ч3-34а. Он хорош тем, что я могу видеть три разряда после запятой. То есть, например: 32768, 078. В режиме измерения у меня очень редко выпадал результат 32768, 000. Сначала я подстроечной ёмкостью установил 32768, 000. При последующем измерении было уже 32768, 099. Затем 32767, 979.
      Каждый раз я подкручивал подстроечный конденсатор и делал суточные замеры. Экспериментально пришёл к заключительному варианту 32767, 796. Получается, если частота кварца играет в течение суток, как в плюсовую, так и в минусовую сторону, среднее и получается 32768, 000. Такую настройку я проводил с каждыми часами и всегда добивался безупречной точности. Думаю, одна секунда в месяц это хороший результат!