• Система автоматизации с открытым исходным кодом на базе 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?
 
Сверху Снизу