|
|
  |
Uart обмен данными, или помогите послать байт |
|
|
|
May 24 2009, 18:19
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
Здравствуйте Имеется 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; }
|
|
|
|
|
May 24 2009, 21:44
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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.
|
|
|
|
|
May 25 2009, 15:05
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
Спасибо за советы ! Модуль тактирования проинициализировал так Код 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 .Так же хочется отправить какой нибудь символ в обратную сторону .Объясните пожалуйста как.
|
|
|
|
|
May 25 2009, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(EverGreen_ @ May 25 2009, 21:05)  мне немного непонятна первая строка. Может все таки P3DIR | = BIT4 ?? Ведь Tx висит на P3.4. Да, конечно же четвертый бит. Я описку допустил. Цитата(EverGreen_ @ May 25 2009, 21:05)  Подскажите пожалуйста , чем можно посмотреть те символы что я передаю. "Закольцуйте" символы. Т.е. в TXBUF складывайте те символы, которые получили из RXBUF. В терминале вы увидите их как "эхо". Можно посмотреть и с помощью гипертерминала, который есть в Windows. Но мне лично нравится Bray's Terminal.
|
|
|
|
|
May 26 2009, 08:35
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
rezident , Спасибо! Все заработало!
|
|
|
|
|
May 26 2009, 09:43
|
Группа: Новичок
Сообщений: 10
Регистрация: 28-10-08
Пользователь №: 41 240

|
Кстати, если уж на то пошло, обязательно ли требуется задавать направление порта в PxDIR? - по моему достаточно установить PxSEL, т.к. для TX - output по умолчанию (конфигурацию периферии писал давно и сейчас пользую особо не задумываясь)
Сообщение отредактировал den123 - May 26 2009, 09:45
|
|
|
|
|
May 26 2009, 09:58
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
И еще хотел спросить. Мне в MK нужно передавать два параметра типа int. Как их отличить между собой при передаче ? К примеру первый параметр частота а второй время .Пока придумал только в PC программе преобразовывать эти числа в сhar , затем подставлять вперед символ 'T' или 'F' , затем в МК преобразовывать обратно в число и записывать в нужный(согласно первому символу )регистр . Может есть какие либо другие варианты ??
Сообщение отредактировал EverGreen_ - May 26 2009, 10:00
|
|
|
|
|
May 26 2009, 10:10
|
Группа: Новичок
Сообщений: 10
Регистрация: 28-10-08
Пользователь №: 41 240

|
Может стоит обратить внимание на какой нибудь из стандартных протоколов обмена (очень пригодиться для последующего развития - например введение контроля ошибок в виде CRC, функций управления устройством и т.п.). А так для лабораторного использования можно использовать и данные идентификаторы.
|
|
|
|
|
May 26 2009, 12:40
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(den123 @ May 26 2009, 15:43)  Кстати, если уж на то пошло, обязательно ли требуется задавать направление порта в PxDIR? - по моему достаточно установить PxSEL, т.к. для TX - output по умолчанию (конфигурацию периферии писал давно и сейчас пользую особо не задумываясь) Теоретически конечно достаточно P3SEL (и судя по блок-схеме input/output schematic в datasheet тоже), но практически ведь заработало только после того как P3DIR установили  В своих программах я инициализирую все регистры портов GPIO причем явными значениями (а не наложением масок на значения по умолчанию). Поэтому тоже проблем не возникает. Цитата(EverGreen_ @ May 26 2009, 15:58)  Мне в MK нужно передавать два параметра типа int. Как их отличить между собой при передаче ? Обычно для этого какой-либо протокол используют. В простейшем случае добавляются маркеры начала и конца пакета. В типовых протоколах еще и CRC в конце пакета добавляется. Посмотрите, например, как протокол Wake устроен.
|
|
|
|
|
May 26 2009, 13:31
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
Спасибо за советы , буду разбираться с протоколами,так как еще планируется и передача данных в PC . Цитата но практически ведь заработало только после того как P3DIR установили Практически заработало ,когда установил P3DIR, а также убрал строку IFG1 &= ~UTXIFG0; из первого варианта программы .
|
|
|
|
|
Aug 3 2009, 14:34
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 26-01-09
Пользователь №: 43 973

|
Добрый день . Объясните про прерывания UART на передачу . На прием все понятно - если приходит байт в UART , то получается прерывание . А как на передачу? Когда передается байт происходит прерывание ? Для чего это нужно?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|