Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Codevision - переполнение переменной?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Athlon128
Проблема такая. делаю цифровой спидометр на меге16, по прерыванию инкременирую переменную km, которая объявлена так: unsigned long int km=0;
Всё работает нормально, пока на машине не проедешь ~25км, т.е. переменная натикает ~125000, а дальше принимает отрицательное значение и далее возрастает уже из минуса. По видимому переполнение, но для unsigned long int диапазон значений от 0 до 4294967295, а она переполняется гораздо раньше, причём убегает в минус, хотя тип переменной - беззнаковое.

Может сталкивались с этой проблемой в codevisionAVR? подскажите как обойти плиз.. help.gif

ЗЫ: Смотрел memory map, там переменная занимает 4 байта как и положено для unsigned long int.
pokos
Что-то мне кажется, что дело не в переполнении переменной, а в процедуре её отображения.
$ilent
Цитата(Athlon128 @ Aug 1 2006, 13:57) *
По видимому переполнение, но для unsigned long int диапазон значений от 0 до 4294967295, а она переполняется гораздо раньше, причём убегает в минус, хотя тип переменной - беззнаковое.

А ты часом не присваеваешь ли потом значение переменной (mk) другой переменной типа signed long int???. К примеру при отображении???
Athlon128
Вывожу так:
Цитата
sprintf(lcd_buffer,"%d м",km/6);
lcd_puts(lcd_buffer);
pokos
"'d' - the function argument is a signed decimal integer;"
Athlon128
А как решить? есть буковка с % для этого случая? или делить на 10000 и выводить частное от деления и остаток отдельно?
at90
а в кодевижне в настройках проекта правильно стоит тип для sprintf?
Может там int или int with? а нада long
Athlon128
Цитата(at90 @ Aug 2 2006, 00:50) *
а в кодевижне в настройках проекта правильно стоит тип для sprintf?
Может там int или int with? а нада long

Да действительно int width, спасибо за рекомендацию, завтра опробую wink.gif
pokos
Цитата(Athlon128 @ Aug 1 2006, 20:44) *
А как решить?

Ну, для начала неплохо бы хелпы почетать:
"'u' - the function argument is an unsigned decimal integer;"
Balun
у меня подобная проблема было только с float.
Поменял настройки и всё заработало.
Serj78
И еще - чтобы не наступать на грабли: если эта переменная делается путем присваивания ей произведения другой переменной, объявленной меньшей разрядности, , например, unsigned int на число или другую переменную, то результат не может вылезти за 256*256, то есть разрядную сетку uns.int.

то же происходит и с другими типами. при умножении типа на число или меньший тип, результат не больше разрядности типа, хоть он и присваивается он большему типу- смотри во что это компилируется, будет понятно.
TamTam
Несовсем в тему но всеже спрошу, может у кого есть CodeVision с таблеткой из линейки 1.25
at90
а чем 1.24.7 не устраивает?
Есть на местном FTP
Athlon128
http://phreaker.ru/download/cvavr.rar
версия 1.24.8d с кряком
at90
а 1.24.9 ещё не никто не видел крякнутого?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.