Il s'agit d'un problème logiciel, vous passez trop de temps à réparer les interruptions et votre routine I2C n'est pas en mesure de le gérer (c'est donc deux choses qui ne sont pas correctes). J'ai vécu plusieurs situations similaires.
Premièrement: vous devez faire le moins possible dans les interruptions, ne lire et stocker que les données, ne faire aucun traitement que vous pourriez faire en dehors de l'ISR, les mathématiques peuvent prendre BEAUCOUP de cycles CPU et le CPU ne peut rien faire d'autre pendant cette interruption.
Deuxièmement: étudiez DMA pour automatiser les choses, afin que vos interruptions deviennent presque un processus automatisé en arrière-plan.
Troisièmement: Si I2C est important, mettez également cela en interruption, mais assurez-vous de définir les priorités!
Quatrièmement: déterminez pourquoi votre routine I2C échoue, I2C lui-même peut résister à des temporisations, des pauses et des attentes très intermittentes, de sorte que votre routine devra peut-être être modifiée pour permettre cela.
Cinquièmement: voyez si vous pouvez "chaîner" les interruptions, vous pouvez constater que vous pouvez entretenir les lectures ADC plus efficacement, ou mettre l'ADC dans un mode différent où il fait plus de travail pour vous avant de l'interrompre (EG attendez que toutes les lectures soient disponibles, puis lisez tout en un seul coup, plutôt que 8 interruptions distinctes pour 8 lectures de canal ADC distinctes).
Sixièmement: utilisez un oscilloscope ou un analyseur logique et des broches d'E / S de rechange sur la carte pour tracer le temps que vous passez dans chaque bit de code, pour voir si vous pouvez l'accélérer. (Réglez la broche haute lorsque vous entrez dans une fonction / ISR, réglez-la à nouveau à la sortie).
Septièmement: Décidez si vous avez vraiment besoin de lire l'ADC, est-ce que le ralentissement va empirer les choses? C'est contre-intuitif, mais parfois courir plus lentement donne en fait de meilleurs résultats, en faisant le travail de moyenne du signal pour vous et en réduisant les pointes / transitoires qui pourraient causer des problèmes ou nécessiter un traitement supplémentaire pour les supprimer. Nous avons amélioré une routine PID de contrôle moteur en la faisant simplement tourner 1/4 de la vitesse, libérant ainsi une charge de temps CPU dans le processus.