ZEbr 0 6 февраля, 2016 Опубликовано 6 февраля, 2016 (изменено) · Жалоба Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами. Заранее спасибо!!!! Изменено 6 февраля, 2016 пользователем ZEbr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 12 6 февраля, 2016 Опубликовано 6 февраля, 2016 · Жалоба Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами. Заранее спасибо!!!! Значит что-то не почистили, или не все выгребли из FIFO, или еще что, смотрите сами внимательно что у Вас разрешено и в какой момент запрещается. Анализ взведенных флагов покажет, почему произошло прерывание. Кстати, если вдруг у Вас однозначный полудуплекс- на время передачи прерывание по приему вообще запрещайте. А перед его разрешением почистите все флаги и буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZEbr 0 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 12 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2. Чудес не бывает. Если Вы проверяете под отладчиком- так сам факт вывода на экран содержимого буфера приема является чтением из FIFO, и структура флагов может измениться. Попробуйте при входе в прерывание скопировать куда-то содержимое регистров разрешения прерываний и регистров флагов прерываний. И уже после этого останавливайте программу и анализируйте сохраненное чтобы понять лт чего произошло прерывание. Кстати, заодно и проверите что изменилось в этих регистрах с момента входа в прерывание до момента когда Вы смотрите содержимое этих регистров под отладчиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
volodya_t 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами. Заранее спасибо!!!! Для полноценного ответа желательно фрагменты кода видеть. По памяти - прерывание передатчика генерируется при готовности буфера передачи. При передаче последнего запрещают прерывание передачи, в обработчике UART (общем для приема и передачи) проверяются флаг прерывания и разрешение прерывания. void RxControl(void) { UINT8 tmp; if(INTGetEnable(INT_UxRX)) { if(INTGetFlag(INT_UxRX)) { while(UxSTAbits.URXDA) { tmp = UxRXREG; /* обработка принятого */ } INTClearFlag(INT_UxRX); } } } void TxControl(void) { if(INTGetEnable(INT_UxTX)) { if(INTGetFlag(INT_UxTX)) { while( !( UxSTAbits.UTXBF ) ) { UxTXREG = /*источник*/; if(/*конец посылки*/) { mDisableUxTX_INT(); break; } } INTClearFlag(INT_UxTX); } } } /*-----------------------------------------------------------*/ void vUxInterruptHandler( void ) { TxControl(); RxControl(); } Из рабочего кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZEbr 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 12 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой. Какой из флагов? Вы выяснили, от чего происходит прерывание, какой флаг взведен и почему? там флагов больше чем один. Each UART module also has associated bits for interrupt control (refer to Section 8. “Interrupts” (DS61108) for descriptions of these bits): • UxTXIE: Transmit Interrupt Enable Control Bit • UxTXIF: Transmit Interrupt Flag Status Bit • UxRXIE: Receive Interrupt Enable Control Bit • UxRXIF: Receive Interrupt Flag Status Bit • UxEIE: Error Interrupt Enable Control Bit • UxEIF: Error Interrupt Flag Status Bit • UxIP<2:0>: Interrupt Priority Control Bits • UxIS<1:0>: Interrupt Subpriority Control Bits Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
volodya_t 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой. UxTXIF - устанавливается если буфер TXREG пуст. Проверте (как было рекомендовано Ruslan1) флаги прерывания и разрешения прерывания. В примере указано - 1 - проверить разрешение прерывания от прердатчика при наличии UxTXIE == 1 проверить UxTXIF == 1 2 - при совпадении этих условий обработать прерывания. точка вызова прерывания передатчика и приемника общие - программа должна выяснять причину вызова. Еще раз рекомендую выложить Ваш обработчик для ознакомления (неудобно обсуждать сферического коня в вакууме - выскальзывает). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZEbr 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба С вашей идеологией разрешения-запрета прерываний получилось volodya. Дальше возникла проблема другая применяю данный метод к порту uart4. Получил данные по uart2 запретил все его прерывания. Наполнил массив для передачи uart4. Запретил прерывание u4rx(контрольно), очистил флаги rx и tx. Разрешают прерывание u4tx и пиндец рога вешается в этом прерываний. Причём по шагам спокойно ходит а главное правильно. Как только делаю run начинает крутиться в этом прерываний. Ставил для проверки переменную, и инкрементировал по каждому входу. Эксперимент подтвердил что прога крутится в прерываний. Выложу вечером на работе нет возможности. Возведён всегда u2txif Выложу вечером на работе нет возможности. Возведён всегда u2txif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 12 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба С вашей идеологией разрешения-запрета прерываний получилось volodya. Дальше возникла проблема другая применяю данный метод к порту uart4. Получил данные по uart2 запретил все его прерывания. Наполнил массив для передачи uart4. Запретил прерывание u4rx(контрольно), очистил флаги rx и tx. Разрешают прерывание u4tx и пиндец рога вешается в этом прерываний. Причём по шагам спокойно ходит а главное правильно. Как только делаю run начинает крутиться в этом прерываний. Ставил для проверки переменную, и инкрементировал по каждому входу. Эксперимент подтвердил что прога крутится в прерываний. Выложу вечером на работе нет возможности. Возведён всегда u2txif Выложу вечером на работе нет возможности. Возведён всегда u2txif Ну значит он передал этот байт в FIFO передачи и освободился, и опять свободен быстрее чем вы планировали. Вероятно у Вас просто некорректно сделана работа с очисткой флагов и их проверкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
volodya_t 0 9 февраля, 2016 Опубликовано 9 февраля, 2016 · Жалоба По окончанию передачи FIFO свободен - о чем свидетельсьвует установленный TXIF. Во всех сериях Microchipa аналогично организовано (по крайней мере где я пробовал). Передатчик PIC32 имеет несколько вариантов настройки FIFO плюс DMA - посмотрите внимательно инструкцию (она на USART отдельным файлом идет) . Удачи ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться