Создание собственной системы стабилизации

SergDoc

Кстати мне тут посоветовали убрать цыклы считывания датчиков - заменить на тупое считывание каждого регистра - флеши займёт больше (ну тупо для мпу - 14 строчек ) но должно дать производительность - не надо время на запуск и проверку цыкла делать - флеши пока хватает - как?

oleg70
rual:

проверьте правильность сборки 24 битного слова

Проблему кажется локализовал, но ничего не понял … Дело в самом выводе в терминал компа…
Ситуация такая (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 было положительным…

SergDoc

Что Александр и писал, неправильное представление 24-х битного слова, если лезет минус - это переполнение…

oleg70
SergDoc:

неправильное представление 24-х битного слова

Тут попахивает моим полным непониманием типов переменных (тяжелое наследие AVr) 😃, бывает видимо и так - написал почти весь код (и причем “рабочий”) и нифига не правильно…

Sir_Alex
oleg70:

Причем все нормально до 32768, а далее уже ненормально… Мне всегда казалось что int32_t (stdint.h) хватает чтоб 45653 было положительным…

У вас константа int16_t, что бы она стала int32_t надо дописать в конце букву ‘L’

int32_t data;
data=45653 L;

oleg70
Sir_Alex:

в конце букву ‘L’

Проверил, - то же самое…😦 И так: (int32_t)45653 - тоже…

SergDoc

Олег вот драйвер отталкивайтесь от него… он рабочий…

oleg70:

И так: (int32_t)45653 - тоже…

но если переменная 16- битная вылезла с переполнением, естествено минус, то при приведении её в32-битную всё равно останется минус, т.е. первая единица переместится в старший разряд - я так понимаю оно ж всё в дополнительном коде…

oleg70
SergDoc:

… он рабочий…

Это все я уже смотрел, делал один в один с поправкой на SPI, но дело не в “общем” непонимании математики этого баро, а в том что результат расчета при неправильном указании типов - неправильный (хотя работает и так 😃), это уже чисто программерские заморочки,
может кто проведет “ликбез”…

SergDoc

не ну вот 16-битная переменная 45653 в дотолнительном коде(как проц считает) это -19883 и если после этого вы приведёте её к int_32 она всё равно останется -19883, тут изначально надо искоренить 16-ти битное представление?
тут можно покопаться - по SPI…
как вариант брать беззнаковое значение?

oleg70
SergDoc:

16-битная переменная 45653

Ситуация: int32_t переменная равная 45653(чисто для примера) считается положительной до 32768 и далее отрицательной, хотя по идее, диапазон “знаковой 32-х битной переменной” от -65535 до 65536 (?),…
Если здесь не разобраться то, потом коптер улетит на луну… 😃

SergDoc

32768 это -1 в шеснадцатибитном представлении - где-то кроется переполнение 😦 при чём 16 -ти битной переменной… у вас где-то неправильное приведение переменных!!!

Alexey_1811
SergDoc:

32768 это -1 в шеснадцатибитном представлении

-1 это 65535 или я чего то не знаю?

oleg70
SergDoc:

у вас где-то неправильное приведение переменных

int32_t data;
data=45653;
if(data<0)… ГДЕ ?

SergDoc

16 бит 10000000000000000 - в дополнительном коде - старший бит это знак числа, дабы перевести в основной надо добавить в младший бит единицу и естественно поставить знак - получаем -1… если в старшем бите 0 то единицу добавлять ненадо… говорю же где-то кроется 16 битная переменная с переполнением…

oleg70

Задам вопрос по другому,: “какого типа должна быть объявлена переменная, чтоб ей можно было присвоить значение 45635 и компилятор это значение не принимал за отрицательное” …
(а сейчас у меня условие <0 выполняется…(?))

SergDoc
oleg70:

Задам вопрос по другому

Олег пацаны тут умные - не то что я: кодятник в студию - разберуться 😃
ну задайте ему uint…

oleg70
SergDoc:

пацаны тут умные

Надеюсь, что ткнут меня носом в мою безграмотность… (если б не MS5611, с его “миллионными” значениями в расчетах, я б может и не знал,- что ничего не понимаю…)

Sir_Alex
oleg70:

Проверил, - то же самое… И так: (int32_t)45653 - тоже…

Перекомпили еще раз, должно было помочь, по всем описаниям, проблема именно в том, что константа по умолчанию идет как int, т.е. от -32768 до +32768.

mataor

хмм… а зачем вообще применять знаковые переменные? кто нам мешает использовать unsigned???

SergDoc

Не, ну а что за текст? Я без претензий ибо для меня языки программирования - это птичий язык, чесное слово, я могу понять где какие переменные, где какие алгоритмы - но общей картины я не могу представить - хоть убей, а по каким-то урывкам темболее 😦

Sir_Alex:

Перекомпили еще раз

я чего-то не вижу?
кстати есть неразрешенный вопрос, вроде как можно родное ПО PX4 компилить и отлаживать в эклипсе?

rual
oleg70:

Ситуация такая (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)

, а в нём может быть преобразование типа.

SergDoc:

кстати есть неразрешенный вопрос, вроде как можно родное ПО PX4 компилить и отлаживать в эклипсе?

Компилить - смысла нет, отлаживать - надеюсь не придётся.