Saya menjalankan Microchip dsPIC30F6012a. Saya memiliki chip ini pada beberapa PCB, semuanya menjalankan perangkat lunak yang sama, dan mengamati masalah yang sama pada semuanya. Ini menyiratkan masalah sistemik, bukan masalah produksi satu kali. Masalahnya juga dapat direproduksi, menyiratkan saya harus bisa membunuhnya jika saya tahu ke mana harus mencari. Tapi saya masih mengalami kesulitan mengejutkan dalam debug aplikasi.
Papan yang diuji menerima 24V, yang akan diturunkan menjadi 5V melalui V7805. Chip ini berjalan pada osilator internal, dengan PLL 16x, memberikan kecepatan operasi ~ 29,5 MIPS. Kode yang relevan pada papan ini pada dasarnya sangat sederhana: bangun, baca data dari EEPROM, lalu masukkan infinite loop. Ganggu setiap milidetik, amati beberapa data lingkungan, dan tulis nilai yang diperbarui ke EEPROM. Ada hal-hal lain yang terjadi, tetapi masalah masih terjadi bahkan jika kode yang tidak terkait dikomentari, jadi saya bisa yakin itu tidak relevan dengan masalah yang dihadapi.
Dalam penggunaan umum, 95% dari waktu papan bangun dengan nilai yang benar dalam memori, dan melanjutkan tentang bisnisnya. 5% lainnya, namun terbangun dengan nilai yang salah. Secara khusus, itu bangun dengan versi data yang seharusnya dimiliki sedikit-terbalik. Ini adalah empat byte lama tanpa tanda tangan yang saya tonton, dan kata atas atau bawah yang panjang dapat dibalik. Misalnya, 10 menjadi 2 ^ 16-10, yang kemudian menjadi 2 ^ 32-10. Saya dapat mereproduksi kesalahan dengan kekuatan bersepeda secara manual beberapa lusin kali, tapi itu tidak terlalu konsisten, dan jari saya menjadi usang.
Untuk mereproduksi masalah dengan cara yang terkontrol, saya membuat papan kedua yang menggerakkan pasokan 24V ke papan yang diuji. (DsPIC lain mengendarai optocoupler darlington.) Papan tester mematikan 24V selama 1,5 detik (cukup lama untuk rel 5V turun ke dasarnya 0 dan tinggal di sana selama satu detik), kemudian menyalakan 24V menyala untuk beberapa lama waktu yang dapat dikonfigurasi . Dengan waktu sekitar 520 mS, saya dapat mereproduksi kesalahan EEPROM ini dalam lima siklus daya, setiap kali.
Rel 5V berperilaku wajar. Itu menetap di 5V dalam 1 mS turn-on, dengan mungkin .4V overshoot, dengan asumsi saya bisa mempercayai ruang lingkup saya. Pada saat mematikannya meluruh ke 0V secara eksponensial, mencapai 1V dalam 50 mS. Saya tidak memiliki peringatan bangunan yang tampaknya relevan, hanya variabel yang tidak digunakan dan kehilangan baris baru di akhir file.
Saya sudah mencoba beberapa hal:
- Mengaktifkan / menonaktifkan MCLR
- Mengaktifkan / menonaktifkan WDT
- Mengaktifkan / menonaktifkan perlindungan kode
- Mengaktifkan / menonaktifkan / mengubah tegangan pendeteksian brownout
- Mengaktifkan / menonaktifkan / mengubah timer power-on
- Pengaturan PLL berbeda pada osilator internal utama
- Menghubungkan / memutuskan programmer PICkit 3 saya
- Menambahkan 470 uF kapasitansi ke rel 5V
- Menambah / menghapus .1 uF pada 4.7k pullup pada pin MCLR saya
- Menonaktifkan semua interupsi dalam kode dan tidak meninggalkan apa-apa selain pembaruan EEPROM di loop utama
- Menambahkan penundaan 1,5 detik ke rutinitas startup saya sebelum saya mulai membaca EEPROM
Saya juga menulis kode tes terpisah yang tidak melakukan apa-apa selain terus menulis nilai ke EEPROM dan kemudian membacanya kembali, memastikan bahwa nilainya tidak berubah. Puluhan ribu iterasi tidak memberikan kesalahan. Yang bisa saya simpulkan adalah ada yang tidak beres dengan EEPROM baca atau tulis, khususnya di powerup / powerdown.
Saya telah menggunakan perpustakaan EEPROM yang sama sejak 2007. Saya pernah melihat gangguan sesekali, tapi tidak ada yang bisa direproduksi. Kode yang relevan dapat ditemukan di sini:
http://srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http: / /srange.net/code/writeEEWord.s
Saya telah melihat kesalahan EEPROM sebelumnya di aplikasi lain, tetapi selalu sebagai gangguan sekali saja, tidak ada yang dapat direproduksi atau konsisten.
Adakah yang tahu apa yang sedang terjadi? Saya kehabisan hal untuk dicoba.