Kami telah menggunakan mikrokontroler ATmega48 / 88/168/328 dengan sukses selama bertahun-tahun di banyak produk kami. Kami sekarang telah mempertimbangkan untuk beralih dari varian A dan PA ke varian PB baru (karena kami akan membutuhkan pin, timer, dan UART tambahan dalam produk baru, karena itu menjadi lebih murah, dan karena tampaknya varian lama akan dihentikan), jadi kami mengganti ATmega328A dengan ATmega328PB. Tampaknya menjadi sangat sering setelah gangguan listrik . Masalah seperti itu tidak pernah terjadi dengan varian lama.
Gangguan daya biasa adalah normal untuk penggunaan produk kami. Kami menggunakan catu daya switching (seperti yang ini ) yang diatur ke 5V, dan memiliki kapasitor dalam kisaran 220μF pada Vme ATmega, untuk menjaga SRAM tetap hidup untuk gangguan daya dalam rentang beberapa menit, untuk menyimpan kondisi internal yang bukan misi kritis tetapi secara signifikan meningkatkan pengalaman pengguna dengan menjadi tersedia secara instan saat restart (status ini cukup sering berubah sehingga EEPROM tidak cocok). Ini selalu berhasil.
Namun, dengan ATmega328PB baru, setelah gangguan daya, chip ulang tanpa kondisi reset ditemukan di MCUSR, dan jam tampaknya menjadi kacau.
- detektor berwarna kecoklatan disetel per sekering. Kami mencoba setiap bodlevel yang tersedia, bug terjadi pada mereka semua.
- kami menggunakan 20 MHz eksternal, juga diatur dengan benar per sekering.
- kami mencoba 3 chip berbeda, jadi itu bukan solder tunggal atau kegagalan perangkat keras lainnya.
Setelah bug terjadi, jam sering diatur ke kecepatan 2.5x lebih lambat, menunjukkan bahwa MCU sedang clock oleh osilator internal 8 MHz. Namun, terkadang penurunannya sekitar 6x. Ini berarti itu bukan bug perangkat lunak yang mengubah pembagi jam, karena saya tidak dapat mengatur sekering dari perangkat lunak, dan pembagi jam tidak dapat membagi jam dengan 2,5 atau 6.
Jadi, tersangka pertama saya adalah sekering Deteksi Kegagalan Jam baru. Namun, tidak masalah apakah itu dihidupkan atau dimatikan, perilaku tetap sama.
Untuk mengesampingkan kekhasan perangkat lunak, saya menulis program pengujian sederhana dari awal, yang tidak melakukan apa pun selain mengubah output dengan 100 Hz dari penghentian waktu, dan menunjukkan dengan LED setelah setiap restart yang kondisi reset diaktifkan (seperti membaca dari MCUSR). Sisa perangkat keras juga dihapus, hanya MCU dan regulator yang ada (dan indikator dipimpin dengan resistor seri).
Hasil
Sekitar 2/3 dari waktu, tidak ada yang menarik terjadi. Setelah gangguan daya, mcu melanjutkan pekerjaannya, indikator reset brown-out dan power-on reset menyala.
(pada gambar, merah adalah pin toggled, dan biru adalah VCC. Pada gambar ini, 2,7 V bronwn-out terlihat jelas. Saya melakukan tes yang sama dengan pengaturan brown-out lainnya, hasilnya persis sama, jadi saya akan menghilangkan gambar-gambar itu)
Kira-kira 1/3 dari waktu, bug yang disebutkan di atas terjadi, dan ketika daya kembali, tidak ada indikator reset berwarna coklat dan indikator reset daya menyala! Outputnya berbeda, seolah-olah MCU itu berdetak dengan jam aneh. Ini tidak kacau, namun terus berdetak dengan frekuensi yang sama.
Menariknya, dalam situasi ini, detektor berwarna cokelat tampaknya benar-benar tidak aktif, karena setelah gangguan daya berikutnya (di mana jam yang benar kadang-kadang dipulihkan, kadang-kadang tidak), jelas terlihat bahwa output terus beralih dengan baik setelah brown- level out telah dilewati. Dalam situasi seperti itu, jam terkadang menjadi lebih cepat, di waktu lain jam menjadi lebih lambat:
Selama tes ini saya menggunakan 16K CK / 14CK + 4.1 ms untuk penundaan start-up (tetapi keterlambatan 65 ms tidak menghindari masalah).
Berikut adalah gambar yang diperbesar, di mana Anda dapat dengan jelas melihat bahwa VCC mencapai kondisi stabil pada 5 V di bawah 2 ms:
Pada gambar di atas, MCU dimulai dengan benar.
Menariknya, ketika tidak, tegangan suplai naik ke stabil 5 V bahkan lebih cepat (sepertinya banyak bagian MCU tidak menyala, sehingga menarik lebih sedikit saat ini saat startup)
Di bawah ini adalah gambar dari awal yang tidak berhasil:
Harap dicatat, bahwa perangkat lunak mulai berjalan setelah lebih dari 85 ms setelah tegangan suplai stabil, daripada 10,5 ms yang diperlukan sebaliknya. Sekering untuk penundaan startup masih sama, 16K CK / 14CK + 4,1 ms.
Yang juga menarik untuk dicatat, adalah bahwa setelah pasokan dimatikan, VCC menstabilkan sekitar 1,1 hingga 1,2 Volt (yang lama, varian ATmega328A turun menjadi sekitar 0,6 - 0,7 V). Itu menjaga itu selama beberapa menit. Jika saya menunggu cukup lama (dalam urutan setengah jam atau lebih), MCU selalu dimulai dengan benar! Jadi sepertinya masalahnya adalah ada sekitar 1,1 Volt di sekitar, yang, menurut datasheet, tidak dijamin cukup untuk reset power-on. Tapi itu harus cukup untuk reset brown-out!
Kecuali untuk situasi ini, detektor berwarna cokelat berfungsi dengan baik. Ini terlihat pada gambar pertama (sinyal output berhenti ketika bodlevel telah tercapai, dan penurunan tegangan melambat, karena bagian dari MCU dimatikan). Saya melakukan tes ketika saya mengurangi VCC sedikit di bawah bodlevel dan membiarkannya naik kembali, MCU selalu memulai kembali dengan benar dalam kondisi seperti itu, dengan hanya indikator reset berwarna cokelat yang menyala.
Apakah saya melewatkan sesuatu yang jelas, atau apakah ATmega328PB memiliki bug serius dalam detektor berwarna cokelatnya?
EDIT:
Menariknya, masalah di atas hanya muncul ketika saya mengganggu pasokan sebelum regulator. Jika saya menyela setelah regulator (atau menggunakan catu daya laboratorium), masalah tidak pernah terjadi. Seolah-olah bentuk naiknya tegangan menyebabkan masalah. Namun, seperti yang dapat Anda lihat dari gambar terakhir, kenaikan tegangan cukup bagus dan stabil dengan cepat.
EDIT 2
Saya mencobanya dengan 16 MHz bukannya 20 MHz, tetapi masalah yang sama persis terjadi.