Це проблема з програмним забезпеченням, ви витрачаєте занадто багато часу на обслуговування перерв, і ваша звичайна програма I2C не в змозі впоратися з цим (тож це дві речі, які невірно). Я пережив кілька подібних ситуацій.
По-перше: вам потрібно робити якнайменше в перериваннях, лише читати та зберігати дані, не робити жодних обробок, які ви могли б робити за межами ISR. перебуваючи в тому перериванні.
По-друге: досліджуйте DMA, щоб автоматизувати речі, щоб ваші перерви стали майже фоновим автоматизованим процесом.
По-третє: Якщо I2C важливий, покладіть ТАК і на перерву, але переконайтеся, що ви опрацьовуєте пріоритети!
Четверте: Визначте, чому ваша програма I2C не працює, сам I2C може витримати дуже переривчасті терміни, паузи та очікування тощо, тому ваша програма може потребувати змін, щоб дозволити це.
По-п’яте: подивіться, чи можете ви "ланцюжкові" переривання, ви можете виявити, що ви можете обслуговувати зчитування АЦП ефективніше або перевести АЦП в інший режим, де він більше спрацьовує перед тим, як перервати (EG чекайте, коли всі читання будуть доступними, потім читайте все в один хіт, а не 8 окремих переривань для 8 окремих читань каналу АЦП).
По-шосте: Використовуйте осцилоскоп або логічний аналізатор і запасіть штифти IO на платі, щоб відстежити, скільки часу ви витрачаєте на кожен біт коду, щоб побачити, чи можете ви його прискорити. (Під час введення функції / ISR встановіть висоту шпильки, встановіть її знову низько при виході).
Сьоме: Вирішіть, якщо вам дійсно потрібно стільки читати АЦП, чи буде йти повільніше, чи стане гірше? Це контрінтуїтивно, але іноді працює повільніше, насправді дає приємніші результати, виконуючи роботу щодо усереднення сигналу для вас та скорочення шипів / перехідних процесів, які можуть спричинити проблеми або вимагати додаткової обробки для видалення. Ми вдосконалили рутину PID управління двигуном, просто запустивши його на 1/4 швидкості, звільнивши навантаження в процесі процесора.