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

Pic-микроконтроллеры, не инициализируется один из 2-х используемых UART

Здравствуйте! столкнулся со следующей проблемой:
Использовал микроконтроллеры 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;
//далее приводить не стал

 

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


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

Поскольку фактически зависимость от выключателя, покажите схему.

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


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

3 минуты назад, Plain сказал:

Поскольку фактически зависимость от выключателя, покажите схему.

удалил лишние входа, выхода, ацп и цапы. На экран к сожалению не влезло, поэтому отправил в p-cad

Плата контроллера.sch

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


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

Почему R235 в таком месте? На RX припаяно либо U64, либо U78?

На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ.

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


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

1 час назад, Plain сказал:

Почему R235 в таком месте? На RX припаяно либо U64, либо U78?

 

У опто-приемника U64 открытый коллектор и  R235 притягивает этот открытый коллектор к +5В через всегда 7-ю ногу U78, на которой всегда +5В(т.к. вход оптрона u78 не используется, но так же как и U64 запаяна) 

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


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

Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём.

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


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

5 часов назад, aske1 сказал:

Так и не понял что это было и почему мне помогло то, что я просто увеличил задержки между инициализацией и включением прерываний. Это какой то брак в мк? это какая то не понятная партия мк?

Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете?  :sarcastic:

Наличие непонятных (костыльных) задержек - уже, априори, намекает....  :mosking:

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


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

1 час назад, Plain сказал:

Так себе решение. Вы пробовали по одному отключать клиентов этого монтажного ИЛИ? У них обоих мозги, которые одинаково имеют право съехать, и PIC может быть ни при чём.

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

51 минуту назад, jcxz сказал:

Т.е. - тот вариант, что проблема кроется в вашем коде - вы даже не рассматриваете?  :sarcastic:

Наличие непонятных (костыльных) задержек - уже, априори, намекает....  :mosking:

нет ну почему же уж так сразу.. я не рассматриваю этот вариант по следующим причинам:

во-первых код не лично мой(если бы он был мой я как раз на него бы и подумал в первую очередь), а так его изначально писал вроде бы программист, который давно этим занимался, поэтому я как бы и доверяю  

во вторых код работал в неизменном виде до этого мк на где то на 20-ти мк того же типа, а в этот раз почему то не заработал

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

Поэтому я и спросил ни у кого ли такого не было и кто, что думает.

Цитата

Наличие непонятных (костыльных) задержек - уже, априори, намекает....

кстати в примерах в microC я тоже видел эти костыльные задержки.

Честно почему то когда здесь задаю вопросы обязательно находится хотя бы один человек, которые пытаются как бы унизить, не понимаю откуда в людях столько негатива. Ведь можно как то иначе ответ сформулировать. Понятно, что если бы я бы считал себя супер разработчиком я бы здесь вопросы не задавал. Поэтому я и прошу окружающих ткнуть меня носом в решение проблемы, а не в что либо другое. Ведь когда тебя тыкают носом в что либо другое через какое то время тыканий хочется всё бросить и пойти яндекс еду разносить (к примеру).

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

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


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

3 часа назад, Plain сказал:

На сбросе особого криминала нет, можете попробовать добавить закорачиватель на паре транзисторов — BC857 вместо VD32, эмиттер на анод, база через 100 Ом на +5 В, коллектор на базу BC817 (BC847), его коллектор на +5 В, эмиттер на общий, 10 кОм на БЭ.

А как может сброс повлиять на это? Меня лично почему то самого потянуло в первую очередь на цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва.

1 час назад, aske1 сказал:

Наличие непонятных (костыльных) задержек - уже, априори, намекает....  

А как правильно было бы сделать без задержек? флаги какие то в каком то регистре смотреть после строчки инициализации? Вообще мне Ваш ответ начал нравиться. Он хотя и вроде с одной стороны слегка должен звучать обидно, но с другой стороны поскольку не я автор этого кода не обижает лично меня. предположу, что наверно логично, что не у всех мк одинаковые задержки необходимые им на инициализацию периферии.. может опять же от партии до партии меняться. так, что прошу прощения, не так изначально понял.. и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло..

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

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


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

On 7/12/2024 at 9:24 PM, aske1 said:

и это бы объясняло почему увеличение задержки мне по необъяснимой причине помогло..

Может быть порядок инициализации каких-то регистров важен ?
Вы документацию на микроконтроллер хорошо изучили ?
Я немного работал с dsPIC33. С UART проблем никогда не было.

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


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

8 часов назад, aske1 сказал:

цепь сброса осцилком смотреть, но сам себе я объяснить логически не смог этого своего порыва

Необъяснимый сперва порыв — побаловаться выключателем, обычно такое не рассматривают при проектировании, поэтому я и предложил добавить тиристор. Логично также спросить, что у Вас там в FPWRT записано.

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


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

В 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 (или подобной простой периферии), скорее всего говорит о качестве кода и уровне квалификации его написателя. Явно человек не читал мануала, таскал куски кода с инета или примеров (не понимая их), что-то лепил из них, это не работало и он костылил наугад, тыкая в разные места задержки. Пока более-менее не заработало. Типичная быдлокодерская практика.  :unknw:

В 12.07.2024 в 21:24, aske1 сказал:

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

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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