Страница 1 из 2
Переменные в Code Vision
Добавлено: Чт авг 29, 2013 01:49:40
Sasha Lauta
Надо сохранить 60000000000 (десятичное) в eeprom, какой тип переменной объявлять. Такая
eeprom unsigned int freqense; не катит, это только 4 байта, а мне надо как минимум 5. Как объявить переменную на 8 байт.
Программу пишу в Code Vision
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 05:50:24
Panda_Y2K
А для чего???
Проще всего разбить значение на части и сохранить в двух переменных unsigned int
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 07:16:41
blackx
Ну или unsigned long / unsigned long long попробуйте...
ЗЫ пишите правильно - frequency а не freqense, если речь о частоте. Не заставляйте течь кровь из глаз читающих ваш код

Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 08:07:04
pyzhman
Если нужно сохранить именно 60000000000, о чем говорит ТС, то достаточно битовой переменной. Бит взведен - число есть, бит сброшен - там ноль.
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 11:42:19
Jack_A
pyzhman писал(а):Если нужно сохранить именно 60000000000, о чем говорит ТС, то достаточно битовой переменной. Бит взведен - число есть, бит сброшен - там ноль.
+ !!

Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 17:29:14
Sasha Lauta
Это число меняется и участвует в вычислениях. Long Long при компиляции выдает ошибку.
60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца.
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 18:03:23
pyzhman
Сохранить просто 60 в ансижнед, а при вычислениях не забывать степень десятки.
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 18:22:59
Аlex
60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца
А как Вы эту частоту храните в памяти после вычисления ? Узнав это, уже и будут советы по сохранению её в еепром.
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 22:22:24
Sasha Lauta
Аlex писал(а):60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца
А как Вы эту частоту храните в памяти после вычисления ? Узнав это, уже и будут советы по сохранению её в еепром.
В том то и проблема, что эта частота результат вычислений и пока результат не превышает 4 байта (гдето 4 с чемто мегагерца ) то все нормально, программа работает правильно. Когда переполняется регистр памяти (4 байта) то на дисплей уже сунет какой то бред. Регистр начинает заполнятся по второму кругу.
Думаю сделать дробную часть отдельно а целые будут помещаться в эту переменную, но это сильно усожняет жизнь, надо городить еще не малый кусок программы, плюс это надо еще придумать чтоб корректно работало. Проще было б использовать переменную куда б это число помещалось, но такого нет
Если есть идеи как разделить дробную часть и целые, пишите, буду благодарен за любой совет
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 22:26:01
Аlex
Если есть идеи как разделить дробную часть и целые, пишите, буду благодарен за любой совет
Ваши вычисления нам неизвестны, трудно что-то посоветовать.
ЗЫ: Может дробную часть сделать поменьше ? На порядок, к примеру.
Re: Переменные в Code Vision
Добавлено: Чт авг 29, 2013 23:15:19
a_skr
60 МГц с разрешением в 0.001 Гц ?
Что ваш AVR тут делает?

Re: Переменные в Code Vision
Добавлено: Пт авг 30, 2013 00:23:33
Cheba
Можно использовать
BСD представление. И тогда разрядность числа может быть какой угодно большой. Существует чуть ли не тысячи готовых библиотек с реализацией BCD арифметики. Но, в любом случае, если в каком-то устройстве в числах появляются 8-10 разрядов, это первый признак, что это устройство либо супердорогое и супернавороченное, либо сделанное ламером.
Re: Переменные в Code Vision
Добавлено: Пт сен 06, 2013 01:03:49
mehanik_all
double - 8 b - -1.8E-308 ... 1.8E+308
Можно так и записать: 60000000.000 !
Re: Переменные в Code Vision
Добавлено: Пт сен 06, 2013 11:06:30
mehanik_all
Не обратил внимания, что пишется в CodeVision. В нём 64-битные переменные double воспринимаются как 32-битные. Так что придётся разбивать на две части.
Re: Переменные в Code Vision
Добавлено: Сб сен 07, 2013 02:53:40
Cheba
mehanik_all писал(а):Можно так и записать: 60000000.000
Угу, с 11-12 значащими разрядами. Записать то можно, но вот вопрос, что больше, 60000000.000 или 60000000.001 может поставить в тупик вашу программу. Кстати, типичная ошибка начинающего программиста, потеря точности при расчётах с плавающей арифметикой.
mehanik_all писал(а):В нём 64-битные переменные double воспринимаются как 32-битные. Так что придётся разбивать на две части.
Это как ?

Re: Переменные в Code Vision
Добавлено: Сб сен 07, 2013 13:53:39
mehanik_all
Cheba писал(а):Это как ?

Что как? Тип
double в Си/С++ это 8 байт.
В CodeVisionAVR:
long int - длинное целое 32 бит
unsigned long int - длинное целое без знака 32 бит
signed long int - длинное целое со знаком 32 бит
float - с плавающей точкой 32 бит
double - двойное 32 бит
Или как разбивать на две части?
Re: Переменные в Code Vision
Добавлено: Сб сен 07, 2013 21:23:38
COKPOWEHEU
Не совсем. Стандарт Си не оговаривает конкретный размер типа данных. Все зависит от реализации. В Си принято что char 1 байт, short 2 байта, int 4 байта, long 8 байт ну и так далее. Я так понимаю что int равняется одному машинному слову а char по традиции 1 байт. Но еще раз, все зависит от реализации. В контроллерах частенько int 2 байта. Впрочем, при проверке выяснилось что мой компилятор не видит разницы между int и long int, считая обоих по 4 байта.
Re: Переменные в Code Vision
Добавлено: Сб сен 07, 2013 22:14:04
mehanik_all
Стандарт Си не оговаривает конкретный размер типа данных - по-этому у каждого компилятора есть свои нюансы.
int является типом целочисленных данных. Со всеми спецификаторами и модификаторами я знаю 17 штук. Часть из них 2 байта, часть 4 байта, и ещё часть длинной не менее 2-ух байт в зависимости от длинны (с последним я сам не разобрался пока - возможно имелось ввиду зависимость от разрядности системы).
Здесь как раз int не менее 2-ух байт, long int 4 байта. Хотя в CVAVR int-2 и long int-4.
long это не тип данных, это модификатор типа. Может имелось ввиду double, который как раз 8 байт в Си.
Re: Переменные в Code Vision
Добавлено: Вс сен 08, 2013 11:49:22
COKPOWEHEU
Простой long, как и short, без явного типа, воспринимается компилятором как long int и short int.
double это вроде long float. По крайней мере считается дробным числом удвоенного размера.
Не знаю вот насколько много можно этих long поставить перед идентификатором. Ну там long long long int.
Re: Переменные в Code Vision
Добавлено: Пн сен 09, 2013 15:40:09
vek
А нельзя-ли как-то так сделать:
X = 60000000000 = 0xD F847 5800
ТЕМР - unsigned int резервирует 2 байта
TEMP = X>>32 =0xD
TEMP--> eep // старшую часть запрятали в епрум
TEMP2 = TEMP<<32 = 0xD 0000 0000
TEMP3 = X - TEMP2 = 0xD F847 5800 - 0xD 0000 0000 = F847 5800
TEMP = TEMP3>>16 = 0xF847
TEMP-->eep //прячем медиум-часть
TEMP2=ТЕМР<<16 = F847 0000
TEMP = TEMP2 - TEMP = 0x5800
TEMP-->eep //прячем лоу-часть
int-ом полюбому проще манипулировать