Вот что у меня получилось. Подобрал постоянные резисторы входного делителя таким образом чтобы при 30в на вход АЦП подавалось напряжение чуть меньше Vref. Подаю напряжение (у меня был под рукой источник 29.2в) и запускаю АЦП, в итоге получилась цифра 960. Далее нахожу коэффициент для расчетов KU=(U * 10 * 65536)/ADC = 29.2*10*65536/960=19934 Записываю KU в EEPROM. Для преобразования замеров данные ADC умножаем на этот коэффициент и делим на 65536 (отбрасывая 2 младших байта произведения) Для повышения точности округления я все-таки использую и младшие байты, только не уверен что делаю это правильно. Ниже приведу мой код, он подробно прокомментирован, поэтому трудностей с пониманием моего замысла не должно быть.
CalcResult:
ldi t0,KU ; записываем во временный регистр адрес KU
readeew t0,ain1,ain0 ; читаем из EEPROM коэффициент KU (ain1:ain0)
mov aout1,adw1 ; и умножаем его на результат ADC,
mov aout0,adw0 ; где adw1 - ADCH, adw0 - ADCL
rcall mpy16u ; умножаем ain1:ain0 на aout1:aout0
; произведение - aout3:aout2:aout1:aout0
clr t0 ; запишем ноль во вспомогательный регистр
rol aout0 ; результат округляем - начнем с младшего байта
adc aout1,t0 ; если есть перенос, добавим 1 к следующему
rol aout1 ;
adc aout2,t0 ; если есть перенос, добавим единицу
adc aout3,t0 ; к старшим байтам
mov adw1,aout3 ; для дальнейших расчетов
mov adw0,aout2 ; берем только 2 ст.байта
mov ain0,adw0 ; преобразование в двоично-десятичный вид
mov ain1,adw1 ; вход ain1:ain0
rcall bin2BCD16 ; выход aout2:aout1:aout0
; Вывод на индикатор Здесь я уже результат вывожу разделив на 10, путем постановки в нужном месте разделительной точки, если получилось 292, то на дисплее будет 29.2 Все вроде бы нормально работает, но может быть где то все-таки я неверно рассуждаю, посмотрите, пожалуйста.