реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> DS1621+ и CVAVR, индикация
Scanner
сообщение Oct 30 2009, 18:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 355
Регистрация: 23-07-08
Из: Пензенская область
Пользователь №: 39 157



Собрал простой термометр - 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 сек. В чём может быть проблема?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 30 2009, 20:12
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Пусть температура равна 36,6.
Функция ds1621_temperature_10() считывает температуру и умножает на 10 (Google сказал, а вы см. справку к CVAVR), т.е. получим 366.
Вам необходимо разделить 366 на целую и дробную часть опять, зная что в дробной всегда только одна цифра.
При использовании целочисленного типа (int), чтобы выделить целое, надо делить (/), чтобы выделить дробную часть - взять остаток от деления (%). Соображайте, задачка простая smile.gif
Go to the top of the page
 
+Quote Post
Scanner
сообщение Oct 31 2009, 03:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 355
Регистрация: 23-07-08
Из: Пензенская область
Пользователь №: 39 157



Цитата(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);


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

Сообщение отредактировал Scanner - Oct 31 2009, 03:56
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 31 2009, 11:12
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Да smile.gif

Теперь осталось разобраться со sprintf(): http://ru.wikipedia.org/wiki/Printf (раздел "Синтаксис строки форматирования", обязательно подраздел "Спецификатор типа").
Обратите внимание на то, что в Си "+" - это стока, а '+' - символ.
Также следует помнить, что остаток от деления отрицательного числа тоже будет отрицательным числом. И еще что если приказать программе трактовать знаковое число как беззнаковое, то отрицательное знаковое станет очень большим беззнаковым.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016