Pertanyaan ini terkait dengan pemrograman ulang AVR itu sendiri .
Info proyek:
Kami memiliki produk bertenaga baterai menggunakan ATMEGA644P. Aplikasi berjalan secara permanen dalam mode tidur dan hanya bangun satu detik (RTC) atau ketika salah satu dari dua jalur interupsi eksternal dipicu.
Perangkat ini memiliki boot-loader yang cukup sederhana yang berkomunikasi melalui UART (menggunakan antarmuka RS232 IC). Ini hanya berfungsi sebagai metode kenyamanan untuk memperbarui firmware sehingga tidak ada programmer perangkat keras ISP yang diperlukan. (Boot-loader mengharapkan telegram checksum yang aman)
Perangkat ini dirancang dengan internal brown-out DISABLED karena itu menggandakan konsumsi daya dan masa pakai baterai yang panjang adalah wajib (saya kira bahwa deteksi brown-out eksternal harus digunakan - desain ulang sedang bekerja).
Masalah:
Setiap beberapa bulan perangkat berhenti bekerja, tidak ada pembaruan firmware yang dilakukan pada perangkat tersebut. Namun, setelah pemeriksaan lebih lanjut, konten flash perangkat tersebut tampaknya rusak. Selain itu, baterai dari beberapa perangkat itu masih bagus, tapi saya tidak ingin mengesampingkan semacam situasi tegangan rendah.
Ini adalah perbandingan konten flash asli (kiri) dengan konten yang rusak (kanan):
Beberapa pengamatan:
- Blok yang rusak selalu terdiri dari setidaknya satu halaman flash (256 byte) dan halaman diselaraskan. Dengan kata lain: Hanya seluruh halaman yang terpengaruh, bukan byte tunggal.
- Konten yang rusak membaca 0xFF sebagian besar waktu, tetapi mungkin juga mengandung beberapa nilai lain atau sepenuhnya "acak".
- Baris kecil di sisi kiri gambar menunjukkan semua area yang terpengaruh. Untuk perangkat ini, ini sekitar sepersepuluh dari total konten flash.
- Kami memiliki satu perangkat di mana hanya satu halaman yang terpengaruh.
Sangat masuk akal bahwa kondisi di bawah tegangan saat menulis memori flash dapat merusak konten flash. Namun, ini berarti bahwa beberapa instruksi yang peka terhadap flash harus dijalankan.
Mungkin pengontrol memulai ulang secara acak karena kekurangan tegangan dan kode boot-loader berfungsi sepenuhnya tidak dapat diprediksi selama waktu ini. Mengutip beberapa cowok dari forum lain mengenai kekurangan tegangan:
"Ini bukan hanya instruksi acak dari flash yang dijalankan, tetapi periode instruksi acak (tidak ada jaminan bahwa kode dari flash akan dibaca & ditafsirkan dengan benar). Seiring dengan ini bagian lain dari MCU mungkin tidak berperilaku seperti yang dirancang, termasuk perlindungan mekanisme. "
Pertanyaan:
Apakah Anda pikir "perilaku acak selama tegangan rendah dan menjalankan beberapa instruksi mengubah data di halaman flash" - penjelasannya masuk akal? Jika itu masalahnya, mengapa kita tidak melihat kesalahan semacam ini sepanjang waktu hanya sebagai penyebab beberapa masalah perangkat lunak (stack overflow, pointer tidak valid).
Apakah Anda punya ide lain apa yang bisa menyebabkan korupsi semacam ini? Mungkinkah ini disebabkan oleh EMI / ESD?