Jump to content

LiVit

Members
  • Posts

    133
  • Joined

  • Last visited

Everything posted by LiVit

  1. Если интересует результат, а не процесс - найдите нового электронщика.
  2. Всё что вы сможете сделать на паскале, сможете и на си.
  3. Вам за меня ответили. Погрешности и ошибки имеют свойство накапливаться. Плюс непонятно, зачем микроконтроллер заставлять ворочать эту тяжелую математику. И лично меня убивает эта чУдная математика 2.20000005 + 1.10000002 = 3.30000019 И это при том, что вам не нужны эти float. Я могу понять, когда их используют в каких-нибудь сложных ЦОС (цифровая обработка сигналов), но при измерении тока, напряжения, времени.... PS. не удивляйтесь, что вам скоро вообще перестанут отвечать.
  4. На гражданина это заклинание не действует. Проверено.
  5. Ну уж нет! Извращаться, так от души! На i4004!! Даже интересно стало. Кто-нибудь из тех, кто профессионально пишет для микроконтроллеров, использует float? И если да, то для чего это могло понадобиться?
  6. Простой пример: float a = 1.1; float b = 2.2; float c = a+b; Человеки ожидают, что в c будет число 3,3. А там 3,30000019 Если взвешивать колбасу, то точность норм. Если что - KEIL, компилятор V5.06 update1 (build 61) - но не думаю, что зависит от компилятора. Подозреваю, что они все работают по стандарту IEEE 754
  7. Возможно, что прошивка привязана к конкретному чипу. Либо некорректно считали.
  8. 1 - уточню - пассивно-агрессивный )))). А невежда от того, что не используете соответствующую литературу. 2 - цена - потраченное впустую время. Оно невосполнимо. Время можно тратить для закрепления знаний, но не для того, чтобы на своем опыте их получить. Вы же (надеюсь) не выводите формулу Ома каждый раз? 3 - ничем. Труп страуса про плюсы писал, если я не ошибаюсь. А Керниган и Ричи - про Си. Был тут один гражданин на форуме. Он без затей попросил консультаций по Си, но за денежку. Я ему помогал, потом он пропал с горизонта. Недавно опять списывались. Так он понял, для чего ему Керниган и Ричи. Книжка бесплатная, там разжевано всё что нужно знать по Си. Если что-то нужно про двоичное счисление - тоже можно найти. Это просто. 4 - пишите, чем могу - помогу. Если время будет. А можно поступить проще - послушать умных людей на ютубе. Ссылка раз, ссылка два - это вообще по Си. А конкретно по float нужно у Хирьянова поискать. Возможно это было в цикле лекций по питону. Вот когда дойдете до указателей, когда вам понадобятся указатели на функцию, а скорее всего - массивы указателей на функцию, или даже массивы указателей на массивы указателей на функцию, вот тогда можно спрашивать у практикующих программистов - "на пальцах", может быть будет проще объяснить, чем в книжке.
  9. Ок. 32-х битная переменная a, по адресу 0x20 имеет значение 1 (0x00000001). По коду мы видим a = (1<<18); , т.е. переменной a присваивают значение 0x00040000. если красненький треугольник означает текущий шаг в симуляции, то непонятно, почему эта переменная содержит число 1, хотя должно содержать то же, что и b. Видимо, это особенности компилятора и он не использовал неявное приведение типов? Я в таких случаях делаю так: a = ((uint32_t)1)<<18; Такое написание отнимает пару секунд времени, зато не приходится потом искать такого рода ошибки. Подскажите пожалуйста, у вашего компилятора включена совместимость с C99? Возможно из-за этого неявное приведение типов не работает?
  10. Как-бы да, но - зачем? Вы понимаете смысл выражения (1<<x) применительно к работе с портами? Это означает обращение к конкретному биту. x говорит нам в каком разряде будет эта единичка. Во всех остальных разрядах - нули. Вот простенький пример - бегущий огонь. while(1) { for(uint8_t c=0; c<8; c++) { PORTD = (1<<c); //тут можно задержку поставить } } К вам, Юрий, есть претензии, но вы хотя-бы стараетесь разобраться. Один минус - не хотите (по неведомой мне причине) идти правильным путем, а исследуете всё методом тыка. И нет, я вам не предлагал помощь с кодом. Благотворительностью не занимаюсь. А что там не так? Вроде a тут 32 битная переменная? И единичку можно сдвинуть на 18 разрядов. Или я, пардон, что-то не так понял? А зачем тут вообще float? Вы в курсе, что это весьма неточный формат представления числа? Если вам нужны десятичные дроби - используйте фиксированную точку. Например, вам нужны сотые доли вольта. Берете переменную такого типа в который влезет максимальное напряжение умноженное на 100. Т.е., у вас максимальное напряжение 20 вольт, а разрешение вам интересно 0,01 вольт. тогда вам нужно взять uint16_t, так как в него влезает число 2000. Эта фиксированная точка потом просто вами учитывается в расчетах и всё.
  11. Что? Слушайте, после фразы "но чтобы кодить - нет" с вами всё понятно. Очередной теоретик-фантазер. Дальнейшую дискуссию считаю вредной, ибо тратит мое время
  12. float a = 0x00; uint8_t x = 1; uint8_t y = 2; a = (x<<y); Компилятор не ругается, программа выполняется, результат: a равно 4. Что я делаю не так? Зебра, я искренне надеюсь, что вы не программируете за деньги. В смысле, что это не ваша профессия. В противном случае, я очень не хотел бы иметь дело с устройствами, в которых ваши программы будут работать.
  13. Зёбра, зачем вы просрали космос? Да и всё остальное тоже? Нехорошо... Вы лично, что хотите тут доказать? Напомню, разговор шел про целые числа, которые в микроконтроллерах представляются байтами, 16 и 32 битными словами. Float штука синтетическая. При помощи 32 бит пытаются изобразить не целые числа. И "умный" компилятор воспринимает выражение float a = (1<<0); как единицу в представлении float. Удивительно, правда? Это называется неявное приведение типа. Почитайте на досуге. А вот сделать a = a<<1; в данном случае не получится. Потому что это логическая, побитовая операция. Можно вот так: a = (float)((uint32_t)a<<1); Число сначала приведется к целочисленному типу uint32_t (при этом, дробная часть будет отброшена), потом сдвинется на 1 бит, а затем опять приведется к типу float. Надеюсь, вам теперь стало немного понятнее? И теперь можно не беспокоиться за космос и прочее? Замечу, что число 1 в float представлено в виде 0x3F800000. И до него конечно же можно добраться средствами Си, хотя он изо всех сил сопротивляется. Например: float a = 1; uint32_t *b; b = (uint32_t*)&a; //теперь b указывает на число 0x3F800000 Если сделать так: *b = *b<<1; то a после этого будет содержать чУдную цифру 1.70141183e+038
  14. Компилятор, дорогой гражданин, немного умнее вас будет. И размерность данных будет подогнана под контекст. Сравните: for(uint8_t c=1; c<10; c= c<<1) и for(uint16_t c = 1; c<10; c = c<<1) В первом случае, по ходу выполнения цикла будет так: b00000001, b00000010, b00000100 Во втором случае так: b0000000000000001, b0000000000000010, b0000000000000100 Тоже самое, компилятор разберется и в таком случае: uint8_t a; uint16_t b; a = (1<<2); //a = b00000100 b = (1<<2); //b = b0000000000000100 PS и что, черт возьми, это такое - "нотиция"??? Такое ощущение, что вы пытаетесь придать своим словам солидности путем использования наукообразных слов, но выходит только хуже. Пишите проще.
  15. Гражданин, очевидно, путает си с ассемблером. Это там написал какой-нибудь RLF F, D, процессор это и будет делать.
  16. Выражение (1<<0) при операнде размера байт (char, uint8_t, int8_t) обозначает именно b00000001 << 0. Т.е., единицу сдвинуть влево на ноль позиций. Вообще, операция (x<<y) означает "содержимое x сдвинуть влево на y позиций" И компилятору не важно, что вы вместо x или y написали - переменную или константу. Удивляет ваше агрессивное невежество... Вы общаетесь тут с людьми, которые пишут на Си многие годы. Более того, некоторые могут даже обучать тех, кто учиться желает. И вы, не зная ничего (и похоже, не желая знать), рассказываете про "уверовать". С этим вам в церковь, а не на технический форум. И рекомендация почитать книжки - правильная. А вот тыкаться, как слепой котенок - неверно. Вот даже порекомендую книжку. Она простая, не толстая. И называется просто. "Язык Си".За авторством Кернигана и Ричи. Если что, это "отцы" языка.
  17. Почему нельзя купить готовое? Зачем такое неточное решение даже рассматривать? Вам качество и точность изготовления совсем не нужны?
  18. 1 Да, не посмотрел ваше место жительства. Про Казахстан ничего не скажу, но вот в Казань чаще всего за 2 недели доезжает. 2 Молчанку? Вам здесь никто ничего не должен. Хотим - отвечаем. 3 Я - высокооплачиваемый инженер. И к чему сарказм? Может быть вы не заметили, но раздел форума - "Вакансии и разовая работа". Это подразумевает, что услуги - оплачиваемые. И если у вас не хватает сил чтобы что-то найти - платите тем, кто может. И серьёзно, 600 рублей.....Я конечно понимаю, в Алмаате это какие-никакие деньги - можно долго кататься на метро, например. Или на автобусе... Но в России это не так. Я одному чуваку две строчки кода поправил, он мне 1000 заплатил (по своей инициативе, между прочим)
  19. Давно уже никто не делает зарядку и балансиры для литий-ионных батарей на рассыпухе. Берутся готовые микросхемы и используются. Для вашей задачи на алишке всё есть готовое. Зарядник на 2 последовательно включеные батарейки, балансир. А скорее всего - всё вместе. И с индикацией, конечно. Больше того, есть модуль показометра напряжения на такой батарее. За 600 рублей большинство местных даже не станут искать вам подходящие варианты на алишке, не говоря о том, чтобы что-то паять. Я вот это сейчас пишу только потому, что мне надо 10 минут свободных убить. За прошедшие 8 дней с момента вашей публикации, вы могли бы уже сами всё найти и товар уже половину пути преодолел бы.
  20. Воистину! Работал на одного "дядю". Он сначала вложил денег в разработку, написание программы для компьютера и только потом попробовал продать устройство. Не получилось.
  21. Хм.... вот после такого заявления, на какое отношение к себе рассчитывает гражданин? "Я ничего не смотрел, не изучал, мне пофигу принцип работы цифровой логики, типы переменных в Си вообще по барабану, а теперь расскажите мне, что мне дальше делать!" Как говорил химик моего сына - "вон угол, иди ударься". И нет, дорогой гражданин, вы меня не обидели. Я просто офигеваю с вас.
×
×
  • Create New...