Страница 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 писал(а):можно сказать, классика Си

Пожалуй, можно взять шире - незначительные, по мнению некоторых, детали "вдруг" значат неожиданно много.

Добавлено: Вс сен 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
Ну, это "нет проблем" приходит не сразу.

Да и одного знания мало, еще и стиль нужно наработать. Скажем, есть такая практика в сравнениях на равенство с константами ставить константу на первое место, чтобы отсечь ошибки с непропечатанными '==', так вот - никогда не мог заставить себя писать именно так - как-то это некузяво... однако, очепятки такого рода все же бывали, и всякий раз найти их было непросто, так как в таком простом месте попросту не ожидаешь никакой ошибки. Пересилил себя ооочень не сразу, привычка - вторая натура.
