Создание собственной системы стабилизации
Причем все нормально до 32768, а далее уже ненормально… Мне всегда казалось что int32_t (stdint.h) хватает чтоб 45653 было положительным…
У вас константа int16_t, что бы она стала int32_t надо дописать в конце букву ‘L’
int32_t data;
data=45653 L;
в конце букву ‘L’
Проверил, - то же самое…😦 И так: (int32_t)45653 - тоже…
Олег вот драйвер отталкивайтесь от него… он рабочий…
И так: (int32_t)45653 - тоже…
но если переменная 16- битная вылезла с переполнением, естествено минус, то при приведении её в32-битную всё равно останется минус, т.е. первая единица переместится в старший разряд - я так понимаю оно ж всё в дополнительном коде…
… он рабочий…
Это все я уже смотрел, делал один в один с поправкой на SPI, но дело не в “общем” непонимании математики этого баро, а в том что результат расчета при неправильном указании типов - неправильный (хотя работает и так 😃), это уже чисто программерские заморочки,
может кто проведет “ликбез”…
не ну вот 16-битная переменная 45653 в дотолнительном коде(как проц считает) это -19883 и если после этого вы приведёте её к int_32 она всё равно останется -19883, тут изначально надо искоренить 16-ти битное представление?
тут можно покопаться - по SPI…
как вариант брать беззнаковое значение?
16-битная переменная 45653
Ситуация: int32_t переменная равная 45653(чисто для примера) считается положительной до 32768 и далее отрицательной, хотя по идее, диапазон “знаковой 32-х битной переменной” от -65535 до 65536 (?),…
Если здесь не разобраться то, потом коптер улетит на луну… 😃
32768 это -1 в шеснадцатибитном представлении - где-то кроется переполнение 😦 при чём 16 -ти битной переменной… у вас где-то неправильное приведение переменных!!!
32768 это -1 в шеснадцатибитном представлении
-1 это 65535 или я чего то не знаю?
у вас где-то неправильное приведение переменных
int32_t data;
data=45653;
if(data<0)… ГДЕ ?
16 бит 10000000000000000 - в дополнительном коде - старший бит это знак числа, дабы перевести в основной надо добавить в младший бит единицу и естественно поставить знак - получаем -1… если в старшем бите 0 то единицу добавлять ненадо… говорю же где-то кроется 16 битная переменная с переполнением…
Задам вопрос по другому,: “какого типа должна быть объявлена переменная, чтоб ей можно было присвоить значение 45635 и компилятор это значение не принимал за отрицательное” …
(а сейчас у меня условие <0 выполняется…(?))
Задам вопрос по другому
Олег пацаны тут умные - не то что я: кодятник в студию - разберуться 😃
ну задайте ему uint…
пацаны тут умные
Надеюсь, что ткнут меня носом в мою безграмотность… (если б не MS5611, с его “миллионными” значениями в расчетах, я б может и не знал,- что ничего не понимаю…)
Проверил, - то же самое… И так: (int32_t)45653 - тоже…
Перекомпили еще раз, должно было помочь, по всем описаниям, проблема именно в том, что константа по умолчанию идет как int, т.е. от -32768 до +32768.
хмм… а зачем вообще применять знаковые переменные? кто нам мешает использовать unsigned???
Не, ну а что за текст? Я без претензий ибо для меня языки программирования - это птичий язык, чесное слово, я могу понять где какие переменные, где какие алгоритмы - но общей картины я не могу представить - хоть убей, а по каким-то урывкам темболее 😦
Перекомпили еще раз
я чего-то не вижу?
кстати есть неразрешенный вопрос, вроде как можно родное ПО PX4 компилить и отлаживать в эклипсе?
Ситуация такая (CooCox): (для проверки сделал следующий код)
int32_t data;
data=45653;
if(data<0)
{out_usart2(0x2D);
data=abs(data);
}
Так вот компиллер считает что 45653 - “меньше нуля” (???), потом ессно делает abs() и далее из “data” получается -19883 (??)
Причем все нормально до 32768, а далее уже ненормально… Мне всегда казалось что int32_t (stdint.h) хватает чтоб 45653 было положительным…
Минуса быть не должно! Функция abs() (типовая) работает ТОЛЬКО С ПЛАВУЧКОЙ (float, double), вероятно срабатывает каконидь сурогатный подкокосовый макросс
#define ABS(X) ((X<0)?-X:X)
, а в нём может быть преобразование типа.
кстати есть неразрешенный вопрос, вроде как можно родное ПО PX4 компилить и отлаживать в эклипсе?
Компилить - смысла нет, отлаживать - надеюсь не придётся.
int32_t data;
data=45653;
if(data<0)… ГДЕ ?
Олег, покажите как у вас определены int32_t и другие типы переменных?
как у вас определены int32_t и другие типы переменных
Если б я знал… 😃. Полез сейчас в “дебри”, рою в сети, оказалось все не так просто…
Если б я знал… . Полез сейчас в “дебри”, рою в сети, оказалось все не так просто…
Как вариант, посмотреть ассемблерный код этого куска.
Я в дневнике выложил текущую прошивку и лодырь (пока всё обзывается px4)
Полез сейчас в “дебри”
Полез и нашел 😃, проблема была в настройках проекта CooCox, - действительно типы компиллер понимал неадекватно
из за непонятного #include stdint.h (подключался дважды (?) из разных мест)…
Теперь “все что нужно положительное” и давление показывает правильное, всем спасибо за поддержку…
Поздравляю!
У меня предложение - выкинуть еепромку 24xx - кто за? она уже не используется - раз, медленная - два, висит на i2c и занимает место на плате - три… все настройки хранятся в виртуальной eeprom в последних секторах флеша, на борту есть флеш m25p16 по spi…
У меня предложение - выкинуть еепромку 24xx - кто за?
Я давно ЗА, но мы, помнитцца, не докопались, где за неё АПМ цепляется. По идее, можно было от всех еепромов избавиться, достаточно набортной СД и внтренней памяти проца под настройки.
выкинуть еепромку 24xx - кто за?
И магнитометр… , я уже выкинул, оставил только наружу разъем i2c, на случай если “преспичит”…