• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
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 в заголовках вроде бы не отвечает стандарту Си.

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

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Cobban    114

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

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

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

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

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

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

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

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

while (!(IFG2&UCA0RXIFG));

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

  • Одобряю 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас