Страница 1 из 1
код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Чт фев 24, 2011 08:26:13
TICLIR
Здравствуйте вот такое дело, это код измерения температуры с возможностью
измерять отрицательные температуры
Код: Выделить всё
int napr=0;
------
-------
ISR(ADC_vect){
if(ADCW>=41){
napr=ADCW*2.438-100;
PORTC|=(1<<4); //гасит знак минуса
}
else{
napr=(ADCW*2.438-100)*-1;
PORTC&=~(1<<4); // зажигает знак минус
}
int r;
for(r=0;r<500;r++){ // что бы цифры не сливались
matt(napr); //в функц знакоиндикатора
}
:
вот этот код корректен " napr=(ADCW*2.438-100)*-1; " или есть другие варианты
без отрицательных переменных .
На симуляторе всё работает.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Чт фев 24, 2011 11:58:57
testerplus
TICLIR писал(а):вот этот код корректен " napr=(ADCW*2.438-100)*-1; "
Что именно смущает? Не совсем корректно неявное приведение типов.
Еще, надо понимать, что float-умножение - довольно длительная процедура, а Вы ее в обработчик прерывания вставили (как, впрочем, и цикл)
или есть другие варианты без отрицательных переменных .
Как это?
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Чт фев 24, 2011 17:48:20
TICLIR
Смущает умножение на -1, в математике это нормально ,а вот как СИ.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Чт фев 24, 2011 21:41:46
mr_smit
Ну как минимум надо "-1" взять в скобки!
Или вообще без всяких умножений:
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Чт фев 24, 2011 23:21:31
testerplus
mr_smit писал(а):Ну как минимум надо "-1" взять в скобки!
Это откуда такие "как минимумы"? Не надо там никаких скобок.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пт фев 25, 2011 08:48:47
mr_smit
Работать то будет. Но так код читабельней.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пт фев 25, 2011 09:12:43
ARV
может, проще и логичнее так, даже без
if:
знак будет получаться автоматически

Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пт фев 25, 2011 14:26:20
TICLIR
ARV писал(а):может, проще и логичнее так, даже без
if:
знак будет получаться автоматически

Да интересное дело,но я не могу,пока,врубица как функция динамической индикации примет отрицательное число.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пт фев 25, 2011 14:33:57
ARV
TICLIR писал(а):ARV писал(а):может, проще и логичнее так, даже без
if:
знак будет получаться автоматически

Да интересное дело,но я не могу,пока,врубица как функция динамической индикации примет отрицательное число.
нормальная функция динамической индикации должна быть глубоко безразлична к знаку, к числам и вообще ко всему, что она отображает.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пт фев 25, 2011 23:03:41
YS
функция динамической индикации должна быть глубоко безразлична к знаку, к числам и вообще ко всему, что она отображает.
Этакая дзенская функция.
Так учесть просто в функции знак, и все. И вообще да, злоупотреблять вещественными числами в МК - плохая затея... Лучше обойтись целыми.
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Сб фев 26, 2011 10:58:56
ARV
YS писал(а):Этакая дзенская функция.

да, совершенно верно. процессы надо разделять:
динамическая индикация - работает в фоне и тупо отображает биты из какого-то массива в соответствующих сегментах индикатора
подготовка данных для индикации - выполняется в нужные моменты и преобразовывает информацию в те самые биты в том самом массиве.
поэтому функции динамической индикации сугубо до лампочки знаки, цифры, буквы и т.п. - она этими категориями не опрерирует. а вот в подготовке надо проанализировать знак и поставить нужный бит - это правильно. если смешивать в кучу процессы ОТОБРАЖЕНИЯ и ПОДГОТОВКИ данных - получится фарш.
Брайан Керниган сказал про Си: "
Си — это инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво". не создавайте месиво!
Re: код корректен " napr=(ADCW*2.438-100)*-1; "
Добавлено: Пн фев 28, 2011 08:25:07
TICLIR
Спасибо. Я даже,догадывался, но ВЫ развеели все мои сомнения.