Dies ist ein Softwareproblem, Sie verbringen zu viel Zeit mit der Wartung von Interrupts und Ihre I2C-Routine ist nicht in der Lage, damit umzugehen (das sind also zwei Dinge, die nicht richtig sind). Ich habe mehrere ähnliche Situationen durchgemacht.
Erstens: Sie müssen in den Interrupts so wenig wie möglich tun, nur die Daten lesen und speichern, keine Verarbeitung durchführen, die Sie außerhalb des ISR durchführen könnten, Mathematik kann eine Menge CPU-Zyklen dauern und die CPU kann nichts anderes tun während in dieser Unterbrechung.
Zweitens: Untersuchen Sie DMA, um Dinge zu automatisieren, sodass Ihre Interrupts fast zu einem automatisierten Hintergrundprozess werden.
Drittens: Wenn I2C wichtig ist, setzen Sie DAS auch in einen Interrupt, aber stellen Sie sicher, dass Sie die Prioritäten herausarbeiten!
Viertens: Finden Sie heraus, warum Ihre I2C-Routine fehlschlägt. I2C selbst kann sehr zeitweiligen Timings, Pausen und Wartezeiten usw. standhalten, sodass Ihre Routine möglicherweise geändert werden muss, um dies zu ermöglichen.
Fünftens: Wenn Sie Interrupts "verketten" können, können Sie möglicherweise feststellen, dass Sie die ADC-Lesevorgänge effizienter warten oder den ADC in einen anderen Modus versetzen können, in dem er vor der Unterbrechung mehr Arbeit für Sie erledigt (z. B. warten, bis alle Messwerte verfügbar sind). Lesen Sie dann alles mit einem Schlag und nicht 8 separate Interrupts für 8 separate ADC-Kanal-Lesevorgänge.
Sechstens: Verwenden Sie ein Oszilloskop oder einen Logikanalysator und sparen Sie E / A-Pins auf der Platine, um zu verfolgen, wie viel Zeit Sie in jedem Codebit verbringen, um festzustellen, ob Sie es beschleunigen können. (Setzen Sie den Pin hoch, wenn Sie eine Funktion / ISR eingeben, und setzen Sie ihn beim Beenden wieder niedrig.)
Siebtens: Entscheiden Sie, ob es wirklich schlimmer wird, wenn Sie den ADC wirklich so oft lesen müssen. Es ist nicht intuitiv, aber manchmal führt ein langsameres Laufen tatsächlich zu besseren Ergebnissen, indem das Signal für Sie gemittelt und Spitzen / Transienten reduziert werden, die Probleme verursachen oder zusätzliche Verarbeitung zum Entfernen erfordern können. Wir haben eine PID-Routine für die Motorsteuerung verbessert, indem wir sie einfach um 1/4 der Geschwindigkeit ausgeführt haben, wodurch eine Menge CPU-Zeit eingespart wurde.