Страница 3 из 3

Добавлено: Вс сен 21, 2008 15:38:29
KIP
Не получается нормально код запостить...целиком в этом файле

Добавлено: Вс сен 21, 2008 15:55:14
tych
Ну вы ваааащееее ... в НОУТПЭДЕ ваш исходник файл .txt 1.2 Кб всего !

В CVAVR результат АЦП можно читать из ADCW - смотрите задачу 11.

unsigned long ADCL=0; // сделайте ее побольше

ADCL = (long)ADCW;

// можно увеличить число чтоб не терять знаки при округлении
ADCL = (ADCL * 5000)/1024;

А при выводе на LCD это учесть размещением десятичной точки. Можно и на 500 умножить.

Добавлено: Вс сен 21, 2008 16:39:47
KIP
tych писал(а):Ну вы ваааащееее ... в НОУТПЭДЕ ваш исходник файл .txt 1.2 Кб всего !
Остынте), я это знаю! В блокноте тект отосланный на форум собирался в одну строчку, как это исправить я не знаю-пришлось вставить в ворд.
tych писал(а):В CVAVR результат АЦП можно читать из ADCW - смотрите задачу 11.

unsigned long ADCL=0; // сделайте ее побольше

ADCL = (long)ADCW;

// можно увеличить число чтоб не терять знаки при округлении
ADCL = (ADCL * 5000)/1024;

А при выводе на LCD это учесть размещением десятичной точки. Можно и на 500 умножить.
Спасиба за советы. Про 16 битный регистр, который хранит результат АЦП в СVAVR я знаю из вашего курса, просто хотел особо не завязываться под особенности компилятора.

Всё-таки хочеться выяснить, почему при записи результата вычесления (дробного числа) во float, от него отсекается дробная часть.
Число преобразования спокойно записывается в переменную adcl, это можно котролировать-при подсчёте на калькуляторе получается дробное число.

Добавлено: Вс сен 21, 2008 18:00:27
Yellow Tiger
KIP писал(а):... функция расчёта возвращает только целое значение напряжения, а дробную часть отсекает. Подскажите, где ошибка?
Ошибка вот здесь:

Код: Выделить всё

float raschet_naprygeniay(unsigned int adcl){  
 return (adcl*5)/1024;
}
Выражение (adcl*5)/1024 - включает только int члены, а значит, имеет тип int. Приведение выражения int к float не меняет его значения, следовательно, дробная часть остается равной нулю.
Следует написать так:

Код: Выделить всё

float raschet_naprygeniay(unsigned int adcl){  
 return (adcl*5)/1024.;
}

Добавлено: Вс сен 21, 2008 20:32:37
KIP
Спасиба за посказку, тепеперь всё работает!)

Добавлено: Вс сен 21, 2008 20:35:01
ARV
Yellow Tiger писал(а):Ошибка вот здесь
можно сказать, классика Си :)

Добавлено: Вс сен 21, 2008 20:55:39
Yellow Tiger
ARV писал(а):можно сказать, классика Си :)
Пожалуй, можно взять шире - незначительные, по мнению некоторых, детали "вдруг" значат неожиданно много. :lol:

Добавлено: Вс сен 21, 2008 21:03:26
ARV
ну да, в то время как другие языки приводят тип операндов к типу приемника результата, Си делает иначе :) если привыкнуть - уже не ошибешься...

Добавлено: Вс сен 21, 2008 21:26:02
Yellow Tiger
ARV писал(а):ну да, в то время как другие языки приводят тип операндов к типу приемника результата, Си делает иначе
Ну, что вы - C делает точно так же, просто, согласно правилам языка, любая часть сложного выражения является (промежуточным) результатом (и может быть использована именно как результат), то есть, верхняя часть дерева разбора - является приемником этого результата и поэтому сия часть обязана подчиняться общим правилам приведения типов. Если это понимать - не ошибешься.

Добавлено: Вс сен 21, 2008 21:43:03
ARV
ну так я и говорю... если привыкнуть к Си - нет проблем...

а вот в паскале инт=инт/инт даст целый результат, а флоат=инт/инт - дробный :)

Добавлено: Вс сен 28, 2008 00:05:51
Yellow Tiger
Ну, это "нет проблем" приходит не сразу. :) Да и одного знания мало, еще и стиль нужно наработать. Скажем, есть такая практика в сравнениях на равенство с константами ставить константу на первое место, чтобы отсечь ошибки с непропечатанными '==', так вот - никогда не мог заставить себя писать именно так - как-то это некузяво... однако, очепятки такого рода все же бывали, и всякий раз найти их было непросто, так как в таком простом месте попросту не ожидаешь никакой ошибки. Пересилил себя ооочень не сразу, привычка - вторая натура. :)