Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Uart обмен данными
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
EverGreen_
Здравствуйте
Имеется 149 кристал ,кварцевый резонатор 32кГц. Пытаюсь отправить потоком один и тот же символ
а также читать то что приходит. Результат отправки для начала смотрю
осциллографом на ноге Tx , но там постоянно высокий уровень. Также пытаюсь поставить
бряк в обработчике прерывания Rx но IAR почему то говорит что там точку останова ставить нельзя и
она становится бледно розовой .
вот код, в основном из примеров TI .
Скажите пожалуйста , что здесь не так
Код
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog
  P3SEL = 0x30;                             // P3.3,4 = USART0 TXD/RXD
  U0CTL = SWRST;
  ME1 |= UTXE0 + URXE0;                     // Enabled USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character, SWRST=1
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 9600 from 1Mhz
  UBR10 = 0x00;                             //
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                   // Enable USART0 RX interrupt
  IFG1 &= ~UTXIFG0;                         // Clear inital flag on POR
  _EINT();
  while(1){
       while ((IFG1 & UTXIFG0) == 0); //ждем пока буфер будет свободен
       TXBUF0 = 0x30;                       //отсылаем символ
  }
}
#pragma vector = USART0RX_VECTOR
__interrupt void RxD()
{
    char rec_char  = RXBUF0;
  
}
rezident
Цитата(EverGreen_ @ May 25 2009, 00:19) *
Имеется 149 кристал ,кварцевый резонатор 32кГц.
Было бы неплохо еще и модуль тактирования проинициализировать явными значениями.
Цитата(EverGreen_ @ May 25 2009, 00:19) *
Результат отправки для начала смотрю
осциллографом на ноге Tx , но там постоянно высокий уровень.
Вообще-то для использования UART функции пинов нужно конфигурировать так
Код
P3DIR|=0x10;
P3SEL|=0x30;

Цитата(EverGreen_ @ May 25 2009, 00:19) *
Также пытаюсь поставить
бряк в обработчике прерывания Rx но IAR почему то говорит что там точку останова ставить нельзя и
она становится бледно розовой .
Судя по тому, как вы объявили переменную, оптимизатор компилятора просто выбрасывает этот код. Объявляйте переменную rec_char либо как static char rec_char, либо хотя бы как volatile char rec_char.
EverGreen_
Спасибо за советы !
Модуль тактирования проинициализировал так
Код
BCSCTL1 |= (RSEL0+RSEL1+RSEL2);

Цитата
Вообще-то для использования UART функции пинов нужно конфигурировать так
Код
P3DIR|=0x10;
P3SEL|=0x30;

мне немного непонятна первая строка. Может все таки P3DIR | = BIT4 ??
Ведь Tx висит на P3.4.
Код
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                
  BCSCTL1 |= (RSEL0+RSEL1+RSEL2);
  U0CTL |= SWRST;
  U0CTL &= ~SWRST;
  P3SEL = 0x30;                            
  P3DIR |= BIT4;                          
  ME1 |= UTXE0 + URXE0;                    
  UCTL0 |= CHAR;                              
  UTCTL0 |= SSEL0;                            
  UBR00 = 0x03;                                
  UBR10 = 0x00;                                
  UMCTL0 = 0x4A;                          
  IE1 |= URXIE0;                          
    while(1){    
        while ((IFG1 & UTXIFG0)==0); //ждем когда буфер будет готов
       TXBUF0 = 0x30;                     // отсылаем символ
  }
}
#pragma vector = USART0RX_VECTOR
__interrupt void RxD()
{
  volatile char rec_char  = RXBUF0;
}

В этом случае на Tx наблюдается сигнал .
Подскажите пожалуйста , чем можно посмотреть те символы что я передаю . Я где то слышал на форуме , вроде от Вас ,rezident , что это можно сделать с помощью программы hyperterminal под Windows .Так же хочется отправить какой нибудь символ в обратную сторону .Объясните пожалуйста как.
rezident
Цитата(EverGreen_ @ May 25 2009, 21:05) *
мне немного непонятна первая строка. Может все таки P3DIR | = BIT4 ??
Ведь Tx висит на P3.4.
Да, конечно же четвертый бит. Я описку допустил.
Цитата(EverGreen_ @ May 25 2009, 21:05) *
Подскажите пожалуйста , чем можно посмотреть те символы что я передаю.
"Закольцуйте" символы. Т.е. в TXBUF складывайте те символы, которые получили из RXBUF. В терминале вы увидите их как "эхо". Можно посмотреть и с помощью гипертерминала, который есть в Windows. Но мне лично нравится Bray's Terminal.
EverGreen_
rezident , Спасибо! Все заработало!
den123
Кстати, если уж на то пошло, обязательно ли требуется задавать направление порта в PxDIR? - по моему достаточно установить PxSEL, т.к. для TX - output по умолчанию (конфигурацию периферии писал давно и сейчас пользую особо не задумываясь)
EverGreen_
И еще хотел спросить.
Мне в MK нужно передавать два параметра типа int. Как их отличить между собой при передаче ? К примеру первый параметр частота а второй время .Пока придумал только в PC программе преобразовывать эти числа в сhar , затем подставлять вперед символ 'T' или 'F' , затем в МК преобразовывать обратно в число и записывать в нужный(согласно первому символу )регистр .
Может есть какие либо другие варианты ??
den123
Может стоит обратить внимание на какой нибудь из стандартных протоколов обмена (очень пригодиться для последующего развития - например введение контроля ошибок в виде CRC, функций управления устройством и т.п.). А так для лабораторного использования можно использовать и данные идентификаторы.
rezident
Цитата(den123 @ May 26 2009, 15:43) *
Кстати, если уж на то пошло, обязательно ли требуется задавать направление порта в PxDIR? - по моему достаточно установить PxSEL, т.к. для TX - output по умолчанию (конфигурацию периферии писал давно и сейчас пользую особо не задумываясь)
Теоретически конечно достаточно P3SEL (и судя по блок-схеме input/output schematic в datasheet тоже), но практически ведь заработало только после того как P3DIR установили laughing.gif В своих программах я инициализирую все регистры портов GPIO причем явными значениями (а не наложением масок на значения по умолчанию). Поэтому тоже проблем не возникает.
Цитата(EverGreen_ @ May 26 2009, 15:58) *
Мне в MK нужно передавать два параметра типа int. Как их отличить между собой при передаче ?
Обычно для этого какой-либо протокол используют. В простейшем случае добавляются маркеры начала и конца пакета. В типовых протоколах еще и CRC в конце пакета добавляется. Посмотрите, например, как протокол Wake устроен.
EverGreen_
Спасибо за советы , буду разбираться с протоколами,так как еще планируется и передача данных в PC .
Цитата
но практически ведь заработало только после того как P3DIR установили

Практически заработало ,когда установил P3DIR, а также убрал строку IFG1 &= ~UTXIFG0; из первого варианта программы .
rezident
Цитата(EverGreen_ @ May 26 2009, 19:31) *
убрал строку IFG1 &= ~UTXIFG0; из первого варианта программы .
Правильно. Эта команда очищает флаг, который автоматически устанавливается только тогда, когда буфер передатчика UART готов к приему следующего байта (после сброса UART или при освобождения буфера после перемещения его текущего содержимого в сдвиговый регистр UART). Если вы сбросили UTXIFGx до того, как записали в буфер передатчика самый первый байт, то потом можно ждать его установки аж до морковкиного заговения laughing.gif
EverGreen_
Добрый день .
Объясните про прерывания UART на передачу . На прием все понятно - если приходит
байт в UART , то получается прерывание . А как на передачу? Когда передается байт происходит прерывание ? Для чего это нужно?
rezident
Цитата(EverGreen_ @ Aug 3 2009, 20:34) *
А как на передачу? Когда передается байт происходит прерывание ? Для чего это нужно?
Прерывание от передатчика возникает тогда, когда пуст его буферный регистр, т.е. его содержимое переписалось в сдвиговый регистр передатчика. Нужно это для того, чтобы между передачами последовательности символов не было пауз.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.