• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь магнитометр QRM3100 и ESP8266

CodeNameHawk

Moderator
Команда форума
Попробуйте так
Код:
int32_t x;

int32_t xx2 ;
uint32_t xx1 ;
uint32_t xx0 ;

  int8_t mx2 = readRegister(0x24);//Если первым передается старший разряд.
  uint8_t mx1 = readRegister(0x25);
  uint8_t mx0 = readRegister(0x26);

x = (xx2 * 256L * 256L)+ (xx1 * 256UL)+ xx0;
И для отладки выведите все переменные в сериал.
 

nikolz

Well-known member
  • int x = ((int)readRegister(0x24)<<16)+ ((int)readRegister(0x25)<<8)+readRegister(0x26);
  • int y = ((int)readRegister(0x27)<<16)+ ((int)readRegister(0x28)<<8)+readRegister(0x29);
  • int z = ((int)readRegister(0x2A)<<16)+ ((int)readRegister(0x2B)<<8)+readRegister(0x2C);
 

pvvx

Активный участник сообщества
  • int x = ((int)readRegister(0x24)<<16)+ ((int)readRegister(0x25)<<8)+readRegister(0x26);
  • int y = ((int)readRegister(0x27)<<16)+ ((int)readRegister(0x28)<<8)+readRegister(0x29);
  • int z = ((int)readRegister(0x2A)<<16)+ ((int)readRegister(0x2B)<<8)+readRegister(0x2C);
В каких-то вариантах компилятора сработает, но только так:
int x = ((int)readRegister(0x24)<<16)+ (readRegister(0x25)<<8)+readRegister(0x26);
Лишний (int) :p
Но можете получить длиннющий код.
Обычно масса CPU умеет сама перекидывать (расширять) в регистрах 8->много бит и так-же перестановки, без сдвигов. Оптимизация зависит от указанной глубины и прочих побочек компилятора.
Ваш код может привести к множеству вариантов и на ESP, в зависимости от контекста процедуры...
Может вставить и вызов библиотечной функции сдвига по одному биту :)
 

pvvx

Активный участник сообщества
@nikolz
(int)readRegister(0x27) - что тут описано?
Преобразование uint8_t в int?
Или преобразование int8_t в int?
Я например не знаю, как описана процедура readRegister().
И для точности надо сделать двойное преобразование x->int8_t->int.
 

nikolz

Well-known member
еще вариант:
int x =(int)readRegister(0x26) + ( ( readRegister(0x25) + ( readRegister(0x24)<<8) <<8)
 

nikolz

Well-known member
@nikolz
(int)readRegister(0x27) - что тут описано?
Преобразование uint8_t в int?
Или преобразование int8_t в int?
Я например не знаю, как описана процедура readRegister().
И для точности надо сделать двойное преобразование x->int8_t->int.
описание регистра есть в исходной программе автора там без знаковый байт
---------------------------
написано преобразование байта в знаковое целое
так как читаем из регистра то в нем байт
 

nikolz

Well-known member
@nikolz
(int)readRegister(0x27) - что тут описано?
Преобразование uint8_t в int?
Или преобразование int8_t в int?
Я например не знаю, как описана процедура readRegister().
И для точности надо сделать двойное преобразование x->int8_t->int.
замечу что ваше решение через union не универсально так как необходимо знать порядок хранения байт в числе, а он бывает разным.
 

CodeNameHawk

Moderator
Команда форума
на ардуине про мини начальный код работает корректно и отрицательные значения выдает.
этот код от "pvvx" работает корректно и на ардуине и на есп8266:
  • union {
  • int32_t i;
  • int16_t w[2];
  • uint8_t ub[4];
  • } x;
  • int8_t a;
  • a = (int8_t) readRegister(0x24);
  • x.w[1] = (int16_t) a;
  • x.ub[1] = (uint8_t) readRegister(0x25);
  • x.ub[0] = (uint8_t) readRegister(0x26);
но не могу его пока вставить в метеостанцию - компиллятор ругается словами "... does not name a type"
 

pvvx

Активный участник сообщества
Задам вопрос по другому, есть ли какой ардуино процессор, в котором int по умoлчанию 64 бита.
Это можно определить самостоятельно или в SDK, для приложения или какой либы, даже для ESP.
Вопрос стоял в том, надо ли 64-х битном писать 123LL? Константа изначально воспринимается в 64 или 16 бит как вы указали?
 

pvvx

Активный участник сообщества
размер типа int определяется не компилятором а разрядностью CPU
а компилятор делается с учетом CPU
Это чистые пожелания, а в реальности - бывает как угодно.
Возьмите расширения (переключение на разный режим) у многих процов - Thumb — Википедия
 

pvvx

Активный участник сообщества
@nikolz - В AVX у intel/amd 256-битные регистры...
Какова разрядность CPU?
 
Сверху Снизу