Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание Tx на pic32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
ZEbr
Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами.
Заранее спасибо!!!!
Ruslan1
Цитата(ZEbr @ Feb 6 2016, 08:13) *
Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами.
Заранее спасибо!!!!

Значит что-то не почистили, или не все выгребли из FIFO, или еще что, смотрите сами внимательно что у Вас разрешено и в какой момент запрещается. Анализ взведенных флагов покажет, почему произошло прерывание.

Кстати, если вдруг у Вас однозначный полудуплекс- на время передачи прерывание по приему вообще запрещайте. А перед его разрешением почистите все флаги и буфер.
ZEbr
Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2.
Ruslan1
Цитата(ZEbr @ Feb 7 2016, 17:24) *
Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2.

Чудес не бывает.

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

Попробуйте при входе в прерывание скопировать куда-то содержимое регистров разрешения прерываний и регистров флагов прерываний. И уже после этого останавливайте программу и анализируйте сохраненное чтобы понять лт чего произошло прерывание.
Кстати, заодно и проверите что изменилось в этих регистрах с момента входа в прерывание до момента когда Вы смотрите содержимое этих регистров под отладчиком.
volodya
Цитата(ZEbr @ Feb 6 2016, 08:13) *
Подскажите пожалуйста!!!! Настраиваю 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
Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.
Ruslan1
Цитата(ZEbr @ Feb 8 2016, 08:54) *
Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается 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
Цитата(ZEbr @ Feb 8 2016, 08:54) *
Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.


UxTXIF - устанавливается если буфер TXREG пуст. Проверте (как было рекомендовано Ruslan1)
флаги прерывания и разрешения прерывания.
В примере указано -
1 - проверить разрешение прерывания от прердатчика
при наличии UxTXIE == 1 проверить UxTXIF == 1
2 - при совпадении этих условий обработать прерывания.

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

Еще раз рекомендую выложить Ваш обработчик для ознакомления (неудобно обсуждать сферического коня в вакууме - выскальзывает).
ZEbr
С вашей идеологией разрешения-запрета прерываний получилось volodya. Дальше возникла проблема другая применяю данный метод к порту uart4. Получил данные по uart2 запретил все его прерывания. Наполнил массив для передачи uart4. Запретил прерывание u4rx(контрольно), очистил флаги rx и tx. Разрешают прерывание u4tx и пиндец рога вешается в этом прерываний. Причём по шагам спокойно ходит а главное правильно. Как только делаю run начинает крутиться в этом прерываний. Ставил для проверки переменную, и инкрементировал по каждому входу. Эксперимент подтвердил что прога крутится в прерываний.

Выложу вечером на работе нет возможности. Возведён всегда u2txif

Выложу вечером на работе нет возможности. Возведён всегда u2txif
Ruslan1
Цитата(ZEbr @ Feb 8 2016, 14:28) *
С вашей идеологией разрешения-запрета прерываний получилось volodya. Дальше возникла проблема другая применяю данный метод к порту uart4. Получил данные по uart2 запретил все его прерывания. Наполнил массив для передачи uart4. Запретил прерывание u4rx(контрольно), очистил флаги rx и tx. Разрешают прерывание u4tx и пиндец рога вешается в этом прерываний. Причём по шагам спокойно ходит а главное правильно. Как только делаю run начинает крутиться в этом прерываний. Ставил для проверки переменную, и инкрементировал по каждому входу. Эксперимент подтвердил что прога крутится в прерываний.

Выложу вечером на работе нет возможности. Возведён всегда u2txif

Выложу вечером на работе нет возможности. Возведён всегда u2txif

Ну значит он передал этот байт в FIFO передачи и освободился, и опять свободен быстрее чем вы планировали.
Вероятно у Вас просто некорректно сделана работа с очисткой флагов и их проверкой.
volodya
По окончанию передачи FIFO свободен - о чем свидетельсьвует установленный TXIF.
Во всех сериях Microchipa аналогично организовано (по крайней мере где я пробовал).
Передатчик PIC32 имеет несколько вариантов настройки FIFO плюс DMA - посмотрите внимательно
инструкцию (она на USART отдельным файлом идет) .
Удачи !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.