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?
Jawaban:
Anda harus perhatikan bahwa blitz tidak ditulis, itu dihapus. Flash yang dihapus penuh dengan 0xFF. 256 byte pertama Anda benar-benar terhapus, wilayah 256-byte ketiga Anda terhapus sebagian (Anda hanya memiliki 0 hingga 1 bit bit dari data yang benar ke yang rusak).
Menurut datasheet , flash ini dapat dihapus halaman (saya biasanya bekerja dengan menghapus-blok lebih besar dari halaman). Seperti yang terlihat di halaman 282, Performing Page Erase oleh SPM cukup mudah.
Anda mungkin tertarik dengan bagian 23.8.1 (Mencegah Korupsi Flash):
sumber
BLB01
dan teman-teman) diatur dengan tepat! Apakah mereka? "Membingungkan ... catatan aplikasi ..." - Catatan aplikasi terkenal tidak bisa diandalkan. Gunakan hanya untuk inspirasi; untuk jaminan, andalkan lembar data (yang juga tidak salah tapi hei).Ini adalah masalah yang terkenal, dan mempengaruhi banyak mikrokontroler (bukan hanya Atmel). Perangkat keras kontrol memori flash merusak atau menghapus bagian memori dalam kondisi tegangan rendah. Perbaikan sederhana adalah dengan mengaktifkan perlindungan berwarna cokelat.
Anda harus selalu mengaktifkan perlindungan brown-out pada mikrokontroler sebagai hal yang biasa.
sumber
Tegangan di bawah adalah penyebab yang sangat mungkin. Sebagai contoh, saya pernah memiliki sebuah proyek di mana tingkat kecoklatan 1,8 V sering menyebabkan korupsi, dan korupsi ini tidak pernah dapat direproduksi dengan tingkat kecurangan 3,5V.
Perhatikan, bahwa semakin cepat prosesor berjalan, semakin sensitif terhadap masalah tegangan rendah. Jika menurunkan frekuensi CPU adalah pilihan yang tersedia bagi Anda, mungkin patut dicoba.
sumber
EMC akan menjadi musuh terbesar Anda, jika seseorang tidak mengikuti aturan utama desain PCB. Berikut adalah yang paling penting dari pengalaman saya sendiri: - memblokir kapasitor pada IC apa pun, terlepas dari apa yang produsen katakan kepada Anda dalam lembar data mereka tentang skema infernal, letakkan setidaknya satu di antara 100pF - 1nF pada setiap saluran listrik IC - lakukan area dasar pada setiap lapisan PCB sebanyak mungkin. Area-area tersebut harus dihubungi melalui semua layer melalui vias sesering mungkin, kisi-kisi sebanyak 50mil adalah nilai yang baik. Hubungkan area-area tersebut ke sinyal ground. - Jangan pernah meninggalkan tembaga yang tidak terhubung (mengambang, tidak ada sinyal) di PCB Anda. Kerjanya seperti antena dan devinitif menempatkan radiasi elektro-magnetik ke perangkat - membuat jejak membawa sinyal jam sesingkat mungkin
Temukan lebih banyak detail dengan permintaan mesin pencari seperti "panduan desain PCB bukti emc"
sumber