AVR memprogram ulang sendiri

8

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".

edebill
sumber
Di mana Anda dapat mengidentifikasi masalah? Kami mengalami masalah serupa dengan pengaturan serupa. Apakah Anda pernah membaca memori flash "korup" dan membandingkannya dengan konten HEX asli?
Rev1.0

Jawaban:

6

Apakah Anda menggunakan BOD? Hal-hal buruk kadang-kadang bisa terjadi jika sebuah chip menjadi cokelat.

Leon Heller
sumber
3
Untuk memperjelas, edebill harus menggunakan BOD.
Kevin Vermeer
Tidak menggunakan Direksi. Saya harus melihat tentang menambahkannya. Jadi skenario di sini adalah bahwa chip baru mulai menggeliat karena tegangan menjadi terlalu rendah dan tidak sengaja merusak flash sendiri?
edebill
@edebill - Pada PICs, saya telah melihat bahwa banyak terjadi dalam produksi ketika ambang BORV tidak ditetapkan.
J. Polfer
Apa itu BOD? Deteksi Brown Out?
Peter Mortensen
2
Ya, itu adalah Brown-Out Detection.
Leon Heller
6

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.

Jack Schmidt
sumber
Ini juga bisa terjadi dengan prosesor yang memetakan beberapa memori flash ke ruang memori utama. Saya tahu setidaknya dsPIC dan PIC24 melakukan ini. Jika Anda memiliki pointer korup dan keadaan yang tepat Anda bisa menimpa flash.
Thomas O
3

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)

Adam Lawrence
sumber
2

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.

smashtastic
sumber
Varistor bukan untuk perlindungan ESD (mereka untuk perlindungan lonjakan yang berlangsung antara 10 hingga 100 milidetik); dioda internal perangkat biasanya cukup, tetapi ketika tidak, menambahkan beberapa dioda bias-balik ke kedua rel (Vdd dan GND) biasanya bekerja, berhati-hatilah karena ini memang menambah kapasitansi ke IO dan dapat mempengaruhi hal-hal berkecepatan tinggi .
Thomas O
1
Thomas telah melihat datahseet TDK, perangkat ini dirancang khusus untuk langkah-langkah counter ESD, dan mereka terbukti bekerja dalam produksi untuk perangkat komunikasi elektronik. Kami menguji perangkat kami di rumah dengan ESD hingga 8 kV dan perangkat ini melindungi komponen lain.
smashtastic
Anda benar tentang kapasitansi tambahan, dan itu perlu dipertimbangkan.
smashtastic