Đây là một vấn đề phần mềm, bạn đang dành quá nhiều thời gian để phục vụ các ngắt và thói quen I2C của bạn không thể xử lý được (vì vậy đó là hai điều không đúng). Tôi đã trải qua một số tình huống tương tự.
Đầu tiên: Bạn cần thực hiện ít nhất có thể trong các ngắt, chỉ đọc và lưu trữ dữ liệu, không thực hiện bất kỳ xử lý nào bạn có thể làm ngoài ISR, toán học có thể mất rất nhiều chu kỳ CPU và CPU không thể làm gì khác Trong khi đó ngắt quãng.
Thứ hai: Điều tra DMA để tự động hóa mọi thứ, do đó, các ngắt của bạn gần như trở thành một quy trình tự động nền.
Thứ ba: Nếu I2C là quan trọng, hãy đặt THAT trong một ngắt quá, nhưng hãy chắc chắn rằng bạn làm việc ưu tiên!
Thứ tư: Tìm hiểu lý do tại sao thói quen I2C của bạn không thành công, bản thân I2C có thể chịu được thời gian rất gián đoạn, tạm dừng và chờ đợi, do đó, thói quen của bạn có thể cần sửa đổi để cho phép điều này.
Thứ năm: Xem nếu bạn có thể "xâu chuỗi" các ngắt, bạn có thể thấy bạn có thể phục vụ ADC đọc hiệu quả hơn hoặc đặt ADC ở chế độ khác, nơi nó hoạt động nhiều hơn cho bạn trước khi ngắt (EG chờ tất cả các bài đọc có sẵn, sau đó đọc tất cả trong một lần nhấn, thay vì 8 ngắt riêng biệt cho 8 lần đọc kênh ADC riêng biệt).
Thứ sáu: Sử dụng máy hiện sóng hoặc máy phân tích logic và các chân IO dự phòng trên bảng, để theo dõi xem bạn dành bao nhiêu thời gian cho mỗi bit mã, để xem liệu bạn có thể tăng tốc nó không. (Đặt pin cao khi bạn nhập chức năng / ISR, đặt lại mức thấp khi thoát).
Thứ bảy: Quyết định nếu bạn thực sự cần đọc ADC quá nhiều, việc đi chậm sẽ khiến mọi thứ tồi tệ hơn? Nó phản trực giác nhưng đôi khi chạy chậm hơn thực sự mang lại kết quả đẹp hơn, thực hiện công việc lấy trung bình tín hiệu cho bạn và cắt giảm các xung / quá độ có thể gây ra sự cố hoặc yêu cầu xử lý thêm để loại bỏ. Chúng tôi đã cải thiện thói quen điều khiển động cơ PID bằng cách chạy tốc độ bằng 1/4 tốc độ, giải phóng thời gian tải CPU trong quá trình.