Перейти к содержанию
    

кто-нить его использовал?

 

считываю переменные калибровки. Закомменчены значения

// переменные калибровки
int16_t         AC1;   // 0x1FCC      
int16_t         AC2;   // 0xFBD1
int16_t         AC3;   // 0xC853
uint16_t        AC4;  // 0x8316
uint16_t        AC5;  // 0x63AF
uint16_t        AC6;  // 0x447B
int16_t         B1;    // 0x1973
int16_t         B2;    // 0x0026
int16_t         MB;    // 0x8000
int16_t         MC;    // 0xD1F6
int16_t         MD;    // 0x09C8

 

запрашиваю температуру

UT = 26459

 

дальше калибрую

    int32_t X1 = (UT - AC6) * AC5 / 32768; 
    int16_t X2 = MC * 2048 / (X1 + MD);
    int16_t B5 = X1 + X2;              
    int16_t T = (B5 + 8) / 16;

и Т у меня равно 435

 

ну нету у меня в квартире 43 градуса. Или что упустил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кто-нить его использовал?

Да. Всё там соответствует даташиту.

 

int32_t X1 = (UT - AC6) * AC5 / 32768;

int16_t X2 = MC * 2048 / (X1 + MD);

Когда такое пишете, как у вас вообще хоть что-то работает?

Откройте учебник по си на странице "типы данных".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3cSgKH7.jpg

вот что в даташите. Разные типы данных изначально.

Потом уже работаем с ними. От сюда мой код и вылезает. Да, соглашусь, типы разные, идет приведение одного к другому.

Как на ваш взгляд, стоило бы написать тогда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

причём тут типы исходных данных???

У Вас при вычислении MC * 2048 что получится?

В си разрядность результата == разрядности максимального операнда.

MC надо расширить до long.

А ещё люди для отладки используют отладчики обычно когда что-то неясно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня нет на АВР отладчика, есть AVReal и printf отладка. От того и страдаю.

 

грабли следующие

 

a75ca93eaa24t.jpg

 

как только разделил на любое число, прога встала

e23ef645520et.jpg

 

а так, да, если вручную поделить на калькуляторе T_1 на 16, то температура корректна

 

причём тут типы исходных данных???

У Вас при вычислении MC * 2048 что получится?

В си разрядность результата == разрядности максимального операнда.

MC надо расширить до long.

А ещё люди для отладки используют отладчики обычно когда что-то неясно.

т.е. корректно было бы делать

(int32_t)MC*2048 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это видел. но у меня twi на прерываниях, да и просто по граблям иной раз приятно походить и разобраться )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. корректно было бы делать

(int32_t)MC*2048 ?

Везде при умножении нужно учитывать, что разрядность произведения == сумме разрядностей операндов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем вы используете деление на 2 ?????

 

при делении у вас куча циклов и проблемы с приведением типов данных

 

используйте сдвиг в право на единицу.

 

так же легко можно поделить на 16 :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем вы используете деление на 2 ?????

так же легко можно поделить на 16 :)

Деление на степень двойки думаю любой компилятор заменяет на соотв. кол-во сдвигов. См. листинги.

Аналогично - умножение на степень 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...