Это проблема программного обеспечения, вы тратите слишком много времени на обслуживание прерываний, и ваша подпрограмма I2C не может справиться с этим (так что это две вещи, которые не верны). Я прошел через несколько подобных ситуаций.
Во-первых: вам нужно делать как можно меньше в прерываниях, только читать и хранить данные, не выполнять никакой обработки, которую вы могли бы выполнять за пределами ISR, математика может занять МНОГО циклов ЦП, а ЦП не может делать ничего другого. в то время как в этом прерывании.
Второе: исследуйте DMA, чтобы автоматизировать вещи, чтобы ваши прерывания стали почти фоновым автоматизированным процессом.
Третье: если важен I2C, включите ТА и в прерывание, но убедитесь, что вы решаете приоритеты!
В-четвертых: выясните, почему ваша процедура I2C дает сбой, сам I2C может выдерживать очень прерывистые периоды времени, паузы, ожидания и т. Д., Поэтому ваша процедура может нуждаться в изменении, чтобы позволить это.
Пятое. Посмотрите, можете ли вы «цеплять» прерывания, вы можете обнаружить, что можете более эффективно обслуживать считывания АЦП или перевести АЦП в другой режим, где он выполняет больше работы перед прерыванием (например, дождитесь, пока все показания не будут доступны, затем читать все в одном обращении, а не 8 отдельных прерываний для 8 отдельных операций чтения канала АЦП).
Шестое: используйте осциллограф или логический анализатор и запасные выводы ввода-вывода на плате, чтобы отслеживать, сколько времени вы тратите на каждый бит кода, чтобы увидеть, сможете ли вы его ускорить. (Установите высокий пин при входе в функцию / ISR, снова установите низкий при выходе).
Седьмое: Решите, если вам действительно нужно читать АЦП так много, будет ли хуже работать? Это нелогично, но иногда работает медленнее, на самом деле дает более хорошие результаты, выполняя работу по усреднению сигнала для вас и сокращая пики / переходные процессы, которые могут вызвать проблемы или потребовать дополнительной обработки для удаления. Мы улучшили процедуру PID управления двигателем, просто выполнив ее на 1/4 скорости, высвободив нагрузку из процессорного времени.