Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 07.08.2018, 08:43   #1
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию прерывания, передача по UART

пжлста помогите разобраться...
вроде бы ситуация банальная, всё понятно и всё сделано правильно, а работает не так как надо .
Итак... PIC24FJ64GA002, перед началом передачи, прерывания в такой моде:


Код:
bset U1STA, #UTXISEL1; UTXISEL<1:0> := 0b10 -- Interrupt when a character is
 bclr U1STA, #UTXISEL0 ; transferred to the Transmit Shift Register (TSR), and as a
               ; result, the transmit buffer becomes empty
в обработчике по прерыванию соответственно закидываю по 4 байта в FIFO, параллельно проверяя на "последний байт". всё ОК.
задвинув в FIFO последний байт изменяю моду прерывания на:


Код:
bclr U1STA, #UTXISEL1   ; UTXISEL<1:0> := 0b01 -- Interrupt when the last character
 bset U1STA, #UTXISEL0  ; is shifted out of the Transmit Shift Register; all transmit
           ; operations are completed
делаю это для того чтобы, по окончанию передачи опустить линию DE (rs485) -- перейти на прием. и вот тут проблема ...
По осциллографу вижу, что DE опускается в 0 почти сразу после старт-бита последнего байта, соответственно последний байт не доходит до принимающей стороны.
т.е. получается, что прерывание происходит опять в моде "10" (FIFO полностью чист), хрень какая то. То что код перехода в моду "01" выполняется -- проверено.
Смущает (ИМХО) противоречие между фразами из FRM'а по UART:
Цитата:
While the UxTXIF flag bit indicates the status of the UxTXREG register, the TRMT bit
(UxSTA<8>) indicates the status of the UxTSR. The TRMT status bit is a read-only bit, which is
set when the UxTSR is empty. No interrupt logic is tied to this bit, so the user application has to
poll this bit to determine if the UxTSR is empty.
и вот другая:
Цитата:
• If UTXISEL<1:0> = 01, the UxTXIF bit is set when the last character is shifted out of the
UxTSR register. This implies that all the transmit operations are completed.
ведь в этой моде как раз и происходит прерывание по уже очищению TSR'а.


подскажите в чем проблема?

Последний раз редактировалось SergeyKN; 07.08.2018 в 08:51.
SergeyKN вне форума   Ответить с цитированием
Старый 07.08.2018, 11:42   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,923
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: прерывания, передача по UART

SergeyKN
поставьте в прерывании ловушку, которая смотрит состояние из модуля и отпишитесь, что видно.
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 12:16   #3
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию Re: прерывания, передача по UART

Цитата:
Сообщение от besogon Посмотреть сообщение
SergeyKN
поставьте в прерывании ловушку, которая смотрит состояние из модуля и отпишитесь, что видно.
сори вот это не понял состояние чего? если это про отладку под ICD3, то возможности такой нет (по ряду причин). Но по ряду экспериментов могу утверждать, что последнее прерывание, которое должно (как бы) быть в моде "01", происходит при еще непустом TSR'е -- т.е. бит U1STA.TRMT == 0 на протяжении передачи этого самого последнего байт, потом переходит в 1.
SergeyKN вне форума   Ответить с цитированием
Старый 07.08.2018, 12:34   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,923
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: прерывания, передача по UART

SergeyKN
нет возможности в прерывании сохранить состояние регистров и потом куда-нибудь как-нибудь передать?
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 12:58   #5
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию Re: прерывания, передача по UART

к сожалению мой пик последний в цепочке, до него чужой (мастер 485) ATS, который в свою очередь управляется win-прогой. к текстам программ обоих доступа нет.


может тада подскажете..... вот эта программа, с которой я трахаюсь довольно старая и проект весь сделан еще на MPLAB 8.88. Проблема эта не проявлялась, а сейчас наверно что то изменили по приему в ATS.



Сейчас уже естественно MPLAB X, там есть свитчер для драйвера ICD 3, он у меня несколько раз сработал (при переходе из MPLAB X в MPLAB 8 и обратно) а потом стал выдавать
Цитата:
MCHPDDS64 Process Error (6)
Could not invoke MCHPDDS64 application
MCHPDDS64 was not found or does not have permission to run OR Switcher not 'run as administrator'.
я немного потыркался -- не получилось и плюнул, так что ICD3 у меня только в MPLAB X теперь. вот бы щас переключить его на 8ку.


если вдруг эта тема уже обсуждалась, то сори, хотя бы ссыль ткните
SergeyKN вне форума   Ответить с цитированием
Старый 07.08.2018, 13:34   #6
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 45
Сообщений: 478
Вес репутации: 1181/59
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: прерывания, передача по UART

Цитата:
Сообщение от SergeyKN Посмотреть сообщение
в обработчике по прерыванию соответственно закидываю по 4 байта в FIFO
..линию DE (rs485) -- перейти на прием. и вот тут проблема
ведь в этой моде как раз и происходит прерывание по уже очищению
Закидывайте по 5 байт, т.е. Ваши 4 байта и 5й какой угодно.

На 5м прерывании из TSR уйдет 4 байта в линию, 5й байт не отправляйте, дергайте DE, и т.п.
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 07.08.2018, 13:54   #7
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию Re: прерывания, передача по UART

Цитата:
Сообщение от bzx Посмотреть сообщение
Закидывайте по 5 байт, т.е. Ваши 4 байта и 5й какой угодно.

На 5м прерывании из TSR уйдет 4 байта в линию, 5й байт не отправляйте, дергайте DE, и т.п.
неее.... может я не оч внятно написал в 1ом посте, разжую... пример, самая короткая посылка (по протоколу) 14 байт:
1) 1ый и 2ой байты запихиваю в УАРТ НЕ в прерывании пока идут эти байты формирую пакет данные там, ЦРЦ и т.п.
2) происходит 1ое прерывание, засовываю в УАРТ 3,4,5,6ой байты
3) происходит 2ое прерывание, засовываю в УАРТ 7,8,9,10ый байты
4) происходит 3е прерывание, засовываю в УАРТ 11,12,13,14ый байты, вижу что пакет весь -- меняю UTXISEL на "01"
5) происходит 4е прерывание, DE в 0 -- оно должно произойти уже после очищения TSR'а, а по факту в TSR'е еще лежит 14ый байт и выталкивается в этот момент на Tx.
SergeyKN вне форума   Ответить с цитированием
Старый 07.08.2018, 16:33   #8
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию Re: прерывания, передача по UART

через ж...у конечно , но... сделал вывод состояний U1STA.UTXISEL0 и U1STA.UTXISEL1 на свободных ножках пика (в конце обработчика прерывания) -- 100% состояния меняются как положено 10 в 01 и наоборот, в положенные моменты времени, но мода 01 упорно не работает согласно описанию из даташита. пробовал менять очередность установки/сброса бита -- ни фига.

пичаль, тупик.
SergeyKN вне форума   Ответить с цитированием
Старый 07.08.2018, 16:47   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,923
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: прерывания, передача по UART

SergeyKN
может быть старый добрый костыль с запуском таймера и по таймеру?
besogon вне форума   Ответить с цитированием
Старый 07.08.2018, 18:20   #10
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,167
Вес репутации: 1775/72
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: прерывания, передача по UART

Цитата:
Сообщение от SergeyKN Посмотреть сообщение
пжлста помогите разобраться...
вроде бы ситуация банальная, всё понятно и всё сделано правильно, а работает не так как надо .
Итак... PIC24FJ64GA002

подскажите в чем проблема?
http://ww1.microchip.com/downloads/e.../80000470j.pdf
52. Module: UART (Transmit Interrupt)
When using UTXISEL = 01 (interrupt when the last character is shifted out of the Transmit Shift Register) and the final character is being shifted out through the Transmit Shift Register (TSR), the TX interrupt may occur before the final bit is shifted out.

Work around
If it is critical that the interrupt processing occurs only when all transmit operations are complete, after which the following work around can be implemented:
Hold off the interrupt routine processing by adding a loop at the beginning of the routine that polls the Transmit Shift Register empty bit, as shown in Example 2.

// in UART2 initialization code
...
U2STAbits.UTXISEL0 = 1; // Set to generate TX interrupt when all
U2STAbits.UTXISEL1 = 0; // transmit operations are complete.
...
U2TXInterrupt(void)
{
while(U2STAbits.TRMT==0); // wait for the transmit buffer to be empty
... // process interrupt
Илья вне форума   Ответить с цитированием
Старый 08.08.2018, 09:13   #11
SergeyKN
Senior Member
 
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/44
SergeyKN will become famous soon enoughSergeyKN will become famous soon enough
По умолчанию Re: прерывания, передача по UART

Код:
            btss        U1STA, #TRMT
            bra        $-2
эту затычку я сделал сразу, хотя обидно, что не долистал до 52ой ошибки ... так же сразу открыл Ерату, несколько раз перечитал ошибки с 11 по 16, и почему то решил что дальше уже про УАРТ ничего не будет (надо же так облажаться).
с таким решением у меня получается в прерывании аж 27мкс программа тусит -- фуууу... думал есть решение более изящное.

ну раз это официальный обходняк, тогда наверно закрываем тему, всем большое спасибо.
SergeyKN вне форума   Ответить с цитированием
Старый 08.08.2018, 10:14   #12
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,167
Вес репутации: 1775/72
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: прерывания, передача по UART

Цитата:
Сообщение от SergeyKN Посмотреть сообщение
не долистал до 52ой ошибки
В PIC24FJ64GA102 ошибок гораздо меньше, но эта то же присутствует.
PIC24FJ64GA702 - дешевле в 2 раза и без таких ошибок
Илья вне форума   Ответить с цитированием
Старый 08.08.2018, 12:43   #13
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,923
Вес репутации: 3528/78
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: прерывания, передача по UART

SergeyKN
в прерывании аж 27мкс программа тусит - скорее прочего зависит от baud rate.
besogon вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача по USB xxparaodoxx Вопросы начинающих 7 03.01.2011 00:09
Прерывания по PORTB Vidoc Продукция MICROCHIP 66 12.10.2009 19:46
Обмен с ПК по UART. Как VS2005 заставить игнорировать 0Х27 и продолжать прием? majorPAE Общетехнические вопросы 16 30.03.2008 15:37
Передача по радиоканалу с помощью USART Валерий Продукция MICROCHIP 14 29.03.2007 19:13
Передача данных по радиоканалу Валерий Общетехнические вопросы 2 04.03.2007 15:27


Часовой пояс GMT +3, время: 23:47.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot