Обмен по I2C Atmega8 и цифрового датчика температуры.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
kushman
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение kushman »

Добрый день!
Сделал небольшой девайс с атмегой8 и цифровым датчиком температуры MCP9844.
Столкнулся со следующей проблемой: при температурах выше 16-17 градусов, пересчет температуры идет верно, а при более низких температурах начинаются неадекватные показания. Не могу понять с чем это может быть связано, формула пересчета в программу забита из даташита: http://ww1.microchip.com/downloads/en/D ... 05192A.pdf
Запись температуры идет каждый час, вот пример результатов измерения:
HOUR 0:243.687
HOUR 1:244.125
HOUR 2:244.687
HOUR 3:245.187
HOUR 4:245.125
HOUR 5:245.375
HOUR 6:245.250
HOUR 7:244.187
HOUR 8:16.562
HOUR 9:241.000

Судя по значениям, неправильно выбирается формула пересчета (согласно даташиту, если температура ниже нуля - то формула одна, если выше - другая), однако, почему она выбирается при таких значениях а не при 0 не ясно.
Есть у кого какие мысли, товарищи?
Заранее спасибо!
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение BOB51 »

Честно говоря ничего особенного не узрел - стандартные данные в двоичном коде с тремя знаками за запятой. :dont_know:
Правила расчета одни и те же, что для положительного значения, что для отрицательного.
Есть правда одна тонкость - но она общая для любого цифрового термометра:
При обработке отрицательной величины надо превращать в абсолютную величину сразу все данные, включая используемые десятичные значения (а не по кускам - отдельно целую часть, отдельно дробную) независимо от того используются ли программой дробная часть или нет.
Иначе погрешность на один градус обеспечена.
:roll:
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение BorisSPB »

Три старших бита результата - это флаги сравнения с пороговыми значениями, если их обрезать - все будет нормально.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение BOB51 »

Дык их (флаги) по-любому к данным относить... :roll: - в даташите все расписано, а как использовать - то уже на усмотрение программописателя.
8)
Реклама
Эиком - электронные компоненты и радиодетали
kushman
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение kushman »

Все флаги у меня обнуляются в соответствии с даташитом. Сейчас посмотрел внимательно, у меня были перепутаны формулы для температур ниже и выше нуля. Сделал все как положено, но проблема от этого не пропала. Теперь температура ниже 16 градусов показывается, а если она выше 16, то берется другая формула. Для наглядности вот код, по которому происходит вычисление температуры:

Код: Выделить всё

float temperature(void) {

    float t; 
    char c_byte;
    I2C_Start(); 
    I2C_Send_byte(0x30 & 0xFE); 
    I2C_Send_byte(0x05); //0x05
    I2C_Start();
    I2C_Send_byte(0x30 | 0x01);    
    UpB=I2C_Receive_byte();
    I2C_ACK();
    LwB=I2C_Receive_byte();
    I2C_NOT_ACK();
    I2C_Stop();  
    UpB=UpB&0x1F;
    c_byte=UpB;
    if(c_byte&0x10==0x10) {
    UpB=UpB & 0x0F;  
    t=(256.0-((UpB*16.0)+(LwB/16.0)));
    } else {     
    t=((UpB*16.0)+(LwB/16.0)); 
    };
    return t;
}
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение BOB51 »

СИиии :shock:
Это не про меняааууу... :cry:
Работаю токмо с ассемблером и под своими алгоритмами (руководствуясь даташитовским описанием и мактной проверкой).
:oops:
Реклама
kushman
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Сообщение kushman »

А проблема вовсе не в программе то оказывается. Попробовал передать не пересчитанное значение, а сами байты. В результате выяснилось, что микросхема сама сбрасывает флаг знака температуры. Т.е. при температуре ниже 16 градусов, флаг устанавливается в 0, а должна быть единица. Подскажите товарищи, с чем это может быть связано?
Ответить

Вернуться в «Периферия»