Перейти к содержанию
    

Прерывание Tx на pic32

Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами.

Заранее спасибо!!!!

Изменено пользователем ZEbr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами.

Заранее спасибо!!!!

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2.

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста!!!! Настраиваю 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();
}

 

Из рабочего кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.

 

UxTXIF - устанавливается если буфер TXREG пуст. Проверте (как было рекомендовано Ruslan1)

флаги прерывания и разрешения прерывания.

В примере указано -

1 - проверить разрешение прерывания от прердатчика

при наличии UxTXIE == 1 проверить UxTXIF == 1

2 - при совпадении этих условий обработать прерывания.

 

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

 

Еще раз рекомендую выложить Ваш обработчик для ознакомления (неудобно обсуждать сферического коня в вакууме - выскальзывает).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Ну значит он передал этот байт в FIFO передачи и освободился, и опять свободен быстрее чем вы планировали.

Вероятно у Вас просто некорректно сделана работа с очисткой флагов и их проверкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По окончанию передачи FIFO свободен - о чем свидетельсьвует установленный TXIF.

Во всех сериях Microchipa аналогично организовано (по крайней мере где я пробовал).

Передатчик PIC32 имеет несколько вариантов настройки FIFO плюс DMA - посмотрите внимательно

инструкцию (она на USART отдельным файлом идет) .

Удачи !

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...