Sceam73 писал(а):Разве мой вариант ошибочный ? В реализации моего варианта, показания по сравнению с самым дешевым китайским брехометром, рАСходятся в одну-2 десятки вольта!
Я не знаю точных ваших коэффициентов деления и какое у вас опорное.Но то, что умножение 300 раз выполняется зря, это точно.
Sceam73 писал(а):Я немного не понял вопроса с временной переменной, и запятой.... Можно по подробнее?
Так, дальше вопрос немного глобальнее!
Чего может быть глобальнее? Если для исключения дробных чисел(вычисления которых, как мы знаем, отнимают отнимают добрые 1,5 кб флеш) вы используете формат 255 где на самом деле сохранен результат 25,5 то нужно примерно делать так:
Код: Выделить всё
unsigned char temp;
lcd_gotoxy(0,0);
lcd_clear();
temp=display/10;
itoa (temp,buffer);
lcd_puts(buffer);
lcd_putchar(",");
temp=display%10;
lcd_putchar(temp);
Либо по аналогии с выводом на семисегмент
Код: Выделить всё
unsigned char temp[]={"00,0V"};
lcd_gotoxy(0,0);
temp[0]=(display%10000/1000+0x30);
temp[1]=(display%1000/100+0x30);
temp[2]=(","); /// Это не обязательно, так как мы объявили этот элемент в начале как зпт
//но на всякий случай можно заполнить.
temp[3]=(display%1000/10+0x30);
temp[4]=("V");
lcd_puts(temp);
Этот код заменит использование функции itoa(), но опять же в будущем придется не раз использовать такое преобразование, так что можно первый вариант оформить в виде отдельной функции и выводить температуру, напряжение, сантиметры ... еще черт знает что.
Sceam73 писал(а):Если вызываеться прерывание, и процессор уходит в его обработку, то в это время другое прерывание выполниться лишь после завершения предыдущего?
Не совсем.
Когда происходит событие, вызывающее прерывание, аппаратно выставляется флаг прерывания.
Далее, если флагов стоит несколько, то первым в обработку вступает то прерывание, приоритет которого выше, то есть то, которое выше в таблице векторов прерываний.
При этом аппаратно отключаются все остальные прерывания, даже если их приоритет выше.
Только программист по мере нужды может разрешить вложенные прерывания, но тут, опять же, есть подводные камни.
После выполнения процедуры обработки приходит очередь следующего прерывания, снова по таблице роста.
Но не ранее, чем одно выполнение команды основного цикла( это один или два такта в зависимости от команды)
Ну и на сам переход к обработке прерывания занимает около четырех тактов.
Плюс, если это си, то обязательно все необходимые регистры сохраняются в стеке.
В поисках истины человек развивается.