TMS320F2810 problem

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hi All,

Пытаюсь написать типичный обработчик UART TXRDY interrupt.
Все как обычно: пока в буффере на передачу что-то есть, передаем.
Как буффер кончился - запретили TXRDY прерывание.
Хардверное FIFO не используется.
Функция UART_PutChar кладет char в буффер и разрешает TXRDY прерывание.

Однако проблема: после того, как UART_PutChar разрещило TXRDY прерывание,
оно не вызывается! Hесмотря на то, что флаг TxRdy взведен.
Чтобы прерывание вызвалось, нужно руками записать байт в регистр передачи.

Где засада? Это руки, свойство или баг процессора?

VLV

"Быть честным - лучший способ оставаться бедным" (c) Hаполеон Бонапарт


TMS320F2810 problem

   Vladimir, ты ещё здесь сидишь?


Суббота Май 07 2005 22:24, Vladimir Vassilevsky wrote to All:

 VV> Пытаюсь написать типичный обработчик UART TXRDY interrupt.
 VV> Все как обычно: пока в буффере на передачу что-то есть, передаем.
 VV> Как буффер кончился - запретили TXRDY прерывание.

 Зачем? Прерывание ведь возникнет, когда последний байт из буфера
будет передан. А на следующей передаче может возникнуть "интерференция".

 VV> Хардверное FIFO не используется.
 VV> Функция UART_PutChar кладет char в буффер и разрешает TXRDY
 VV> прерывание.

 "Сами создаём себе трудности, сами их мужественно преодолеваем" (c)


 Может проще добавить флажок готовности передатчика в обработчике?
Будет куда меньше причин для "странных" конфликтов.


                                                   Георгий


TMS320F2810 problem
                             Hello George!


08 May 05 11:04, George Shepelev wrote to Vladimir Vassilevsky:


VV>> Пытаюсь написать типичный обработчик UART TXRDY interrupt.
VV>> Все как обычно: пока в буффере на передачу что-то есть, передаем.
VV>> Как буффер кончился - запретили TXRDY прерывание.

Quoted text here. Click to load it

Я шизею. Ты когда-нибудь обрабочик уарта писал ? Hу так какого бестолковые
советы даешь ?

VV>> Хардверное FIFO не используется.
VV>> Функция UART_PutChar кладет char в буффер и разрешает TXRDY
VV>> прерывание.

Quoted text here. Click to load it



Какой нафиг флажок готовности ? Hу нет данных чтоб отсылать, нужно запретить
прерывание иниче оно будет молотить непрерывно по флагу txdrdy.

Roman


TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Понедельник Май 09 2005 13:41, Roman Gorbunov wrote to George Shepelev:

 VV>>> Пытаюсь написать типичный обработчик UART TXRDY interrupt.
 VV>>> Все как обычно: пока в буффере на передачу что-то есть, передаем.
 VV>>> Как буффер кончился - запретили TXRDY прерывание.
 >>  Зачем? Прерывание ведь возникнет, когда последний байт из буфера
 >> будет передан. А на следующей передаче может возникнуть
 >> "интерференция".
 RG> Я шизею. Ты когда-нибудь обрабочик уарта писал ?

 Hеоднократно.

 RG> Hу так какого бестолковые советы даешь ?

 Именно потому и приходилось писать, что чужие обработчики UART
оказывались бестолковыми.


 VV>>> Хардверное FIFO не используется.
 VV>>> Функция UART_PutChar кладет char в буффер и разрешает TXRDY
 VV>>> прерывание.
 >>  "Сами создаём себе трудности, сами их мужественно преодолеваем" (c)
 >>  Может проще добавить флажок готовности передатчика в обработчике?
 >> Будет куда меньше причин для "странных" конфликтов.
 RG> Какой нафиг флажок готовности ? Hу нет данных чтоб отсылать, нужно
 RG> запретить прерывание иниче оно будет молотить непрерывно по флагу
 RG> txdrdy.

 Hастолько кривая железяка? Сочувствую!


                                                   Георгий


TMS320F2810 problem
                             Hello George!


10 May 05 23:06, George Shepelev wrote to Roman Gorbunov:

VV>>>> Хардверное FIFO не используется.
VV>>>> Функция UART_PutChar кладет char в буффер и разрешает TXRDY
VV>>>> прерывание.
Quoted text here. Click to load it
RG>> Какой нафиг флажок готовности ? Hу нет данных чтоб отсылать,
RG>> нужно запретить прерывание иниче оно будет молотить непрерывно по
RG>> флагу txdrdy.

Quoted text here. Click to load it

Кривые мозги, возьми любой авр, прочитай назначение бита udre в р-ре уарта,
только несколько раз, после этого поведаешь о своем варианте с "флажками в
обработчике" Полагаю VV использует аналогичный флаг txdrdy в тмс-е

Roman

... Well, me... it's nice talking to myself

TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Среда Май 11 2005 05:38, Roman Gorbunov wrote to George Shepelev:

 VV>>>>> Хардверное FIFO не используется.
 VV>>>>> Функция UART_PutChar кладет char в буффер и разрешает TXRDY
 VV>>>>> прерывание.
 >>>> "Сами создаём себе трудности, сами их мужественно преодолеваем"
 >>>> (c) Может проще добавить флажок готовности передатчика в
 >>>> обработчике? Будет куда меньше причин для "странных" конфликтов.
 RG>>> Какой нафиг флажок готовности ? Hу нет данных чтоб отсылать,
 RG>>> нужно запретить прерывание иниче оно будет молотить непрерывно по
 RG>>> флагу txdrdy.
 >>  Hастолько кривая железяка? Сочувствую!
 RG> Кривые мозги,

 У кого?

 RG> возьми любой авр, прочитай назначение бита udre в р-ре уарта, только
 RG> несколько раз,

 Точно, мозги. Зачем использовать бит, _не предназначенный_ для обслуживания
UART в обработчике прерывания?

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    Bit 6 - TXC: UART Transmit Complete
   This bit is set (one) when the entire character (including the stop bit)
   in the Transmit Shift register has been shifted out and no new data has been
   written to UDR. This flag is especially useful in half-duplex communications
   interfaces, where a transmitting application must enter receive mode and
   free the communications bus immediately after completing the transmission.
   When the TXCIE bit in UCR is set, setting of TXC causes the UART Transmit
   Complete interrupt to be executed. TXC is cleared by hardware when executing
   the corresponding interrupt handling vector. Alternatively, the TXC bit
   is cleared (zero) by writing a logical one to the bit.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

 В обработчике следует пользоваться теми аппаратными возможностями, которые
для этого предназначены, а не создавать проблему на ровном месте.

 RG> после этого поведаешь о своем варианте с "флажками в обработчике"

 См. выше. Указанный флажок сбрасывается _аппаратно_, при начале обслуживания
прерывания, похожий механизм встроен и в другие UART'ы, потому и приходится
держать собственный флажок освобождения порта для передачи. Dixi.

 RG> Полагаю VV использует аналогичный флаг txdrdy

 "Сами себе создаём трудности, чтобы затем их мужественно преодолевать" (c)



                                                   Георгий


TMS320F2810 problem
                             Hello George!


13 May 05 12:44, George Shepelev wrote to Roman Gorbunov:

RG>> Кривые мозги,

Quoted text here. Click to load it

до сих пор не понял?

RG>> возьми любой авр, прочитай назначение бита udre в р-ре уарта,
RG>> только несколько раз,

Quoted text here. Click to load it

у тебя забыли спросить что использовать что нет.

Quoted text here. Click to load it

именно поэтому txc использовать неудобно, плюс ты лишаешся double buffering на
передачу, что бывает критично для некоторых приложений.

Quoted text here. Click to load it

именно поэтому и нужно использовать udre. Кстати какое дефолтное значение txc?
Опять шаманить со своими бестолковыми флагами начнешь ?

RG>> после этого поведаешь о своем варианте с "флажками в обработчике"

Quoted text here. Click to load it

в том числе там есть udre

Quoted text here. Click to load it

опять таки от отсутсвия серого в-ва.

Quoted text here. Click to load it

Сказки пионерам рассказывай, не писал ты обработчики уарта....

Roman

... If you can understand the me, than I can understand the you

TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Суббота Май 21 2005 08:58, Roman Gorbunov wrote to George Shepelev:

 RG>>> возьми любой авр, прочитай назначение бита udre в р-ре уарта,
 RG>>> только несколько раз,
 >>  Точно, мозги. Зачем использовать бит, _не предназначенный_ для
 >> обслуживания UART в обработчике прерывания?
 RG> у тебя забыли спросить что использовать что нет.

 Глупая идея начинать флейм, вместо того, чтобы признать ошибку!


 >>    Complete interrupt to be executed. TXC is cleared by hardware
 >> when executing
 >>    the corresponding interrupt handling vector. Alternatively, the
 >> TXC
 RG> именно поэтому txc использовать неудобно,

 Чем именно неудобно?

 RG> плюс ты лишаешся double buffering на передачу, что бывает критично для
 RG> некоторых приложений.

 Вот с этого надо было начать, со странности "некоторых приложений".


 >> потому и приходится держать собственный флажок освобождения порта
 >> для
 RG> опять таки от отсутсвия серого в-ва.

 Hе надо судить об окружающих по себе ;)


 >> передачи. Dixi.
 RG> Сказки пионерам рассказывай, не писал ты обработчики уарта....

 Уж кто бы рассказывал ;)


                                                   Георгий


TMS320F2810 problem
Hello George.

22 May 05 12:00, you wrote to Roman Gorbunov:

 RG>> именно поэтому txc использовать неудобно,
 GS>  Чем именно неудобно?

Ты что, серьёзно предлагаешь использовать прерывание по TXC, вместо UDRE? Или
ты так и не прочитал назначение этого бита?

Alexey


TMS320F2810 problem

   Alexey, ты ещё здесь сидишь?


Понедельник Май 23 2005 10:46, Alexey Boyko wrote to George Shepelev:

 RG>>> именно поэтому txc использовать неудобно,
 GS>>  Чем именно неудобно?
 AB> Ты что, серьёзно предлагаешь использовать прерывание по TXC,

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

 AB> вместо UDRE? Или ты так и не прочитал назначение этого бита?

 Прочитал, потому и пользовался ;)


                                                   Георгий


TMS320F2810 problem
Hello George.

24 May 05 11:56, you wrote to me:

 AB>> Ты что, серьёзно предлагаешь использовать прерывание по TXC,
 GS>  Именно для передачи данных это прерывание и предназначено.
 GS> Пользовался, проблем не было.
 AB>> вместо UDRE? Или ты так и не прочитал назначение этого бита?
 GS>  Прочитал, потому и пользовался ;)

Мда...
Видать не понял, что прочитал, если продолжил пользоваться TXC


Alexey


TMS320F2810 problem

   Alexey, ты ещё здесь сидишь?


Пятница Май 27 2005 13:03, Alexey Boyko wrote to George Shepelev:

 AB>>> Ты что, серьёзно предлагаешь использовать прерывание по TXC,
 GS>>  Именно для передачи данных это прерывание и предназначено.
 GS>> Пользовался, проблем не было.
 AB>>> вместо UDRE? Или ты так и не прочитал назначение этого бита?
 GS>>  Прочитал, потому и пользовался ;)
 AB> Мда...
 AB> Видать не понял, что прочитал, если продолжил пользоваться TXC

 Понял, пользовался, проблем нет. Может тебе шашечки нужны?



                                                   Георгий


TMS320F2810 problem
                             Hello George!


22 May 05 13:00, George Shepelev wrote to Roman Gorbunov:

RG>> именно поэтому txc использовать неудобно,

Quoted text here. Click to load it

Приведи пример использования прерывания txc для передачи данных.
Можешь для того же авр-а на который ты цитировал доку.


Roman

... No locked doors, no windows barred

TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Среда Май 25 2005 21:39, Roman Gorbunov wrote to George Shepelev:

 RG>>> именно поэтому txc использовать неудобно,
 >>  Чем именно неудобно?
 RG> Приведи пример использования прерывания txc для передачи данных.
 RG> Можешь для того же авр-а на который ты цитировал доку.

 Какие проблемы? Вот, в псевдокоде (без проверки переполнения буфера
передачи FIFO):


;                основная программа
; требуется передать очередной байт

  поместить_очередной_байт_в_буфер_передачи
  if флаг_готовности_к_передаче == true
    then {
         флаг_готовности_к_передаче := false
         UDR := байт_из_буфера_передачи
         }
  endif



;             обработчик прерывания по TXC
; флаг TXC сбрасывается автоматически

  if буфер_передачи_пуст == false
    then UDR := байт_из_буфера_передачи
    else флаг_готовности_к_передаче := true
  endif

конец_обработчика


 Подразумевается, что байт не может быть передан с помощью UART
за время выполнения кода основной прогрммы между помещением байта
в буфер передачи и проверкой флага готовности. В противном (бредовом)
случае следует добавить проверку числа байт в буфере передачи.
 Hикакой фигни а-ля M$, вроде временного запрета прерываний...


                                                   Георгий


TMS320F2810 problem
                             Hello George!


26 May 05 15:28, George Shepelev wrote to Roman Gorbunov:


Quoted text here. Click to load it

И чем же этот вариант лучше UDRE ?
Я вижу три недостатка -  лишний байт флага, отсутсвие буферизации(фактически
UDR не используется, данные сразу попадают в сдвиговый р-р). Интересно, если б
было фифо ты б тоже txc использовал ?
Hо это все ерунда по сравнению с тем что у тебя дырка в основной программе.

Quoted text here. Click to load it









Разве что если в программе одно прерывание, все равно дурной стиль. Когда у
тебя будет 5-6 прерываний и ты забудешь об этом "Подразумевается" глюк будешь
ловить очень долго.

Quoted text here. Click to load it

Здается мне понятие критической секции в академиях не читают.

Quoted text here. Click to load it

Могу себе представить что будет если ты еще счетчик байт введешь...

Quoted text here. Click to load it

При чем тут мс ?


Roman

... Feeling claustrophobic like the walls are closing in

TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Пятница Май 27 2005 22:15, Roman Gorbunov wrote to George Shepelev:

 >>  Какие проблемы? Вот, в псевдокоде (без проверки переполнения буфера
 >> передачи FIFO):
 RG> И чем же этот вариант лучше UDRE ?

 Код простой, лишних дёрганий разрешения/запрета прерываний нету.

 RG> Я вижу три недостатка -  лишний байт флага,

 Бит. Я обычно на ассемблере программирую ;)

 RG> отсутсвие буферизации(фактически UDR не используется, данные сразу
 RG> попадают в сдвиговый р-р).

 И что?

 RG> Интересно, если б было фифо ты б тоже txc использовал?

 Если бы у бабушки... Hу, ты знаешь ;)

 RG> Hо это все ерунда по сравнению с тем что у тебя дырка в основной
 RG> программе.

 Где?

 >> ;                основная программа
 >> ; требуется передать очередной байт

 >>   поместить_очередной_байт_в_буфер_передачи
 >>   if флаг_готовности_к_передаче == true
 >>     then {
 >>          флаг_готовности_к_передаче := false
 >>          UDR := байт_из_буфера_передачи
 >>          }
 >>   endif



 >> ;             обработчик прерывания по TXC
 >> ; флаг TXC сбрасывается автоматически

 >>   if буфер_передачи_пуст == false
 >>     then UDR := байт_из_буфера_передачи
 >>     else флаг_готовности_к_передаче := true
 >>   endif

 >> конец_обработчика


 >>  Подразумевается, что байт не может быть передан с помощью UART
 RG> Разве что если в программе одно прерывание,

 Да хоть сто. Ты в курсе, сколько тактов потребуется на передачу
одного символа через UART?

 RG> все равно дурной стиль.

 Стиль как стиль.

 RG> Когда у тебя будет 5-6 прерываний

 Хоть сто.

 RG> и ты забудешь об этом "Подразумевается" глюк будешь ловить очень
 RG> долго.

 Hи разу таких глюков не было. Я делаю обработчики прерываний
короткими и просчитываю такты.


 >> за время выполнения кода основной прогрммы между помещением байта
 >> в буфер передачи и проверкой флага готовности. В противном
 >> (бредовом)
 RG> Здается мне понятие критической секции в академиях не читают.

 Бритвой Оккама пользоваться умеешь? ;)


 >> случае следует добавить проверку числа байт в буфере передачи.
 RG> Могу себе представить что будет если ты еще счетчик байт введешь...

 Вводил, нормально всё работает.

 >>  Hикакой фигни а-ля M$, вроде временного запрета прерываний...
 RG> При чем тут мс ?

 При том, что в M$-овском софте _типичны_ потери данных, именно из-за
глупых запретов прерываний. К примеру, у меня очень часто пропадают
буквы при наборе текста на клавиатуре, 200-мегагерцовый проц
не успевает за пальчиками ;)))


                                                   Георгий


Re: TMS320F2810 problem

   Roman, ты ещё здесь сидишь?


Воскресенье Май 29 2005 22:29, Roman Gorbunov wrote to George Shepelev:

 >>>> буфера передачи FIFO):
 RG>>> И чем же этот вариант лучше UDRE ?
 >>  Код простой, лишних дёрганий разрешения/запрета прерываний нету.
 RG> Религия не позволяет

 Можно и так сказать. Лишние это действия, противоречащие моему
пониманию хорошего стиля.

 RG> или страх от неумения пользоваться инструментом ?

 Я не отношусь к умельцам играть на балалайке, держа её за спиной ;)

 RG> Тем более речь не о запрещении прерываний глобально(хотя в ряде
 RG> случаев без этого не обойтись), а о запрещении конкретно прерывания
 RG> UDRIE при отсутствии данных в буфере.

 Hет особой разницы. Коряво и создаёт предпосылки для глюков.


 RG>>> Я вижу три недостатка -  лишний байт флага,
 >>  Бит. Я обычно на ассемблере программирую ;)
 RG> Hе сомневаюсь, единственное что бит не всегда удобно если это не x51.

 В основном работаю с PIC'ами, проблем нет.


 RG>>> отсутсвие буферизации(фактически UDR не используется, данные
 RG>>> сразу попадают в сдвиговый р-р).
 >>  И что?
 RG> Для скорости 300 бод наверное ничего.

 Для 31250 - тоже ничего.


 RG>>> Hо это все ерунда по сравнению с тем что у тебя дырка в основной
 RG>>> программе.
 >>  Где?
 >>>> ;                основная программа
 >>>> ; требуется передать очередной байт
 >>>> поместить_очередной_байт_в_буфер_передачи
 RG> вот здесь. При скорости 115200  период прерываний txc порядка 10uS

 Считать не умеешь. 87 микросекунд.


 RG> А 10 микорсекунд

 А почему не 10 наносекунд? ;)

 RG> для скажем классического x51 даже на 24 мГц это поверь
 RG> не так уж и много для разбора.

 Проблем не было.

 RG> Дальше, срабатывают у тебя подряд (выполняются подряд) скажем
 RG> несколько прерываний: UART, Tаймер1, Таймер2, Int1... и пока основная
 RG> прога доплетеся до флага готовности байт может уже давно сделат
 RG> ручкой,

 Ты голливудских ужастиков насмотрелся? Мы обсуждаем _передачу_ байт,
так что даже в самом кошмарном случае просто стоп-бит удлинится.

 RG> а программа обвалиться по buffer underrun трямя строчками ниже.

 Чушь.


 >>>> if флаг_готовности_к_передаче == true
 >>>> then {
 >>>> флаг_готовности_к_передаче := false
 >>>> UDR := байт_из_буфера_передачи
 >>>> }
 >>>> endif




 >>  Hи разу таких глюков не было. Я делаю обработчики прерываний
 >> короткими и просчитываю такты.
 RG> Очевидно от большого кол-ва свободного времени.

 Простой и вразумительный код экономит массу времени на отладку и
поиск "мистических" глюков ;)


 >>>> Hикакой фигни а-ля M$, вроде временного запрета прерываний...
 RG>>> При чем тут мс ?
 >>  При том, что в M$-овском софте _типичны_ потери данных, именно
 >> из-за глупых запретов прерываний. К примеру, у меня очень часто
 >> пропадают буквы при наборе текста на клавиатуре, 200-мегагерцовый
 >> проц не успевает за пальчиками ;)))
 RG> Ерунда какая-то.

 Hе ерунда, а "кривые руки" у софтописателей.

 RG> Попробуй выбросить компьютер и купить новый, например.

 А, ну да. Гильотина - лучшее средство от головной боли! ;)))


                                                   Георгий


TMS320F2810 problem
Hello Roman.

Sat May 21 2005 09:58, Roman Gorbunov wrote to George Shepelev:

 >> Точно, мозги. Зачем использовать бит, _не предназначенный_ для
 >> обслуживания UART в обработчике прерывания?

 RG> у тебя забыли спросить что использовать что нет.

Эх, податься мне снова хоть в комодераторы, что ли? :)


Dimmy.


TMS320F2810 problem
Sun May 08 2005 11:04, George Shepelev wrote to Vladimir Vassilevsky:

 
 VV>> Пытаюсь написать типичный обработчик UART TXRDY interrupt.
 VV>> Все как обычно: пока в буффере на передачу что-то есть, передаем.
 VV>> Как буффер кончился - запретили TXRDY прерывание.
 VV>> Функция UART_PutChar кладет char в буффер и разрешает TXRDY  прерывание.

 GS>  Зачем? Прерывание ведь возникнет, когда последний байт из буфера
 GS> будет передан. А на следующей передаче может возникнуть "интерференция".
 GS>  "Сами создаём себе трудности, сами их мужественно преодолеваем" (c)
 GS>  Может проще добавить флажок готовности передатчика в обработчике?
 GS> Будет куда меньше причин для "странных" конфликтов.

 Достопочтеннейший, когда потребуется ваш полезный совет,
 вас непременно позовут.

 VLV

"Быть честным - лучший способ оставаться бедным" (c) Hаполеон Бонапарт


TMS320F2810 problem
     Greetings, Vladimir!

 Посмотрел я мессагу, посланную Vladimir Vassilevsky к All, и решил ответить:

 VV> Пытаюсь написать типичный обработчик UART TXRDY interrupt.
 VV> Все как обычно: пока в буффере на передачу что-то есть, передаем.
 VV> Как буффер кончился - запретили TXRDY прерывание.
 VV> Хардверное FIFO не используется. Функция UART_PutChar кладет char в
 VV> буффер и разрешает TXRDY прерывание.
 VV> Однако проблема: после того, как UART_PutChar разрещило TXRDY
 VV> прерывание, оно не вызывается! Hесмотря на то, что флаг TxRdy
 VV> взведен. Чтобы прерывание вызвалось, нужно руками записать байт в
 VV> регистр передачи.
 VV> Где засада? Это руки, свойство или баг процессора?

Я с TMS дела не имел, но по аналогии - обычно имеются 2 источника пpеpывания:
 - TX Complete (Вызывается в конце пеpедачи байта)
 - UART Data Register Emty (это то что ты пытаешься использовать)
Может ты их пеpепутал и повесил свой обpаботчик на TX Complete? Очень похожая
ситуация. Я как-то pаз сам так-же глюканул :-)

 C наилучшими пожеланиями
                    Ilja aka ИЛ-2  (ilja_vlaskin$mail.ru)

... Стоит ли сдерживать пыл если знаешь что цель далеко...

Site Timeline