Вопрос по Си

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопрос по Си

Сообщение ARV »

Аlex писал(а):В любом случае, я бы советовал писать так
не стоит давать такие советы. понятное дело, что хуже не сделаете, но лучше разобраться в происходящем и делать правильно и компактно: по требованиям стандарта Си в выражении все операнды с размерностью менее int автоматически приводятся к типу int, если нет явного приведения типов. таким образом, для операндов char явное приведение типа к int не требуется - оно делается и так компилятором.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Васька серый
Родился
Сообщения: 8
Зарегистрирован: Чт июл 01, 2010 06:52:02

Re: Вопрос по Си

Сообщение Васька серый »

добрый день.
небольшой вопрос, по формарированию вывода на сях.
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 и тд...
как правильно отформатировать?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопрос по Си

Сообщение ARV »

во-первых, в строке формата для "перевода строки" принято вводить "\n", а не шестнадцатиричный код "\x0d"
во-вторых, а вы уверены, что функция ds1820_temperature_10 возвращает результат типа char? по-моему, собака порылась именно тут :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по Си

Сообщение Аlex »

Проблема явно видна. С увеличением на 1 'C на датчике, значение увеличилось на 8. Это говорит о том, что датчик у Вас 18B20 а программа работает с 1820. Можете поделить это значение на 8, но это не выход. Ставьте датчик тот который указан в проге, либо указывайте в программе тот, который стоит :) И, как сказал AVR, тип переменной выберите float, а то десятых не будет...
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Re: Вопрос по Си

Сообщение 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;
}

но что-то он у меня сразу не заработал, может кто встречал описание, а то по коду не пойму!?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопрос по Си

Сообщение avreal »

Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Re: Вопрос по Си

Сообщение 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;
 }

но только из обсуждения не понял, что это за алгоритм, не могли бы Вы меня точно послать на ... этот разжеванный алгоритм!? :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»