![]() |
|
|
Продукция MICROCHIP Технические вопросы по всей продукции Microchip |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 | ||
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]()
пжлста помогите разобраться...
вроде бы ситуация банальная, всё понятно и всё сделано правильно, а работает не так как надо ![]() Итак... 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 задвинув в 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 опускается в 0 почти сразу после старт-бита последнего байта, соответственно последний байт не доходит до принимающей стороны. т.е. получается, что прерывание происходит опять в моде "10" (FIFO полностью чист), хрень какая то. То что код перехода в моду "01" выполняется -- проверено. Смущает (ИМХО) противоречие между фразами из FRM'а по UART: Цитата:
Цитата:
подскажите в чем проблема? Последний раз редактировалось SergeyKN; 07.08.2018 в 08:51. |
||
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,975
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
SergeyKN
поставьте в прерывании ловушку, которая смотрит состояние из модуля и отпишитесь, что видно. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]() Цитата:
![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,975
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
SergeyKN
нет возможности в прерывании сохранить состояние регистров и потом куда-нибудь как-нибудь передать? |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]()
к сожалению мой пик последний в цепочке, до него чужой (мастер 485) ATS, который в свою очередь управляется win-прогой. к текстам программ обоих доступа нет.
может тада подскажете..... вот эта программа, с которой я трахаюсь довольно старая и проект весь сделан еще на MPLAB 8.88. Проблема эта не проявлялась, а сейчас наверно что то изменили по приему в ATS. Сейчас уже естественно MPLAB X, там есть свитчер для драйвера ICD 3, он у меня несколько раз сработал (при переходе из MPLAB X в MPLAB 8 и обратно) а потом стал выдавать Цитата:
если вдруг эта тема уже обсуждалась, то сори, хотя бы ссыль ткните |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
|
![]() Цитата:
На 5м прерывании из TSR уйдет 4 байта в линию, 5й байт не отправляйте, дергайте DE, и т.п.
__________________
Для связи email: info собака qbit.su |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]() Цитата:
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. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]()
через ж...у конечно
![]() пичаль, тупик. ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,975
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
SergeyKN
может быть старый добрый костыль с запуском таймера и по таймеру? |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,167
Вес репутации: 1775/72 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
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 |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Регистрация: 13.08.2007
Сообщений: 159
Вес репутации: 111/45 ![]() ![]() |
![]() Код:
btss U1STA, #TRMT bra $-2 ![]() с таким решением у меня получается в прерывании аж 27мкс программа тусит -- фуууу... думал есть решение более изящное. ну раз это официальный обходняк, тогда наверно закрываем тему, всем большое спасибо. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,167
Вес репутации: 1775/72 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#13 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,975
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
SergeyKN
в прерывании аж 27мкс программа тусит - скорее прочего зависит от baud rate. |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача по 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 |