реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прерывание Tx на pic32
ZEbr
сообщение Feb 6 2016, 06:13
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 2-12-10
Из: Воронеж
Пользователь №: 61 356



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

Сообщение отредактировал ZEbr - Feb 6 2016, 06:14
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 6 2016, 17:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(ZEbr @ Feb 6 2016, 08:13) *
Подскажите пожалуйста!!!! Настраиваю uart по типовому примеру с сайта microchip . запускаю программу первый прием и передача проходят нормально.а вот во время второй посылки зачемто при приеме программа заходит в прерывание по передаче. Флаги очищаю, в прерываний. Прерывания rx и tx различаются по флагами.
Заранее спасибо!!!!

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

Кстати, если вдруг у Вас однозначный полудуплекс- на время передачи прерывание по приему вообще запрещайте. А перед его разрешением почистите все флаги и буфер.
Go to the top of the page
 
+Quote Post
ZEbr
сообщение Feb 7 2016, 15:24
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 2-12-10
Из: Воронеж
Пользователь №: 61 356



Буферы, передачи и приема пусты, после передачи и приема соответственно. Проверил. Прерывание по приему не запрещаю только очищаю флаг(попробую запрещать). Да кстати у меня в MPLAB 8.91 почему-то неправильно отображается в Watch регистр флагов в котором находится RX2 и TX2.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 7 2016, 16:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

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

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

Попробуйте при входе в прерывание скопировать куда-то содержимое регистров разрешения прерываний и регистров флагов прерываний. И уже после этого останавливайте программу и анализируйте сохраненное чтобы понять лт чего произошло прерывание.
Кстати, заодно и проверите что изменилось в этих регистрах с момента входа в прерывание до момента когда Вы смотрите содержимое этих регистров под отладчиком.
Go to the top of the page
 
+Quote Post
volodya
сообщение Feb 8 2016, 06:25
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(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();
}


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


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
ZEbr
сообщение Feb 8 2016, 06:54
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 2-12-10
Из: Воронеж
Пользователь №: 61 356



Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 8 2016, 08:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(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
Go to the top of the page
 
+Quote Post
volodya
сообщение Feb 8 2016, 09:17
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(ZEbr @ Feb 8 2016, 08:54) *
Сделал как вы сказали. Передаются регистры в переменную. Тоже самый эффект флаг не очищается u2txreg пустой u2rxreg пустой.


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

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

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


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
ZEbr
сообщение Feb 8 2016, 12:28
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 2-12-10
Из: Воронеж
Пользователь №: 61 356



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

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

Выложу вечером на работе нет возможности. Возведён всегда u2txif
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 8 2016, 13:07
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

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

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

Ну значит он передал этот байт в FIFO передачи и освободился, и опять свободен быстрее чем вы планировали.
Вероятно у Вас просто некорректно сделана работа с очисткой флагов и их проверкой.
Go to the top of the page
 
+Quote Post
volodya
сообщение Feb 9 2016, 07:56
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



По окончанию передачи FIFO свободен - о чем свидетельсьвует установленный TXIF.
Во всех сериях Microchipa аналогично организовано (по крайней мере где я пробовал).
Передатчик PIC32 имеет несколько вариантов настройки FIFO плюс DMA - посмотрите внимательно
инструкцию (она на USART отдельным файлом идет) .
Удачи !


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 10:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016