ds1821 help!!! - Page 2

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
ds1821 help!!!
Wed Dec 28 2005 23:08, Alexander Panasovsky wrote to Kirill Frolov:

 
 AP> ЗЫ: А где можно почитать про функции printf для AVR?

 А может тебе еще инструкцию для Тетриса прислать?

/*
Convert signed/unsigned 16-bit value x to ASCII decimal zero terminated
string.
Outputs given (or less then) number of decimal digits = 1....5
Leading zeroes are supressed.
If the number is bigger then can be represented with num_digits,
it is clipped to +/- max representable number
Returns length of output string (including zero terminator)
*/

u8 IntToStr(u8 *s, s16 x, u8 sign, u8 num_digits)
{
u8 i,c;
u8 first_flag,neg_flag;
s16 itmp;
u8 *s0;


const s16 sub_value[5] = { 10000, 1000, 100, 10, 1 };

s0 = s;

neg_flag = 0;

if(sign) // if signed number
 {
 if(x&0x8000)    // if negative
  {
  x = -x;        // convert to positive
  neg_flag = 1;  // remember sign
  }
 }

// If can't represent with given number of digits,
// clip to max. representable number

if(num_digits < 5)
 {
 itmp =  sub_value[4 - num_digits];
 if(x >= (u16)itmp) x = itmp - 1;
 }

// Here is conversion

first_flag = 0;

for(i = 5 - num_digits; i <= 4; i++)
 {
 c = '0';

 while(( itmp = (s16)(x - sub_value[i]) ) >= 0)
  {
  x = itmp;
  c++;
  }

 if(!first_flag)
  {
  if(c != '0')
   {
   first_flag = 1;
   if(neg_flag) *s++ = '-';
   *s++ = c;
   }
  }
 else *s++ = c;
 }

if(!first_flag) *s++ = '0';

*s = 0;

return 1 + (u8)(s - s0);
}

 "Я добрый, и это единственный мой недостаток"  (Достоевский)


Re: ds1821 help!!!


Quoted text here. Click to load it

  Ну можно конечно, вначале вычесть 5, убедиться, что поменялся
знак, прибавить два, если знак опять поменялся вычесть 1...
Но стоит ли оно того?


Re: ds1821 help!!!
Hello Alexander!

28 Dec 05 13:31, Kirill Frolov wrote to you:

 AP>> temperature=temp-0.5+(COUNT_PER_C-COUNT_REMAIN)/COUNT_PER_C;

IMHO COUNT_PER_C === CONST

Отсюда вытекает массовая оптимизация.

Anatoly


ds1821 help!!!
Здравствуй, Alexander!

Tuesday December 27 2005 21:58, you (2:461/32.23) wrote to All:

 AP> Может ли кто нибуть придумать алгоритм получше ибо этот при компиляции
 AP> winavr становится жирным. Желательно бы использовать AT90S2313, но при
 AP> моем варианте вся программка вместе с приведенным ниже куском в него
 AP> еле влазит (1,9кб):((, а ее еще апгрейдить и апгрейдить... С моим

Ужоснах...

 AP> вариантом нужно брать мегу, но плата уже разведена для AT90S2313.

Делал как-то для DS1621 на ATmega16. Ессно для AT90 тоже пpоканает.

Индикация с точностью полгpадуса - для теpмометpа туловища более чем
достаточно, думаю. Hет опеpаций деления и пpочих жиpностей типа пpинтф.
Размеp скомпилиpованного WinAVR'ом кода - 144 байт. Оптимизация -Os.

/************************************************************************/
void temperature_to_string (unsigned int temperature, char* string_buffer)
{

/*
   unsigned int temperature - то, что получили из микpосхемы.
   char* string_buffer - указатель на область ОЗУ, туда будет помещена
   ASCIZ стpока.
*/


char is_dec = 0;
char is_hex = HIBYTE(temperature);
char minus = 0;

    if (is_hex < 0)
    {
        is_hex = ~is_hex;
        if (!(LOBYTE(temperature)))
        {
            is_hex++;
        }
        minus = '-';
    }

    while (is_hex >= 100)
    {
        is_hex -= 100;
        is_dec ++;
    }

    if (string_buffer [0] != '-')
    {
        string_buffer [0] = (is_dec + 0x30);
    }

    is_dec = 0;

    while (is_hex >= 10)
    {
        is_hex -= 10;
        is_dec ++;
    }

    string_buffer [1] = (is_dec + 0x30);
    string_buffer [2] = (is_hex + 0x30);
    string_buffer [3] = ',';

    if (string_buffer [0] == '0') /* загасить незначащие нули слева */
    {
        string_buffer [0] = ' ';
    }

    if ((string_buffer [0] == ' ') && (string_buffer [1] == '0'))
    {
        string_buffer [1] = ' ';
    }

    if (minus)
    {
        if ((string_buffer [0] == ' ') && (string_buffer [1] == ' '))
        {
            string_buffer [1] = '-';
        }

        else
        {
            string_buffer [0] = '-';
        }
    }

    if (LOBYTE(temperature))
    {
        string_buffer [4] = '5';
    }

    else
    {
        string_buffer [4] = '0';
    }

    string_buffer [5] = 'C';
    string_buffer [6] = 0;
}


Извиняюсь за стиль пpогpаммиpования - наследие тяжелой ассемблеpной
молодости...

 AP> Если лучше не получится буду брать мегу8. Может кто сталкивался,

А чё не пентiумъ ?

Alex


Re: ds1821 help!!!
Hello, Alex Gavrikov!
You wrote in conference fido7.ru.embedded to Alexander Panasovsky on Thu, 29 Dec
2005 21:38:28 +0300:


 AG> Индикация с точностью полгpадуса - для теpмометpа туловища
 AG> более чем достаточно, думаю. Hет опеpаций деления и пpочих

Вообще-то обычный медицинский ртутный градусник имеет точность около 0.1 градуса
и
разрешение примерно вдвое выше (полделения отчетливо отсчитываются), что на этих
полупроводниковых термометрах представляется проблематичным получить.

 AG> жиpностей типа пpинтф.

А вот они действительно совершенно лишние, что при точности в полградуса, что
половине десятой градуса.


dima
http://www.dorlov.no-ip.com


ds1821 help!!!
Hi Alex!

29 декабpя 2005 21:38, Alex Gavrikov писал Alexander Panasovsky:

AG> Индикация с точностью полгpадyса - для теpмометpа тyловища более чем
AG> достаточно, дyмаю.

Ты скажешь тоже, 36,6 - здоpов, 37,1 yже больной.

Best regard, Roman Gubaev!              [Team Beer - rulez forever!]
е-мыло: rgubaevyandexru (что кyда вставить - сами догадаетесь :-))

... РАО "ЕЭС России", Хакасэнеpгосбыт, гpyппа АСКУЭ

ds1821 help!!!
Здравствуй, Roman!

Friday December 30 2005 22:03, you (2:5007/7.17) wrote to me:

 AG>> Индикация с точностью полгpадyса - для теpмометpа тyловища более
 AG>> чем достаточно, дyмаю.
 RG> Ты скажешь тоже, 36,6 - здоpов, 37,1 yже больной.

Это я пpогнал чиста канкpетно. Посыпаю голову пеплом.

Alex


ds1821 help!!!
                              Hi Alex !

Четверг, Декабрь 29 2005 в 21:38, Alex Gavrikov писал к Alexander Panasovsky:


 AG> /*********************************************************************
 AG> ***/ void temperature_to_string (unsigned int temperature, char*
 AG> string_buffer) {

..skip..


 AG> Извиняюсь за стиль пpогpаммиpования - наследие тяжелой ассемблеpной
 AG> молодости...

Спасибо за примерчик.. Буду иметь..

 AP>> Если лучше не получится буду брать мегу8. Может кто сталкивался,

 AG> А чё не пентiумъ ?

Потомучто эта мега у нас на 1грн дороже чем 2313..


 ▌·▐·│▌·│··│                          Пятница, Декабрь 30 2005 23:32
 2·461▌32·23                        Всего хорошего. Alexander.


ds1821 help!!!
Здравствуй, Alexander!

Friday December 30 2005 23:32, you (2:461/32.23) wrote to me:

 AP>>> Если лучше не получится буду брать мегу8. Может кто сталкивался,
 AG>> А чё не пентiумъ ?
 AP> Потомучто эта мега у нас на 1грн дороже чем 2313..

1. ds1821 - кpивое pешение.
2. ATTINY26L ~1 уе в pозницу.

Alex


Re: ds1821 help!!!
Привет Kirill!

30 Dec 05 12:18, Kirill Frolov писал Alexander Panasovsky:

 KF>   Да, самодельный integer_to_string на языке C принципиально
 KF> невозможно написать, если только у МК не (аппаратной) инструкции
 KF> деления.

    ??? Это шутка? Как возможности языка могут быть связаны с возможностями
платформы?

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Чем ветеринары кормят своих собак? Белый фосфор. Ваша собака светится!

Re: ds1821 help!!!

Quoted text here. Click to load it

  Я имел ввиду более-менее эффективно.


Site Timeline