Извините, что я вмешиваюсь в столь лихо закрученную тему. Но если у Вас дрожание происходит из-за другого прерывания (по ADC), то я Вам предложу несколько, на мой взгляд более простых решений. И именно в рамках IAR. Попробуйте их сделать.
1) Самое простое и возможно эффективное. Во всяком случае Вам не придётся ломать программу.
Первой командой прерывания ADC введите __enable_interrupt();
2) По скольку динамическая индикация - вещь явно периодическая, а АЦП Вы явно вызываете по таймеру или привязываете его ко времени другим способом, то выкиньте вообще прерывание по ADC. Работайте следующим образом.
В начале прерывания динамической индикации - считываете предыдущее значение АЦП. В конце меняете канал и запускаете следующее измерение.
Если время опроса АЦП у вас меньше времени регенерации - то вызывайте регенерацию по N-ному прерыванию от АЦП.
Можно и ещё предложений много сделать. Главное, чтобы моя мысль до Вас дошла. За всю жизнь мне не разу не приходилось делать прерывание от АЦП. Сложно даже представить себе ситуацию когда это нужно. Как и прерывание от SPI передачи. Малоэффективно. Потери на обработку прерывания велики по сравнению с ожиданием результата. Рекомендую применять синхронное чтение, когда результат - гарантировано будет получен.
Извиняюсь, если я не правильно оценил задачу и ответил не на Ваши вопросы.