Ми багато років успішно використовуємо мікроконтролери ATmega48 / 88/168/328 у багатьох наших продуктах. Зараз ми розглядали можливість переходу з варіантів A і PA на новий варіант PB (тому що нам знадобляться додаткові штифти, таймери та UART в нових продуктах, тому що вони дешевші, і тому, здається, старі варіанти будуть скасовані), тому ми вимкнули ATmega328A з ATmega328PB. Здається, дуже часто після перерв живлення ходити по сітці . Такі проблеми ніколи не виникали зі старими варіантами.
Регулярні переривання живлення є нормальними для використання у наших продуктах. Ми використовуємо джерело живлення комутації (наприклад, цей ), встановлений на 5 В, і є конденсатори в діапазоні 220 мкФ на VCC ATmega, щоб підтримувати SRAM живим для перерв живлення в межах декількох хвилин, щоб зберігати внутрішні стани, які не є місією критично, але значно збільшують досвід роботи користувача, миттєво доступні при перезапуску (ці стани змінюються досить часто, щоб зробити EEPROM непридатним). Це завжди працювало.
Однак, з новим ATmega328PB, після перерви живлення, мікросхема скидається без умови скидання в MCUSR, і годинник, здається, переходить у сірий простір.
- детектор коричневого кольору встановлюється на запобіжник. Ми пробували кожен доступний рівень bodlevel, помилка трапляється на всіх них.
- ми використовуємо зовнішні 20 МГц, також встановлені правильно на запобіжник.
- ми спробували 3 різних мікросхема, тож це не було жодної пайки або іншої технічної несправності.
Після того, як виходить помилка, годинник часто встановлюється на 2,5 рази меншою швидкістю, що вказує на те, що МКУ спрацьовує через 8 МГц внутрішній генератор. Однак іноді уповільнення буває близько 6 разів. Це означає, що це не може бути програмна помилка, що змінює подільник годинника, оскільки я не можу встановити запобіжники від програмного забезпечення, і подільник годин не може розділити годинник на 2,5 або 6.
Отже, моїм першим підозрюваним став новий запобіжник виявлення несправностей годинника. Однак незалежно від того, включено чи вимкнено, поведінка залишається такою ж.
Щоб виключити особливості програмного забезпечення, я написав просту програму тестування з нуля, яка не робить нічого іншого, як перемикає висновок на 100 Гц від перерви таймера і вказує за допомогою світлодіодів після кожного перезавантаження, які умови скидання були активовані (як прочитано з MCUSR). Решта обладнання також було вилучено, тільки mcu та регулятор є (і індикатор має серійні резистори).
Результати
Приблизно в 2/3 часу нічого цікавого не відбувається. Після перерви живлення mcu відновить роботу, і індикатори відключення коричневого відключення, і індикатори скидання живлення загорілися.
(на зображенні червоний колір - це перемиканий штифт, а синій - VCC. На цьому зображенні добре видно вимкнення 2,7 В. Я зробив ті ж тести з іншими налаштуваннями коричневого відтінку, результати точно такі ж, тому я опущу ці фотографії)
Приблизно в третині часу виникає вищезгадана помилка, і коли живлення знову повертається, жоден із індикаторів скидання коричневого скидання та скидання живлення не загоряється! Вихід різний, як би mcu тикав дивним годинником. Це не хаотично, однак він продовжує тикати з однаковою частотою.
Цікаво, що в цій ситуації детектор коричневого кольору видається абсолютно неактивним, тому що після чергового переривання живлення (де інколи відновлюється правильний годинник, іноді немає), добре видно, що вихід буде добре змінюватись після коричневого кольору. рівень пройдений У таких ситуаціях годинник часом стає швидшим, а іншим - повільніше:
Під час цих тестів я використовував 16K CK / 14CK + 4,1 мс для затримки запуску (але затримка 65 мс не усуває проблем).
Ось знімок із збільшенням зображення, на якому чітко видно, що VCC досягає стабільного стану при 5 В менше 2 мс:
На наведеному малюнку mcu запустився правильно.
Цікаво, що коли цього не відбувається, напруга живлення стає швидше до стабільних 5 В (здається, багато частин МКУ не вмикаються, тому під час запуску вона приводить менше струму)
Нижче наведено зображення з невдалого початку:
Зауважте, що програмне забезпечення починає працювати через понад 85 мс після стабілізації напруги живлення, а не 10,5 мс, необхідних для іншого. Запобіжники для затримки запуску залишаються однаковими, 16K CK / 14CK + 4,1 мс.
Цікаво також зазначити, що після відключення живлення VCC стабілізується на рівні від 1,1 до 1,2 Вольт (старий варіант ATmega328A знизився до 0,6 - 0,7 В). Це зберігає кілька хвилин. Якщо я чекаю досить довго (на замовлення півгодини і більше), mcu завжди починається правильно! Тож здається, що проблема полягає в тому, що є 1,1 Вольт навколо, що, згідно з даними, не гарантується, що буде достатньо для скидання живлення. Але його повинно вистачити для скидання коричневого кольору!
За винятком цих ситуацій, коричневий детектор працює чудово. Це видно на першому зображенні (вихідний сигнал припиняється, коли досягнутий рівень рівня тіла, і падіння напруги сповільнюється, коли частини mcu вимикаються). Я робив тести, коли я знижував VCC трохи нижче рівня рівня тіла і дозволяв йому знову підніматися назад, mcu завжди перезапускався правильно за таких умов, тільки загорівся індикатор коричневого відключення.
Я пропустив щось очевидне, чи ATmega328PB має серйозну помилку в його коричневому детекторі?
Редагувати:
Цікаво, що вищезазначені проблеми виникають лише тоді, коли я перериваю подачу перед регулятором. Якщо я перервую його після регулятора (або використовую лабораторний блок живлення), проблем ніколи не станеться. Ніби форма піднімається напруги викликала проблеми. Однак, як видно з останнього зображення, підвищення напруги є досить приємним і воно швидко стабілізується.
EDIT 2
Я спробував це з 16 МГц замість 20 МГц, але точно такі ж проблеми трапляються.