Ini adalah masalah perangkat lunak, Anda menghabiskan terlalu banyak waktu untuk menyela & rutin I2C Anda tidak dapat mengatasinya (jadi itu adalah dua hal yang tidak benar). Saya telah melalui beberapa situasi yang serupa.
Pertama: Anda harus melakukan sesedikit mungkin dalam interupsi, hanya membaca & menyimpan data, jangan melakukan pemrosesan apa pun yang dapat Anda lakukan di luar ISR, matematika dapat mengambil banyak siklus CPU dan CPU tidak dapat melakukan hal lain sementara di interupsi itu.
Kedua: Selidiki DMA untuk mengotomatisasi hal-hal, sehingga gangguan Anda hampir menjadi proses otomatis latar belakang.
Ketiga: Jika I2C penting, masukkan ITU dalam interupsi juga, tetapi pastikan Anda menentukan prioritas!
Keempat: Cari tahu mengapa rutinitas I2C Anda gagal, I2C itu sendiri bisa tahan terhadap timing yang sangat terputus-putus, jeda & menunggu dll. Sehingga rutin Anda mungkin perlu memodifikasi untuk memungkinkan ini.
Kelima: Lihat apakah Anda dapat "rantai" menyela, Anda mungkin menemukan bahwa Anda dapat memperbaiki ADC membaca lebih efisien, atau menempatkan ADC dalam mode yang berbeda di mana ia bekerja lebih baik sebelum menginterupsi (EG tunggu semua bacaan tersedia, kemudian baca semua dalam satu hit, daripada 8 interupsi terpisah untuk 8 kanal ADC terpisah dibaca).
Keenam: Gunakan osiloskop atau penganalisis logika, dan simpan pin IO di papan tulis, untuk melacak berapa banyak waktu yang Anda habiskan di setiap bit kode, untuk melihat apakah Anda dapat mempercepatnya. (Tetapkan pin tinggi ketika Anda memasukkan fungsi / ISR, atur rendah lagi saat keluar).
Ketujuh: Putuskan jika Anda benar-benar perlu membaca ADC, akankah semakin lambat memperburuk keadaan? Ini kontra-intuitif tetapi kadang-kadang berjalan lebih lambat benar-benar memberikan hasil yang lebih baik, melakukan pekerjaan rata-rata sinyal untuk Anda dan mengurangi lonjakan / transien yang dapat menyebabkan masalah atau memerlukan pemrosesan ekstra untuk menghapus. Kami meningkatkan rutin kontrol PID motor dengan hanya menjalankannya 1/4 kecepatan, membebaskan banyak waktu CPU dalam proses.