aske1 0 12 июля Опубликовано 12 июля · Жалоба Здравствуйте! столкнулся со следующей проблемой: Использовал микроконтроллеры dspic30f6012a несколько лет зашивал туда одну и ту же программу и не было никаких проблем с UART. Участок кода инициализации привел ниже. Недавно произошел случай: зашиваю тем же кодом такой же dspic30f6012a и заметил, что UART2 примерно на 15-е включение питания (на число от 10 до 20) не работает(не принимает, даже в прерывание по приёму не попадает), при этом UART1, который в коде инициализируется чуть выше всегда инициализируется и работает нормально. Немного потанцевал с "бубном" и увеличил задержки между инициализациями на 5мс и поменял в коде строчки UART1_Init(9600); и UART2_Init(9600); между собой местами и проблема вроде как решилась, потыркал питание раз 100 и оба UART-а теперь работают нормально. Но не приятный осадок на душе остался. Так и не понял что это было и почему мне помогло то, что я просто увеличил задержки между инициализацией и включением прерываний. Это какой то брак в мк? это какая то не понятная партия мк? Как такие проблемы вообще ловить? Может кто то ещё сталкивался с чем то подобным? void main() { Delay_ms(1000); ADPCFG =0xFFFF; TRISB = 0xFFFF; TRISC = 0xFFFF; TRISD = 0xFFFF; TRISF = 0xFFFF; TRISG = 0xFFFF; if (t_i_lev2>t_i_lev_max || t_i_lev2<t_i_lev_min) { t_i_lev2=51; f_epr_err=1; } Delay_ms(5); //здесь настроил входа, считал eeprom и ещё что //здесь танцевал с бубном Delay_ms(5); //после танцев с бубном поставил здесь не 5, а 10мс Delay_ms(10) UART1_Init(9600); //после танцев с бубном записал здесь UART2_Init(9600); Delay_ms(5); //после танцев с бубном поставил здесь не 5, а 10мс Delay_ms(10) UART2_Init(9600); //после танцев с бубном записал здесь UART1_Init(9600); Delay_ms(5); //после танцев с бубном поставил здесь не 5, а 10мс Delay_ms(10) //здесь закончил танцевать с бубном //приоритеты T1IP_2_bit=0; T1IP_1_bit=1; T1IP_0_bit=0; T2IP_2_bit=0; T2IP_1_bit=0; T2IP_0_bit=1; U2RXIP_2_bit=0;U2RXIP_1_bit=1;U2RXIP_0_bit=1; // U2TXIP_2_bit=0;U2TXIP_1_bit=0;U2TXIP_0_bit=1; U1RXIP_2_bit=0;U1RXIP_1_bit=1;U1RXIP_0_bit=1; T3IP_2_bit=1; T3IP_1_bit=0; T3IP_0_bit=1; T1IE_bit = 1; // Enable Timer1 interrupts T1IF_bit = 0; // Clear T1IF PR1=20000;//9B;//4F; // 20000 = 1ms T1CON = 0x8000; TMR2 = 0; T2IE_bit = 1; T2IF_bit = 0; PR2 = 12500; // 12500 = 5ms // U2TXIF_bit = 0; U2RXIF_bit = 0; //сбросил флаг U2STA.OERR = 0; U2RXIE_bit = 1;// разрешил прер-е по приёму // U2TXIE_bit = 1; U1RXIF_bit = 0; U1STA.OERR = 0; U1RXIE_bit = 1; T2CON = 0x8010; //Timer3 Prescaler 1:1; PR3 Preload = 5000; Actual Interrupt Time = 250 us T3CON = 0x8000; T3IE_bit = 1; T3IF_bit = 0; // IPC0 = IPC0 | 0x1000; PR3 = 5000; //далее приводить не стал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 207 12 июля Опубликовано 12 июля · Жалоба Поскольку фактически зависимость от выключателя, покажите схему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 12 июля Опубликовано 12 июля · Жалоба 3 минуты назад, Plain сказал: Поскольку фактически зависимость от выключателя, покажите схему. удалил лишние входа, выхода, ацп и цапы. На экран к сожалению не влезло, поэтому отправил в p-cad Плата контроллера.sch Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 207 12 июля Опубликовано 12 июля · Жалоба Почему R235 в таком месте? На RX припаяно либо U64, либо U78? На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 12 июля Опубликовано 12 июля · Жалоба On 7/12/2024 at 4:20 PM, aske1 said: поэтому отправил в p-cad Лучше бы в PDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 12 июля Опубликовано 12 июля · Жалоба 1 час назад, Plain сказал: Почему R235 в таком месте? На RX припаяно либо U64, либо U78? У опто-приемника U64 открытый коллектор и R235 притягивает этот открытый коллектор к +5В через всегда 7-ю ногу U78, на которой всегда +5В(т.к. вход оптрона u78 не используется, но так же как и U64 запаяна) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 207 12 июля Опубликовано 12 июля · Жалоба Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 12 июля Опубликовано 12 июля · Жалоба 18 минут назад, dimka76 сказал: Лучше бы в PDF P-CAD EDA - [Sheet1].pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 12 июля Опубликовано 12 июля · Жалоба 5 часов назад, aske1 сказал: Так и не понял что это было и почему мне помогло то, что я просто увеличил задержки между инициализацией и включением прерываний. Это какой то брак в мк? это какая то не понятная партия мк? Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете? Наличие непонятных (костыльных) задержек - уже, априори, намекает.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 12 июля Опубликовано 12 июля (изменено) · Жалоба 1 час назад, Plain сказал: Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём. я садился на rx лог-анализатором и видел там посылки , которые ожидал увидеть при этом в прерывании по приему вставил код, который должен был менять свое состояние . Соответственно видел посылку и не видел при этом чтобы мк заходил в прерывание. 51 минуту назад, jcxz сказал: Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете? Наличие непонятных (костыльных) задержек - уже, априори, намекает.... нет ну почему же уж так сразу.. я не рассматриваю этот вариант по следующим причинам: во-первых код не лично мой(если бы он был мой я как раз на него бы и подумал в первую очередь), а так его изначально писал вроде бы программист, который давно этим занимался, поэтому я как бы и доверяю во вторых код работал в неизменном виде до этого мк на где то на 20-ти мк того же типа, а в этот раз почему то не заработал в третьих другой UART, который инициализируется так же почему то всегда заводился без проблем, когда не заводился тот, что не заводился . Поэтому я и спросил ни у кого ли такого не было и кто, что думает. Цитата Наличие непонятных (костыльных) задержек - уже, априори, намекает.... кстати в примерах в microC я тоже видел эти костыльные задержки. Честно почему то когда здесь задаю вопросы обязательно находится хотя бы один человек, которые пытаются как бы унизить, не понимаю откуда в людях столько негатива. Ведь можно как то иначе ответ сформулировать. Понятно, что если бы я бы считал себя супер разработчиком я бы здесь вопросы не задавал. Поэтому я и прошу окружающих ткнуть меня носом в решение проблемы, а не в что либо другое. Ведь когда тебя тыкают носом в что либо другое через какое то время тыканий хочется всё бросить и пойти яндекс еду разносить (к примеру). Изменено 12 июля пользователем aske1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 12 июля Опубликовано 12 июля (изменено) · Жалоба 3 часа назад, Plain сказал: На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ. А как может сброс повлиять на это? Меня лично почему то самого потянуло в первую очередь на цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва. 1 час назад, aske1 сказал: Наличие непонятных (костыльных) задержек - уже, априори, намекает.... А как правильно было бы сделать без задержек? флаги какие то в каком то регистре смотреть после строчки инициализации? Вообще мне Ваш ответ начал нравиться. Он хотя и вроде с одной стороны слегка должен звучать обидно, но с другой стороны поскольку не я автор этого кода не обижает лично меня. предположу, что наверно логично, что не у всех мк одинаковые задержки необходимые им на инициализацию периферии.. может опять же от партии до партии меняться. так, что прошу прощения, не так изначально понял.. и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Изменено 12 июля пользователем aske1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 12 июля Опубликовано 12 июля · Жалоба On 7/12/2024 at 9:24 PM, aske1 said: и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Может быть порядок инициализации каких-то регистров важен ? Вы документацию на микроконтроллер хорошо изучили ? Я немного работал с dsPIC33. С UART проблем никогда не было. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 207 13 июля Опубликовано 13 июля · Жалоба 8 часов назад, aske1 сказал: цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва Необъяснимый сперва порыв — побаловаться выключателем, обычно такое не рассматривают при проектировании, поэтому я и предложил добавить тиристор. Логично также спросить, что у Вас там в FPWRT записано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 15 июля Опубликовано 15 июля · Жалоба В 12.07.2024 в 20:16, aske1 сказал: во вторых код работал в неизменном виде до этого мк на где то на 20-ти мк того же типа, а в этот раз почему то не заработал И что? Это ничего не значит. Я не так давно нашёл баг в компиляторе IAR (при работе с float на ARM-ах с FPU). Этот баг там был давно - много версий подряд. Куча народа использовала IAR на таких МК не один год и думаю - минимум на тысячах МК. И при этом - баг оставался незамеченным много лет. А у вас - всего-то 20 МК.... В 12.07.2024 в 20:16, aske1 сказал: Честно почему то когда здесь задаю вопросы обязательно находится хотя бы один человек, которые пытаются как бы унизить, не понимаю откуда в людях столько негатива. В чём именно унижение? Здесь каждый первый новичок, наделав кучу ошибок в коде, бежит сюда и говорит, что "виноват компилятор или процессор", которые "неправильно компилируют или выполняют его гениальный код". Вы не первый и не последний... В 12.07.2024 в 20:16, aske1 сказал: Ведь когда тебя тыкают носом в что либо другое через какое то время тыканий хочется всё бросить Если нагадившего где попало щенка/котёнка не тыкать носом в нагаженное, то он никогда не научится ходить в лоток. И если уж пришли сюда с вопросом, то КОРОНУ нужно снимать в первую очередь ещё на входе. В 12.07.2024 в 21:24, aske1 сказал: А как правильно было бы сделать без задержек? флаги какие то в каком то регистре смотреть после строчки инициализации? Правильно - начинать программирование с чтения мануала на МК и нужную его периферию. Если вы задаёте такие вопросы, то очевидно - не читали. Ну и автор вашего кода - тоже судя по всему не читал. В 12.07.2024 в 21:24, aske1 сказал: наверно логично, что не у всех мк одинаковые задержки необходимые им на инициализацию периферии.. Логично предположить, что для инициализации какой-либо перферии в МК (особенно такой простой как UART) никаких задержек вообще не требуется. Ибо просто не нужны они. В очень редких случаях, для какой-то сложной периферии в каком-то МК могут требоваться задержки. Но тогда в мануале на МК об этом будет явно указано. И даже в этом случае - задержки эти скорее всего должны быть реализованы не так как у вас. А наличие задержек в каком-то коде при ините UART (или подобной простой периферии), скорее всего говорит о качестве кода и уровне квалификации его написателя. Явно человек не читал мануала, таскал куски кода с инета или примеров (не понимая их), что-то лепил из них, это не работало и он костылил наугад, тыкая в разные места задержки. Пока более-менее не заработало. Типичная быдлокодерская практика. В 12.07.2024 в 21:24, aske1 сказал: может опять же от партии до партии меняться. так, что прошу прощения, не так изначально понял.. и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Возможно, что у вас там баги не только в коде, но и в схеме. И причудливым образом одни накладываются на другие. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться