06.09.2023, 17:27
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Падает UART PIC24FV32KM302
Здравствуйте.
Есть МК PIC24FV32KM302. И с ним творится какая то дичь.
Написал прошивку для него давным давно для управления LED панелями.
Все было нормально до добавления новой конфигурации панели.
Обработка идет по таймеру в прерывании.
Код:
|
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void) {
if (IEC0bits.T1IE && IFS0bits.T1IF) {
IFS0bits.T1IF = 0;
lineidx = (lineidx % panelCfg.ScreenScanShift);
DrawLine8(lineidx, 0);
// отключил весь вывод, оставил только один метод но это не спасает.
// switch (AdditionalFlag) {
// case PanelFlagsUseAlternateRender:
// DrawLine32_16_NonStandart(lineidx);
// break;
// case PanelFlagsUseAlternateRender2:
// DrawLine8_nonst2(lineidx, 1);
// break;
// case PanelFlagsUseInvertAddress:
// DrawLine8(lineidx, 1);
// break;
// default: DrawLine8(lineidx, 0);
// break;
// }
lineidx++;
// если идет прием то делаем отсчет времени сброса на случай если прием команд завис
if (RceiveCMD != NONE_CMD) {
ResetCMDTimeout++;
}
}
} |
Конфигурация панелей у меня задается структурой.
Данные заданы как массивы.
Код:
|
const unsigned char Panel_p8_invert_adr_merged[] = {1, 4, 5, 3, 4, 4, 2, 8, 64, 0, 0, 0, 0}; |
Так вот при задании очередной конфигурации падает UART.
Причем без всяких ошибок.
Таймер работает, основной код также работает потому что можно вывести демо режим когда заполняется построчно панель.
Но уарт наглухо виснет.
добавил обработчики ошибок но сюда не попадает никогда.
Код:
|
void __attribute__((__interrupt__, auto_psv)) _DefaultInterrupt(void) {
// may be error
ThrowException(1);
}
void __attribute__((__interrupt__, auto_psv)) _OscillatorFail(void) {
// may be error
ThrowException(2);
}
void __attribute__((__interrupt__, auto_psv)) _AddressError(void) {
// may be error
ThrowException(3);
}
void __attribute__((__interrupt__, auto_psv)) _StackError(void) {
// may be error
ThrowException(4);
} |
Уже перепроверил весь код пошагово в отладчике. Причем симмулятор тоже падает но пошагам я не вижу никаких делений на 0 или улетов в недопустимые области памяти.
Уже до дыр проглядел код.
Может кто нибдь знает метод как можно ошибки чтоли проверить?? или узнать причину почему перестает приниматься данные?
Куда можно глянуть??
Делаю в Mplabx
Спасибо.
|
|
|
|
07.09.2023, 10:14
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: Падает UART PIC24FV32KM302
А вот что нашел.
Периодически срабатывает ошибка OERR: Receive Buffer Overrun Error Status bit (clear/read-only)
Но откуда она берется то в симмуляторе? Прерывание же настроено.
|
|
|
|
08.09.2023, 00:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 21.03.2007
Адрес: М.(осква)
Сообщений: 4,338
Сказал спасибо: 2,151
Сказали Спасибо 1,749 раз(а) в 997 сообщении(ях)
|
Re: Падает UART PIC24FV32KM302
worldmasters, так перевод на русский - ошибка переполнения буфера приёма.
Алгоритм не заходит в процедуру очистки буфера, в частности потому, что прерывание не разрешено.
ЯТД, (мимокрокодил).
__________________
+ 7 903 641 87 25// 1. Иногда отвечаю "по памяти" 2. Часто заблуждаюсь >> Критикуйте, не обижусь.
|
|
|
|
08.09.2023, 08:56
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: Падает UART PIC24FV32KM302
Сообщение от mtit
|
Алгоритм не заходит в процедуру очистки буфера, в частности потому, что прерывание не разрешено.
|
Разрешено все.
У меня вывод каждой строчки происходит по прерыванию таймера каждую мс.
Видимо сам код обновления строки очень долгий и не дает нормально срабатывать прерыванию уарт.
вытащил код из прерывания таймера в основной поток но появились артефакты (((
Но зато уарт перестал страдать этой ошибкой.
Как то так.
|
|
|
|
11.09.2023, 09:49
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 22 сообщении(ях)
|
Re: Падает UART PIC24FV32KM302
Здравствуйте. Пару дней у меня не грузился Kazus, так что мысли вдогонку... Извините, если изреку прописные истины, но процедура прерывания должна быть короткая, "как выстрел" - приняли байт из UART, положили в буфер, и пусть обработкой пакета занимается асинхронно независимая процедура в главном цикле. Нужно регенерировать табло в строго определённые моменты - взведите по таймеру флаг софтового прерывания с более низким приоритетом для этой процедуры, чтобы не мешать дальнейшему приёму UART (желательно убедиться в факте приёма пакета или использовать двойное буферирование).
А определить причины подобных "временных" нахлёстов в прерывании в таком фрагменте проекта практически невозможно.
P.S. Если будете стараться уменьшить размер кода прерывания, уберите строку
Код:
|
if (IEC0bits.T1IE && IFS0bits.T1IF) |
- это рудимент из прерываний PIC16, где был один вход для всех прерываний. В PIC24 векторный контроллер, у каждого прерывания отдельный адрес входа. Ну и на "сладкое" - код лучше читается, если использовать предопределённые в файле ‹процессор.h› имена битов SFR, например:
Последний раз редактировалось varostov; 11.09.2023 в 09:58.
|
|
|
|
27.12.2023, 05:10
|
|
Заблокирован
Регистрация: 05.05.2008
Сообщений: 121
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Падает UART PIC24FV32KM302
Здравствуйте. Старое былью стало. У вас новый девайс, а сам ваш алгоритм немного устарел. Попробую помочь хотя похоже бесполезно. Читайте на pic24.ru осрв tn_kernel. Исходник в студию.если осцил. В ошибке
Последний раз редактировалось sciff; 27.12.2023 в 14:05.
Причина: недостача
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:56.
|
|