Страница 3 из 3
Re: Вопрос по Си
Добавлено: Пт июл 16, 2010 07:26:07
ARV
Аlex писал(а):В любом случае, я бы советовал писать так
не стоит давать такие советы. понятное дело, что хуже не сделаете, но лучше
разобраться в происходящем и делать правильно и компактно: по требованиям стандарта Си в выражении все операнды с размерностью менее
int автоматически приводятся к типу
int, если нет явного приведения типов. таким образом, для операндов
char явное приведение типа к
int не требуется - оно делается и так компилятором.
Re: Вопрос по Си
Добавлено: Сб июл 17, 2010 18:45:57
Васька серый
добрый день.
небольшой вопрос, по формарированию вывода на сях.
Proteus - Mega8 - ds18b20 - Virtual Terminal на USARTе. USART на 9600 (8 Data, 1 Stop, No Parity, Asynchronous)
Задача: вывести температуру в USART.
есть код
Код: Выделить всё
dv = w1_search(0xf0, rc);
printf("count devices = %d\x0d",dv);
работает без замечаний.
а вот кусок
Код: Выделить всё
char temp = 0;
temp = ds1820_temperature_10(&rc[0][0]) / 10;
printf("temp = %i \x0d", temp); // (пробовал i, d, f)
выдает что попало. вместо t=30 выдает t=240, вместо t=31 уже t= 248, t=32 отображает t=0, t=33 отображает t=8 и тд...
как правильно отформатировать?
Re: Вопрос по Си
Добавлено: Сб июл 17, 2010 20:02:59
ARV
во-первых, в строке формата для "перевода строки" принято вводить "
\n", а не шестнадцатиричный код "
\x0d"
во-вторых, а вы уверены, что функция
ds1820_temperature_10 возвращает результат типа
char? по-моему, собака порылась именно тут

Re: Вопрос по Си
Добавлено: Сб июл 17, 2010 22:12:50
Аlex
Проблема явно видна. С увеличением на 1 'C на датчике, значение увеличилось на 8. Это говорит о том, что датчик у Вас 18B20 а программа работает с 1820. Можете поделить это значение на 8, но это не выход. Ставьте датчик тот который указан в проге, либо указывайте в программе тот, который стоит

И, как сказал
AVR, тип переменной выберите float, а то десятых не будет...
Re: Вопрос по Си
Добавлено: Вс фев 27, 2011 19:58:16
ooogo
нашел в сети такой алгоритм извлечения квадратного корня
Код: Выделить всё
//Вычисление целочисленного корня квадратного из long int
unsigned int lsqrt(unsigned long arg){
char count=16;
unsigned long res=0,tmp=0;
if(!arg)
{
if(!(arg&0xFF000000))
{
arg<<=8;
count-=4;
}
res=1;
while((tmp<1)&&(count))
{
count--;
if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;
arg<<=2;
};//поиск первой 1-ы
tmp--;
for(;count;count--)
{
tmp<<=2;
res<<=1;
if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;
arg<<=2;
if( tmp>=((res<<1)|1))
{
tmp-=((res<<1)|1);
res|=1;
}
}
}
return (unsigned int)res;
}
но что-то он у меня сразу не заработал, может кто встречал описание, а то по коду не пойму!?
Re: Вопрос по Си
Добавлено: Вс фев 27, 2011 22:09:50
avreal
Re: Вопрос по Си
Добавлено: Пн фев 28, 2011 21:32:37
ooogo
спасибо вот это заработал
Код: Выделить всё
unsigned short int isqrt( unsigned long int from)
{
unsigned long int mask = 0x40000000, sqr = 0, temp;
do {
temp = sqr | mask;
sqr >>= 1;
if( temp <= from )
{
sqr |= mask;
from -= temp;
}
} while( mask >>= 2 );
// можно дать еще округление
if( sqr < from ) ++sqr;
return (unsigned int)sqr;
}
но только из обсуждения не понял, что это за алгоритм, не могли бы Вы меня точно послать на ... этот разжеванный алгоритм!?
