jcxz 187 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 6 минут назад, ToR_TDA сказал: В какой момент происходит проблема? И почему я не вижу ее по показаниям? Я не знаю что делает div() и какой формат её аргументов, и что такое div_t, поэтому не могу сказать. Но подумайте, что будет если current==-32768 ? Или посмотрите на мой код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 37 минут назад, ToR_TDA сказал: Если честно то не очень понял. Есть некоторое АЦП которое отдает мне данные так: 32767 = 3,2767A -32768 = -3,2768A При этом коду 0x0000 соответствует ток 0А. В какой момент происходит неправильная смена знака? Если вы получили int16_t current = -32768, и попытаетесь сделать его положительным (current = -current), то в current у вас останется -32768. Потому что максимальное положительное значение для int16_t равно 32767. В вашем коде я сейчас не вижу смены знака, похоже, что вы просто отрезаете "минус" при форматировании. Тогда, скорее всего, ваш код покажет некорректные данные на значениях типа "-30.023" (будет печататься "-3.-02"). Вот, протестировал ваш код. при current = -30356 пишет: I= --3.-35 A Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ToR_TDA 0 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 15 minutes ago, jcxz said: Я не знаю что делает div() и какой формат её аргументов, и что такое div_t, поэтому не могу сказать. Да я тоже только узналhttps://ru.cppreference.com/w/cpp/numeric/math/div 25 minutes ago, jcxz said: Но подумайте, что будет если current==-32768 ? Понял, при -32768 на выходе будет -0.000 17 minutes ago, AHTOXA said: Тогда, скорее всего, ваш код покажет некорректные данные на значениях типа "-30.023" (будет печататься "-3.-02"). Из того что я понял будет только одна проблемная точка это -32768. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 15 минут назад, ToR_TDA сказал: Из того что я понял будет только одна проблемная точка это -32768. Видимо, реализация sprintf в вашем компиляторе отличается от стандартной. Потому что стандартная печатает для current = -30356 строчку "I= --3.-35 A". Вот ссылка, можете сами проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ToR_TDA 0 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 2 minutes ago, AHTOXA said: "I= --3.-35 A". Каюсь, не всю программу выложил. Это связано было со способом приема данных с АЦП через 2 отдельных байта MSB и LSB. int16_t current; char sign; div_t fracDigit; char Str_Buffer[20]; int8_t MSB = 0x83; uint8_t LSB = 0x00; //например -32000 current = abs (MSB << 8 | LSB); if (MSB >= 0) sign = ' '; else sign = '-'; fracDigit = div(current/10,1000); sprintf(Str_Buffer, "I= %1c%1d.%03d A", sign, fracDigit.quot, fracDigit.rem); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба А, теперь понятно. Да, в этом случае опасно только одно значение -32768. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ToR_TDA 0 7 мая, 2020 Опубликовано 7 мая, 2020 · Жалоба 2 hours ago, AHTOXA said: Да, в этом случае опасно только одно значение -32768. Так как у меня нет отдельной информации о переполнении АЦП, я назначу обе крайние точки 32767 и -32768 как "out of range". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться