пока не поступили преобразования от АЦП (что нибудь кроме 0)
REFS=0b11 вроде как подключает внутренний ИОН, не отличающийся точностью и равный (для ATmega8) 2,56 В. То есть младший разряд соответствует 2,5 мВ. Переключение младшего разряда произойдет примерно на половине этого напряжения, то есть 1,25 мВ. Вы уверены, что сможете настолько подавить помехи? Вы уверены, что дрейф или внутренние шумы не сдвинут ноль преобразователя? Вы уверены, что импульс такой величины надо считать импульсом? Параметров импульсов я не знаю, поэтому
подберите более-менее правдоподобный уровень, который однозначно не будет сочтен шумом.
примерно с периодом в 1 сек, обновлять данные на экране
В целом разумно. Можно чуть быстрее, до 2-10 Гц, но это не принципиально. 1 Гц смотрится медленно, просто по ощущениям.
где пишем текущее время, текущий ток, и текущее значение импульса
Интегрируется работа тока.
Выводить хотите ток или мгновенную мощность (значение АЦП или его квадрат, грубо говоря)? Со временем тоже не так просто:
лучше воспользоваться Timer1_comp и выставить "круглую" частоту прерывания для простоты расчетов. Скажем, 5 кГц (этого, кстати, можно добиться и на ущербном Timer2). Если планируется счет времени, выделить под него отдельный таймер - распространенное решение, основные достоинства которого - простота, точность и малые затраты ресурсов контроллера. Рекомендую
Как только получаем от АЦП 10-30 (эт как захочется) U равных 0 (U=0); останавливаем и выводим на экран последние значения.
Не очень понятен принцип. Надо, чтобы после прекращения импульса показывалось, что импульс кончился (спец. символ что ли на дисплее показать) и отображать его параметры.
Сколько времени? Что-то около 5 сек или до следующего импульса? Кстати, чем выше частота опроса АЦП (при постоянной тактовой в рекомендуемых пределах!), тем больше точность.
Я бы все-таки рекомендовал взять хотя бы 1 кГц, лучше 5-8. Ошибка при интегрировании и так будет накапливаться, лучше уменьшить насколько возможно.
Как только получаем от АЦП
Так все-таки в прерывании или в основном цикле? Если описанная функциональность и правда вся, которая нужна, эти варианты равноправны. Только с обработкой в прерывании попроще, в том числе и потому что он уже рассмотрен.
unsigned long S_int;
32 байта? Если вывод раз в секунду, особых требований к скорости нет. Можно и 64-разрядное число взять. Впрочем, это не принципиальный вопрос.
.
Было бы неплохо, если бы Вы ответили на выделенные вопросы, или указали свое мнение по ним.
.
Давайте не будем спешить и сначала напишем алгоритм. Логику работы я себе представляю примерно так:
1. Нужен отсчет времени, чтобы основной программе каждую секунду (или сколько там) выдавался сигнал, что можно начинать вывод на дисплей. Кроме того, нужно считать прошедшее с момента последнего события время.
2. Нужно регулярно (с равными интервалами) опрашивать АЦП и добавлять его в интеграл.
3. Нужно определять начало и конец импульса. Программа дложна "помнить", на каком этапе находится: ожидание начала импульса, ожидание конца импульса или ожидание окончания индикации предыдущего импульса. Это навскидку, может придется расширять. Скорее всего, флаговый автомат будет хорошим решением.
4. Все настройки лучше делать в начале программы, благо менять их вряд ли придется.
5. Нужно организовать вывод. Преобразование из вычисленного интеграла суммарной мощности (фактически, просто умножение на некую константу, да она у Вас есть, kt), вывод этого числа, времени и мгновенного значения импульса (если находимся в соответствующем режиме), вывод самого режима (может оказаться удобным, но вопросы удобства это вопросы удобства, то что мне кажется удобным сейчас может оказаться неудобным на самом деле).
.
Восле написания логики, скорее всего можно будет соптимизировать.
.
Выделенные пункты достаточно независимы, и смешивать их не стоит. Если хотите сразу писать код - прошу, умоляю, с человеческим форматированием и комментариями по существу. Блоки кода (в циклах, if'ах и т.п.) должны быть выделены. Обычно это делается отступами. При объявлении переменных, они выравниваются либо по типу, либо по первому символу, одна над другой; если тип одинаковый, то можно в строчку. Если отдельные биты в переменной несут отдельные функции (как в настройках таймера или АЦП), их лучше записывать по отдельности, как сделано в ADCSR, но не сделано в ADMUX. Отдельные модули (инициализация, вывод на дисплей, рассчет) лучше оформить как функции или макросы. Расход памяти и скорости при этом не измениться, в читаемость повысится. Соответственно, каждый модуль можно поименовать: "инициализация", "математика",
"шаманство". Вроде на основные ошибки форматирования указал.
Если с какими-то моими высказываниями не согласны - лучше распишите с какими и почему. Это всем полезно будет. И еще раз повторю, писать лучше постепенно, проверяя после каждого значимого этапа. Порой и очевидные конструкции преподносят сюрпризы, как тот же СТС-режим таймера. Лучше, когда их обнаружению не препятствует остальной код, работоспособность которого точно также не проверена.