aske1 0 Пятница в 11:47 Опубликовано Пятница в 11:47 · Жалоба Здравствуйте! столкнулся со следующей проблемой: Использовал микроконтроллеры 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 186 Пятница в 12:11 Опубликовано Пятница в 12:11 · Жалоба Поскольку фактически зависимость от выключателя, покажите схему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 Пятница в 13:20 Опубликовано Пятница в 13:20 · Жалоба 3 минуты назад, Plain сказал: Поскольку фактически зависимость от выключателя, покажите схему. удалил лишние входа, выхода, ацп и цапы. На экран к сожалению не влезло, поэтому отправил в p-cad Плата контроллера.sch Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 186 Пятница в 14:55 Опубликовано Пятница в 14:55 · Жалоба Почему R235 в таком месте? На RX припаяно либо U64, либо U78? На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 52 Пятница в 16:43 Опубликовано Пятница в 16:43 · Жалоба On 7/12/2024 at 4:20 PM, aske1 said: поэтому отправил в p-cad Лучше бы в PDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 Пятница в 16:48 Опубликовано Пятница в 16:48 · Жалоба 1 час назад, Plain сказал: Почему R235 в таком месте? На RX припаяно либо U64, либо U78? У опто-приемника U64 открытый коллектор и R235 притягивает этот открытый коллектор к +5В через всегда 7-ю ногу U78, на которой всегда +5В(т.к. вход оптрона u78 не используется, но так же как и U64 запаяна) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 186 Пятница в 17:03 Опубликовано Пятница в 17:03 · Жалоба Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 Пятница в 17:03 Опубликовано Пятница в 17:03 · Жалоба 18 минут назад, dimka76 сказал: Лучше бы в PDF P-CAD EDA - [Sheet1].pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 216 Пятница в 17:13 Опубликовано Пятница в 17:13 · Жалоба 5 часов назад, aske1 сказал: Так и не понял что это было и почему мне помогло то, что я просто увеличил задержки между инициализацией и включением прерываний. Это какой то брак в мк? это какая то не понятная партия мк? Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете? Наличие непонятных (костыльных) задержек - уже, априори, намекает.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 Пятница в 17:16 Опубликовано Пятница в 17:16 (изменено) · Жалоба 1 час назад, Plain сказал: Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём. я садился на rx лог-анализатором и видел там посылки , которые ожидал увидеть при этом в прерывании по приему вставил код, который должен был менять свое состояние . Соответственно видел посылку и не видел при этом чтобы мк заходил в прерывание. 51 минуту назад, jcxz сказал: Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете? Наличие непонятных (костыльных) задержек - уже, априори, намекает.... нет ну почему же уж так сразу.. я не рассматриваю этот вариант по следующим причинам: во-первых код не лично мой(если бы он был мой я как раз на него бы и подумал в первую очередь), а так его изначально писал вроде бы программист, который давно этим занимался, поэтому я как бы и доверяю во вторых код работал в неизменном виде до этого мк на где то на 20-ти мк того же типа, а в этот раз почему то не заработал в третьих другой UART, который инициализируется так же почему то всегда заводился без проблем, когда не заводился тот, что не заводился . Поэтому я и спросил ни у кого ли такого не было и кто, что думает. Цитата Наличие непонятных (костыльных) задержек - уже, априори, намекает.... кстати в примерах в microC я тоже видел эти костыльные задержки. Честно почему то когда здесь задаю вопросы обязательно находится хотя бы один человек, которые пытаются как бы унизить, не понимаю откуда в людях столько негатива. Ведь можно как то иначе ответ сформулировать. Понятно, что если бы я бы считал себя супер разработчиком я бы здесь вопросы не задавал. Поэтому я и прошу окружающих ткнуть меня носом в решение проблемы, а не в что либо другое. Ведь когда тебя тыкают носом в что либо другое через какое то время тыканий хочется всё бросить и пойти яндекс еду разносить (к примеру). Изменено Пятница в 18:08 пользователем aske1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 Пятница в 18:24 Опубликовано Пятница в 18:24 (изменено) · Жалоба 3 часа назад, Plain сказал: На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ. А как может сброс повлиять на это? Меня лично почему то самого потянуло в первую очередь на цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва. 1 час назад, aske1 сказал: Наличие непонятных (костыльных) задержек - уже, априори, намекает.... А как правильно было бы сделать без задержек? флаги какие то в каком то регистре смотреть после строчки инициализации? Вообще мне Ваш ответ начал нравиться. Он хотя и вроде с одной стороны слегка должен звучать обидно, но с другой стороны поскольку не я автор этого кода не обижает лично меня. предположу, что наверно логично, что не у всех мк одинаковые задержки необходимые им на инициализацию периферии.. может опять же от партии до партии меняться. так, что прошу прощения, не так изначально понял.. и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Изменено Пятница в 18:48 пользователем aske1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 52 Пятница в 19:14 Опубликовано Пятница в 19:14 · Жалоба On 7/12/2024 at 9:24 PM, aske1 said: и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Может быть порядок инициализации каких-то регистров важен ? Вы документацию на микроконтроллер хорошо изучили ? Я немного работал с dsPIC33. С UART проблем никогда не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 186 Суббота в 03:09 Опубликовано Суббота в 03:09 · Жалоба 8 часов назад, aske1 сказал: цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва Необъяснимый сперва порыв — побаловаться выключателем, обычно такое не рассматривают при проектировании, поэтому я и предложил добавить тиристор. Логично также спросить, что у Вас там в FPWRT записано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 216 Вчера в 09:50 Опубликовано вчера в 09:50 · Жалоба В 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 сказал: может опять же от партии до партии меняться. так, что прошу прощения, не так изначально понял.. и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло.. Возможно, что у вас там баги не только в коде, но и в схеме. И причудливым образом одни накладываются на другие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться