pokk писал(а):Смутно понял ваш вопрос но сдаётся вы об этом
100*1+2*10+1*5=125
c2n писал(а):
как теперь сложить ячейки буфера test[0]. test[1]. test[3]
ResultNum = (test[0]*100)+(test[1]*10)+(test[0]) // типа так????
Теперь дальше...
побитовый сдвиг (на один байт) либо делит число на 2, либо умножает на те же 2. тут думайте сами

подскажу, что сдвиг на 2 байта поделит или умножит уже на 4....
на 8, 16, 32, 64, 128, 256, 512, 1024 думаю расписывать не надо
и еще. Можно извратиться... целую часть числа держать в одной переменной, дробную в другой. // вобщем в памяти они так и хранятся и поэтому double жрет 4(и более) байта...
Спасибо. я сам вчера думал, думал, часов до двух ночи думал. потом решил что утро ночи мудренее, ВЫКЛ комп и пошёл спать собираться.

Лёг на диванчик и стал смотреть телек с приглушённым светом в зале, я там всегда к морфею в гости собираюсь. Смотреть я стал разумеется не канал НТВ и ПЕРЕЦ так как убеждён что эти каналы созданы для определённой категории людей к которой а себя не отношу.

так что то смотрел не напрягающие и думал. И тут как раз пришла ко мне идея как реализовать задуманное

. Я сразу на бумажке записал чтоб не забыть а когда проснулся и ВКЛ комп. увидел что, мысли наши совпадают в реализации. Распишу поподробней что придумал я, может пригодится кому нибуть.
uint8_t test[4]; // буфер для считанных побайтно байтов из файла (ASCII символы)
#define ASCII_OFFSET 0x30 // смещение ASCII символа от реального значения
test[0] = '1' - ASCII_OFFSET; // побайтно считываем из файла ASCII символы цифр, вычитаем 0x30
test[1] = '1' - ASCII_OFFSET;
test[2] = '.' ; // точку не обрабатываем так как она нам не нужна
test[3] = '5' - ASCII_OFFSET;
теперь в буфере будут реальные цифры а не ASCII коды:
test[0] == 1;
test[1] == 1;
test[2] == '.' ; // точку не обрабатываем так как она нам не нужна
test[3] == 5;
собираем нужные разряды в переменную типа uint8_t:
uint8_t ResultNum;
if(test[0]==1 || test[0]==2) ResultNum = test[0] * 100; // так как тип uint8_t мах 255
if(test[1]) ResultNum += test[1] * 10; // чтоб не умножать на ноль
if(test[3]) ResultNum += test[3] ; // чтоб не прибавлять ноль
теперь в переменной будет нужное нам число:
ResultNum == 115; // 115 это считанное и преобразованное из файла напряжение 11.5 в.
собственно сама функция преобразования напряжения в код АЦП:
uint8_t VoltageToADC(uint_8 voltage){
#define FACTOR_RESISTOR 11 // коэффициент делителя
#define REFERENCE_VOLTAGE 1.1 // образцовое напряжение
#define ADC_RESOLUTION 256 // разрешение ацп
double voltage_double = (double)((double)(voltage) / 10); // 115 преобразуем в 11.5
// расчёт кода АЦП по известному напряжению
return (uint8_t)((uint16_t)(voltage_double * ADC_RESOLUTION /(REFERENCE_VOLTAGE * FACTOR_RESISTOR)));
}
функция работает, проверял в протеусе в отладчике.

Даже компилятор Atmel Studio 6 не ругался на точку (думал что тип double где нибуть в настройках надо подключать или в make)
uint8_t Result;
Result = VoltageToADC(115); // 11.5 в Result равен код АЦП 243
Result = VoltageToADC(120); // 12.0 в Result равен код АЦП 253
Всем большов, человеческое спасибо ещё раз.
