volatile char i, L1, L2, line_2, line_1; volatile int T1; volatile int period;
Воооот, так вот T1 и period у меня почему-то от -32767 до 32767, а должон быть от 0 до 65535. Кто сталкивался? Я 3 часа убил чтоб найти почему у меня не работает прога.
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
А как вы узнали, что ваша переменная определилась как знаковая? Ваш компилятор выдает предупреждение при занесении в переменную значения большего чем 32768?
Самый простой способ проверить - сравнением значения переменной с константой:
unsigned int vrem = 33000;
if( vrem > 32999 ) { // тут зажигаем диодик }
Если условие выполнится, значит переменная точно имеет беззнаковый тип.
Ну, или, чуть более сложный, но надежный способ - почитать ассемблерный код вашей программы и проверить какое именно значение константы заносится в память.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
корявый перевод документации: Модификаторы signed и unsigned может быть применен как char и int . В отсутствие unsigned префикс, signed автоматически предполагается, для целых типов. Единственным исключением является char , который unsigned по умолчанию. Ключевые слова signed и unsigned , если они используются сами по себе, означает signed int и unsigned int соответственно. http://www.mikroe.com/download/eng/docu ... _types.htm Неправильное использование беззнаковых целых может приводить к неочевидным ошибкам из-за возникающего переполнения. В приведённом ниже примере использование беззнаковых целых в цикле в C и C++ превращает этот цикл в бесконечный:
Код:
char ar[N]; for (unsigned int i = N-1; i >= 0; --i) ar[i] = i;
Более менее ясно,а как тут быть? long vrem; char i = 2;
vrem = 65535*i;
Переменная vrem не становится равной 131070,но написав vrem=65535*2 тогда становится. Вот как это понимать?
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
это понимать так: срочно скачивайте книжку по языку Си и читайте ее внимательно до полного просветления!
65535*i - здесь 65535 - это unsigned int, а i - char. по правилам Си оба операнда должны быть одного типа, причем наибольшего из них (а еще интересно, что два char всегда приводится к двум int). то есть i приводится к unsigned int. по тем же правилам результат будет равен типу операнда, т.е. unsigned int. в таком типе не может помещаться больше, чем 65535.
65535*2 - это произведение констант. такие произведения вычисляются препроцессором ДО начала компиляции. при вычислениях скорее всего используется разрядность компьютерных Int-ов, поэтому получается константа 131070, которая уже законно имеет тип long и отлично помещается в переменную.
чтобы не было проблем с вычислениями вроде вашего 65535*i, используйте принудительное указание типа операнда больше, чем вам надо, например так: 65535 * (long)i. в этом случае переменная i вашими усилиями превратится в long, а потом 65535 тоже превратится в long, а потом произведение их тоже будет long, все в строгом соответствии с правилами Си.
но проще указать тип константы при помощи суффикса UL: 65535UL * i - в этом случае все будет то же самое, т.к. UL обозначает unsigned long
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Я догадывался, но вы расставили точки над i. Спасибо вам огромное. Век живи,век учись
_________________ Вот до чего же было классно в "Медали За Отвагу" - бросаешь гранату в немецкий патруль с собакой... Немцы разбегаются, а собака хватает гранату и отностит хозяину....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения