Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DS1621+ и CVAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Scanner
Собрал простой термометр - DS1621+ и LCD . Использовал стандартные модули CVAVR вот кусок основного кода :

Код
while (1)
      {  
      
    
    
        temper_ds=ds1621_temperature_10(0)/10;
       sprintf(lcd_buff,"t=%c%i.%u\xdfC","+",temper_ds,temper_ds%10);
        
                 lcd_clear();
           lcd_puts(lcd_buff);
          delay_ms(200);
          
      // Place your code here

      };


Проблема в следующем на индикатор выходят всё время значения типа - 23,3 24,4 25,5 ....30,0 и т.п.
Т.е. два последних разряда одинаковы. также значения меняются приблизительно через 1 сек. В чём может быть проблема?
SysRq
Пусть температура равна 36,6.
Функция ds1621_temperature_10() считывает температуру и умножает на 10 (Google сказал, а вы см. справку к CVAVR), т.е. получим 366.
Вам необходимо разделить 366 на целую и дробную часть опять, зная что в дробной всегда только одна цифра.
При использовании целочисленного типа (int), чтобы выделить целое, надо делить (/), чтобы выделить дробную часть - взять остаток от деления (%). Соображайте, задачка простая smile.gif
Scanner
Цитата(SysRq @ Oct 30 2009, 23:12) *
При использовании целочисленного типа (int), чтобы выделить целое, надо делить (/), чтобы выделить дробную часть - взять остаток от деления (%)

Тогда получается что я зделал не корректно разделив на 10 вот в этой строке
Код
temper_ds=ds1621_temperature_10(0)/10;

и переменная temper_ds после этого содержит всего два разряда

А в строке преобразования типа

Код
sprintf(lcd_buff,"t=%c%i.%u\xdfC","+",temper_ds,temper_ds%10);

происходит выделение дробной части только из первых двух разрядов (36 ) в итоге и получается моя проблема что всегда 23,3 или 24,4 Тогда скорее всего надо написать так:

Код
temper_ds=ds1621_temperature_10(0);
       sprintf(lcd_buff,"t=%c%i.%u\xdfC","+",[color="#FF0000"]temper_ds/10[/color],temper_ds%10);


Т.е. передавать на преобразование три старших разряда не деля их предварительно.
SysRq
Да smile.gif

Теперь осталось разобраться со sprintf(): http://ru.wikipedia.org/wiki/Printf (раздел "Синтаксис строки форматирования", обязательно подраздел "Спецификатор типа").
Обратите внимание на то, что в Си "+" - это стока, а '+' - символ.
Также следует помнить, что остаток от деления отрицательного числа тоже будет отрицательным числом. И еще что если приказать программе трактовать знаковое число как беззнаковое, то отрицательное знаковое станет очень большим беззнаковым.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.