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

oleg70
djdron:

покажите кусок кода

Вот переменные:
int32_t dT,MS_temper;
uint32_t D2;
uint16_t C5,C6;

Вот расчет:
dT=D2 - (uint32_t)C5<<8; //( dT здесь получается 1700, проверял)
MS_temper=((int64_t)dT*28312)>>23;

MS_temper выходит -131, хотя должно быть 5…

Если пишу прям так: MS_temper=(1700*28312)>>23;
или присваиваю ранее dT=1700; - то как раз 5 и выходит…
Такое ощущение что c типом int64_t что то не так…

djdron

при умножении вылазит за 32 бита, попробуйте заменить на double, если заработает посмотрите как определен тип int64.
Возможно int64 определен как long, а компилятор его считает 32 битным, вспомнил (long long) 64 бита целочисленное.

oleg70
djdron:

Возможно int64 определен как long

Да, спасибо Вам за наводку, похоже где то здесь косяк… (первый признак, проверенные примеры из инета не работают…) буду копать.

djdron

Если “быстро” поправить то можно написать:
MS_temper=((long long)dT*28312)>>23;

Drinker

Камрады, а зачем вы геммороитесь с такими операцыями типа <<8 и >>23? кто мешает нормально делить и перемножать числа как и указано в даташите? Сами себе проблемы ищете.

Или наносекунды экономите?

это касается и возведения в степень

заранее двойку в степень возведите и усе

djdron
oleg70:

Вот расчет:
dT=D2 - (uint32_t)C5<<8; //( dT здесь получается 1700, проверял)

вот здесь еще косяк, не хватает скобочек:
dT=D2 - ((uint32_t)C5<<8);

Drinker:

Камрады, а зачем вы геммороитесь с такими операцыями типа <<8 и >>23? кто мешает нормально делить и перемножать числа как и указано в даташите? Сами себе проблемы ищете.

Или наносекунды экономите?

это касается и возведения в степень

заранее двойку в степень возведите и усе

можно и без << >>, просто это пример из интернета, вот его и разбирали почему не работает

oleg70
Drinker:

с такими операцыями типа <<8 и >>23

В моем случае деление на число=2^23 дает тот же результат…

djdron:

Если “быстро” поправить то можно написать:
MS_temper=((long long)dT*28312)>>23;

К сожалению, Андрей, не прошло и так…
Тут я понял однозначно: компиллер отказывается (?) понимать беззнаковые переменные при операциях деления или сдвига вправо, … он их считает знаковыми, независимо от непосредственного указания типа…
Хотя на сам тип реагирует - “warning”, если ему подсунуть uint16_t на проверку на “<0”…

djdron

не знаю что может быть с кейлом, вроде не должно быть такого, сам пишу в иаре, попробовал в иаре все работает:
unsigned short int C5 = 33464;
unsigned short int C6 = 28312;
unsigned int D2 = 16777215;
signed int dT = D2 - ((unsigned int)C5<<8);
signed int TEMP = 2000 + (((long long)dT*C6)>>23);
под ARM пишете?

Drinker
oleg70:

MS_temper=((int64_t)dT*28312)>>23; MS_temper выходит -131, хотя должно быть 5…

MS_temper ранее был объявлен как int32_t …почему он вдруг должен стать int64_t ?
И наверное MS_temper = 2000+dT*C6/2^23; Не?

oleg70
djdron:

не знаю что может быть с кейлом

Тут, скорее всего, ключ какой то нужен для компиллера, или еще какая “магия”…
Был удивлен, но : пишу
uint32_t K=57438; при компиляции он мне:
<main.c(78): warning: #68-D: integer conversion resulted in a change of sign>
т.е. он мне “великодушно” решил преобразовать беззнаковую в константу в знаковую (увидел старший бит)…
Не скажу что я программист, STM32 недавно только освоил, но ранее как то не сталкивался с этим (заморочки)…

Drinker:

почему он вдруг должен стать int64_t

произведение двух переменных в скобках больше 32-х разрядов, а они мне все нужны 😃

djdron

напишите вот так, посчитает ли кейл:
unsigned short int C5 = 33464;
unsigned short int C6 = 28312;
unsigned int D2 = 16777216;
signed int dT = D2 - ((unsigned int)C5<<8);
signed int TEMP = 2000 + (((long long)dT*C6)>>23);

oleg70
SergDoc:

дабы простыню не выкладывать

Не работает…
Вопрос снят, всем спасибо (фиг с ним с этим Keil-ом, у меня лимит в 32-Кб все равно уже заканчивается, буду какой нибуть CooCox мучить…)

Drinker
oleg70:

буду какой нибуть CooCox

Велком ту волшебный мир кокоса!

SergDoc
oleg70:

Не работает…

работает - на 103м и 407 точно 😃 и под кеил и под gcc…

oleg70
SergDoc:

работает - на 103м и 407 точно

Спорить не буду, но если интересно, можете посмотреть какие данные выдает датчик температуры MS5611 (в реале при нагреве и охлаждении), не знаю что за глюк, но у меня при <17,4 градуса сразу 22,… (явно в расчете переполнение на 256 ед.),
а так то да, все работает… циферки бегут… и высоту даже можно посчитать… 😃

rual
oleg70:

Вопрос снят, всем спасибо (фиг с ним с этим Keil-ом, у меня лимит в 32-Кб все равно уже заканчивается, буду какой нибуть CooCox мучить…)

Эт не правильно! Кейл отличный компиллер, а вот gcc никаких стандартов не соблюдает, можно в чистом Ц файле объявить переменную внутри кода и тд и тп
По поводу вашей переменной со знаком, компиллер вас предупреждает, что беззнаковая переменная участвует в действиях со знаковыми числами и будет преобразована, у ГЦЦ тут было бы всё шоколадно, но при вычислениях могли половить нереальный глюк. Чтоб предупреждения не выдавалось надо в коде выполнить явное преобразование типа (int32_t)peremennaya.

oleg70:

но у меня при <17,4 градуса сразу 22,… (явно в расчете переполнение на 256 ед.),

это как раз тот глюк о котором выше написано, результат сдвига uint8_t на 8 и более разрядов теряет всю значимую часть, за типами надо следить.

mahowik
oleg70:

буду какой нибуть CooCox мучить…

rual:

Кейл отличный компиллер

Саша, может оно и так. У них компиллер вообще свой?
Но в плане удобности IDE как бы сказать, не в ногу со временем…
Поставил вот сегодня CoIDE-1.7.5 + свежий 4.8 arm-none-eabi тулчейн. Создал новый проект под STM32F407VG, выбрал периферийные модули, закинул сорсы нужные. Готово! Единственное с чем про$%ся это с настройкой клоков, т.к. на дискавери 8мгц, а прописано в системных файлах 25мгц вроде… Кейл тут силен конечно, не знаю каким макаром, но вне зависимости от настроек проекта, чип всегда стартовал на положенных 168мгц…

А вот далее вкусности CoIDE, чего явно Кейлу не хватает на первый взляд:

  • скорость навигации. Кейл мягко говоря тупит на переходах + сами переходы только через контекстное меню, морока… а CoIDE через Ctrl+click прыгает куда надо без пауз…
  • code completion - сила! Вмиг на старте сканит проект и дает подсказки по всем свойствам классов, переменным и дефайнам по ctrl+space…
  • сканит и подсвечивает блоки неактивных дефайн секций
  • организация и менеджмент окон

Был бы он под линукс, ценыБ ему не было 😃

oleg70
mahowik:

не знаю каким макаром

Он (CooCox) генерит свой system_stm32xx,… если сразу поправить, то все работает… (вчера за час “переехал” на него с Keila), да, и в stm32f4xx.h надо не забыть HSE_VALUE исправить…
Порадовала оптимизация GCC, если “переборщить”, то виснет все - к энтой бабушке… 😃

SergDoc
mahowik:

Кейл тут силен конечно, не знаю каким макаром, но вне зависимости от настроек проекта, чип всегда стартовал на положенных 168мгц…

Кеил не при делах, system_stm32f4xx.c рулит 😃

* 5. This file configures the system clock as follows:
  *=============================================================================
  *=============================================================================
  *        Supported STM32F4xx device revision    | Rev A
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 168000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 168000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 8000000
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 8
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 336
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 7
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        Main regulator output voltage          | Scale1 mode
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 5
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | OFF
  *-----------------------------------------------------------------------------
  *        Instruction cache                      | ON
  *-----------------------------------------------------------------------------
  *        Data cache                             | ON
  *-----------------------------------------------------------------------------
  *        Require 48MHz for USB OTG FS,          | Disabled
  *        SDIO and RNG clock                     |
  *-----------------------------------------------------------------------------
  *=============================================================================
rual
mahowik:

Саша, может оно и так.

Мне тут важно было: поставил - заработало. Прошивка и отладка - всё работает сразу, без настройки.
насчёт ИДЫ всё верно, никакого особо сервиса… Но вот компиллер мне нравится, хороший код делает. Ну а самое главное для меня кириллические символы в коде, у меня вся внутренняя часть АП и ИНС написана кириллицей, так мне удобней и наглядней, а ГЦЦ кириллицу не понимает…
Линукс пока не актуален, хотя когда от МС останется только Вынь8 и её потомки, придется текать на линукс.