Adakah orang lain yang memiliki contoh ketika AVR secara misterius berhenti bekerja setelah beberapa bulan, tetapi memprogram ulang itu akan mengembalikannya?
Saya menjalankan banyak atmega328 di jaringan sensor nirkabel. Saya sekarang sudah 3 kali (dalam sekitar satu tahun) ketika salah satu dari mereka baru saja berhenti bekerja. Saya akan membakar kembali program itu dan akan mulai bekerja lagi. Ini tidak selalu unit yang sama, jadi sepertinya itu bukan chip yang rusak.
Sepertinya itu akan menjadi bencana yang membuat orang tidak menggunakan AVR, jadi itu jelas sesuatu tentang keadaan khusus saya. Saya hanya ingin tahu apakah ada orang lain yang menabraknya dan mungkin memiliki beberapa petunjuk.
Saya menggunakan baterai 3.3V, sehingga voltase akan turun terlalu rendah untuk beroperasi setiap beberapa bulan dan saya harus mengganti baterai yang dapat diisi ulang. Modul menggunakan mode tidur dan pengawas waktu untuk tidur selama 60 detik, membaca, radio kembali ke stasiun pangkalan dan kemudian tidur lagi. Modul-modul tersebut kompatibel dengan Arduino, jadi saya belum membalik bit "jangan biarkan saya membakar kembali ini".
Jawaban:
Apakah Anda menggunakan BOD? Hal-hal buruk kadang-kadang bisa terjadi jika sebuah chip menjadi cokelat.
sumber
Mungkin Brown-Out-Detection adalah cara yang tepat untuk dilakukan, tetapi ...
Saya hanya memiliki masalah perangkat lunak yang menyebabkan gejala yang sangat mirip, meskipun jauh lebih cepat. Saya percaya beberapa C ++ buruk (kompilasi?) Mengakibatkan korupsi tumpukan, dan fungsi dikembalikan di luar program nyata, menjalankan instruksi acak. Saya tidak yakin persis apa yang terjadi selanjutnya, tetapi satu-satunya cara untuk memperbaikinya adalah dengan reburn program (ternyata beberapa dari instruksi acak termasuk menulis ke memori program).
Bug itu hanya sebuah penghancur yang dipanggil pada waktu yang salah. Membuat variabel global (sehingga tidak pernah hancur) memperbaiki masalah. Masalahnya sangat mudah direproduksi (butuh sekitar satu menit untuk memicu), dan pada daya yang sangat stabil. Pengaturan khusus adalah Arduino + WaveShield menggunakan perpustakaan WaveHC, tapi saya pikir ini bisa terjadi pada siapa saja yang menggunakan C ++.
Jika Anda lebih suka bahasa tingkat rendah, saya tidak sengaja melakukan hal yang sama dalam perakitan, tetapi secara ajaib ini tidak pernah menyebabkan masalah waktu sporadis: sebagian besar instruksi panjangnya 2 byte, tetapi ada yang lebih lama, dan saya dengan bodoh menghitung sendiri jarak lompatan dan melompat ke tengah instruksi 4 byte. Ini disesuaikan kembali cukup cepat, tetapi tidak sulit untuk membayangkan sesuatu seperti ini pada jalur kode yang jarang digunakan yang menyebabkan kegilaan.
sumber
Saya juga melihat kapasitor decoupling Vcc yang tidak memadai / tidak ditempatkan / hilang menyebabkan efek yang sama. Apakah Anda memiliki decoupling lokal sedekat mungkin dengan IC? (Jenis keramik 100nF - 1uF lebih disukai)
sumber
Faktor lain yang dapat menyebabkan perangkat kehilangan ingatan mereka adalah pelepasan muatan listrik statis (ESD).
Menempatkan beberapa varistor di semua konektor eksternal yang terkena paparan dapat mengatasi masalah ini. Saya telah melihatnya sebelumnya dalam beberapa produk komersial berbasiskan mikrokontroler PIC Microchip, sehingga tidak pernah terdengar sebelumnya.
Ada beberapa varistor berguna yang berfungsi ganda sebagai kapasitor filter juga (dalam urutan 10-150 pF). Lihat ini http://www.tdk.co.jp/tefe02/e9c11_avr.pdf
Mereka kecil, murah, dan akan melindungi perangkat Anda. Tempatkan sedekat mungkin dengan konektor yang membawa sinyal eksternal ke papan, dan rutekan semua jejak segera dari pin konektor.
sumber