|
MSP430F149, прерывания USART., Странный порядок... |
|
|
|
Jul 17 2009, 06:05
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
RS485. Хочу управлять направлением передачи без таймера. План был такой: не отключать приёмник у драйвера 485, ловить эхо переданных символов, и по приёму последнего символа отключать передатчик. Пишу: Код // прерывание по приёму. void rx_interrupt(void) { if (is_tx_on()) // передатчик включен? { if (!tx_on_) // передача окончена? tx_off(); // отключаем передатчик. } else // обычный приём. { RxBuf.put(RXBUF0); } }
// прерывание по передаче void tx_interrupt(void) { if (TxBuf.is_empty()) { tx_on_ = false; } else TXBUF0 = TxBuf.get(); } }; Вроде бы всё логично. Сначала опустошается TXBUF0, возникает прерывание tx_interrupt, я сбрасываю флажок tx_on_. Затем этот последний символ принимается, возникает прерывание по приёму, я отключаю передатчик. Но. Почему-то сначала возникает прерывание по приёму, а лишь затем - по опустошению передатчика! Как такое может быть?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
|
Jul 17 2009, 09:23
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Ещё один эксперимент. Код void test_UART() { U0TXBUF = 0x5a; P6OUT |= 1; for(; IFG1 & UTXIFG0 == 0;); P6OUT |= 4; for(;UART0.uart->utctl.txept == 0;); P6OUT &= ~5; } Итого: На обеих ногах импульс длительностью 8,5 мс То есть: TXIFG формируется сразу же, как только кинули байт в буфер. 10 мкс в прошлом разе - это время выполнения обработчика прерывания. То есть, по всей вероятности, в момент прерывания TXEPT уже торчит. Попутно ткнулся в выходной сигнал и обнаружил, что начало стартового бита запаздывает относительно момента записи в сдвиговый регистр на 400 мкс, то есть половину битового интервала. Щас гляну ещё конец. Что и требовалось доказать. TXEPT (по которому предположительно вызывается прерывание), тоже отодвинут на пол-интервала от конца стопового бита
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 17 2009, 09:49
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(MrYuran @ Jul 17 2009, 15:23)  Итого: На обеих ногах импульс длительностью 8,5 мс На каких на обеих? А, понял  Цитата То есть: TXIFG формируется сразу же, как только кинули байт в буфер. Для первого символа - да. Ибо U0TXBUF сразу же перезаписывается в сдвиговый регистр и опустошается. Цитата 10 мкс в прошлом разе - это время выполнения обработчика прерывания. То есть, по всей вероятности, в момент прерывания TXEPT уже торчит. Да там вроде команд не так много  Цитата Попутно ткнулся в выходной сигнал и обнаружил, что начало стартового бита запаздывает относительно момента записи в сдвиговый регистр на 400 мкс, то есть половину битового интервала. Только всё же не в сдвиговый регистр, а в буфер передачи. Сдвиговый регистр - он унутре, и не доступен программисту  Цитата TXEPT (по которому предположительно вызывается прерывание), тоже отодвинут на пол-интервала от конца стопового бита Я всё же сильно сомневаюсь, что TXEPT влияет на возникновение прерывания. Попробуйте писать пару символов сразу, картина изменится. (я, к сожалению не нашёл второго луча  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 17 2009, 10:51
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(AHTOXA @ Jul 17 2009, 13:49)  Попробуйте писать пару символов сразу, картина изменится. (я, к сожалению не нашёл второго луча  ) Глянул. Забавная картина. Передаю 7 байтов подряд, в начале и конце обработчика TX_ISR машу ногой вверх/вниз. И что же? ровно в середине каждого стартового бита вижу тоненькую палку. Ничего не понимаю! (с)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 17 2009, 11:14
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(MrYuran @ Jul 17 2009, 16:51)  ровно в середине каждого стартового бита вижу тоненькую палку. Ничего не понимаю! (с) Дык, это как раз нормально  Стартовый бит пошёл - буфер передатчика освободился (отправлен в сдвиговый регистр) - прерывание. У меня возникли подозрения, что я банально пропускаю прерывание. Проц очень сильно нагружен, там scmRTOS, дисплей, то, сё... На сегодня плюнул, в понедельник буду ставить более чистый эксперимент
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
AHTOXA MSP430F149, прерывания USART. Jul 17 2009, 06:05 Dog Pawlowa Цитата(AHTOXA @ Jul 17 2009, 09:05) Но. П... Jul 17 2009, 06:35 MrYuran Цитата(Dog Pawlowa @ Jul 17 2009, 10:35) ... Jul 17 2009, 07:10  Dog Pawlowa Цитата(MrYuran @ Jul 17 2009, 10:10) Вряд... Jul 17 2009, 07:20   AHTOXA Цитата(MrYuran @ Jul 17 2009, 13:10) Стоп... Jul 17 2009, 07:49    MrYuran Цитата(AHTOXA @ Jul 17 2009, 11:49) То ес... Jul 17 2009, 08:37     AHTOXA Цитата(MrYuran @ Jul 17 2009, 14:37) Возм... Jul 17 2009, 09:05 =DS= Цитата(AHTOXA @ Jul 17 2009, 10:05) Но. П... Jul 17 2009, 16:40 AHTOXA Цитата(=DS= @ Jul 17 2009, 22:40) У UART ... Jul 17 2009, 16:49  =DS= Цитата(AHTOXA @ Jul 17 2009, 20:49) Да не... Jul 17 2009, 17:20   MrYuran Цитата(=DS= @ Jul 17 2009, 21:20) Не поле... Jul 17 2009, 18:20    =DS= Цитата(MrYuran @ Jul 17 2009, 22:20) Номе... Jul 17 2009, 18:27     AHTOXA И правда
Но у меня дело точно не в этом. В пон... Jul 17 2009, 19:47      AHTOXA Докладываю, всё в порядке, нашёл в чём проблема
Я ... Jul 20 2009, 09:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|