Ajouter du nop/or/nop aide, vu que ça libère du cycle pour insérer les interruptions plus facilement.
- dans le code (du
./1), on voit que l'écriture right/left channel dans l'I2S se fait à la toute fin du code I2S et est précédé d'environ 700 lignes de codes, avec des tas de sauts conditionnels zappant des partis de codes non négligeable (j'ai pas spécialement fait gaffe si il y avait des loop). donc je dirais qu'il y a probablement une énorme différence entre le moment où l'interruption I2S démarre et le moment où les registres sont écrits pour chaque échantillons.
- lors d'une décompression qui va charger le bus avec les loads et donc probablement bloquer le flux d'instruction pour avoir la data voulu, va ajouter du jitter entre le moment ou l'interruption est triggée et le moment où l'insertion du code va réellement avoir lieu
Dans ces conditions, en cumulant les 2, ainsi que les cycles potentiellement pris par le Timer1, si il est déclenché et non fini avant l'interruption I2S, on doit probablement avoir un jitter énorme.
Tu peux essayer en écrivant la valeur dans l'I2S dès le début de l'interruption I2S au lieu de le faire à la fin : en gros calculer l'échantillon N+1 au lieu de calculer l'échantillon N.
Peut-être que ça aidera aussi.