Переменные в Code Vision

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Сообщение Sasha Lauta »

Надо сохранить 60000000000 (десятичное) в eeprom, какой тип переменной объявлять. Такая eeprom unsigned int freqense; не катит, это только 4 байта, а мне надо как минимум 5. Как объявить переменную на 8 байт. :cry:

Программу пишу в Code Vision
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 258
Зарегистрирован: Пт сен 23, 2011 06:44:41
Откуда: ЮФО

Сообщение Panda_Y2K »

А для чего???
Проще всего разбить значение на части и сохранить в двух переменных unsigned int
Купи два беляша и собери из них кошку
Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)
Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Ну или unsigned long / unsigned long long попробуйте...

ЗЫ пишите правильно - frequency а не freqense, если речь о частоте. Не заставляйте течь кровь из глаз читающих ваш код :twisted:
Изображение only pure true norwegian blackx Изображение
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Если нужно сохранить именно 60000000000, о чем говорит ТС, то достаточно битовой переменной. Бит взведен - число есть, бит сброшен - там ноль.
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

pyzhman писал(а):Если нужно сохранить именно 60000000000, о чем говорит ТС, то достаточно битовой переменной. Бит взведен - число есть, бит сброшен - там ноль.
+ !! :)
Реклама
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Сообщение Sasha Lauta »

Это число меняется и участвует в вычислениях. Long Long при компиляции выдает ошибку.
60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Сохранить просто 60 в ансижнед, а при вычислениях не забывать степень десятки.
Docendo discimus
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца
А как Вы эту частоту храните в памяти после вычисления ? Узнав это, уже и будут советы по сохранению её в еепром.
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Сообщение Sasha Lauta »

Аlex писал(а):
60000000000 это максимальная частота в герцах три последних разряда это дробная часть герца
А как Вы эту частоту храните в памяти после вычисления ? Узнав это, уже и будут советы по сохранению её в еепром.
В том то и проблема, что эта частота результат вычислений и пока результат не превышает 4 байта (гдето 4 с чемто мегагерца ) то все нормально, программа работает правильно. Когда переполняется регистр памяти (4 байта) то на дисплей уже сунет какой то бред. Регистр начинает заполнятся по второму кругу.
Думаю сделать дробную часть отдельно а целые будут помещаться в эту переменную, но это сильно усожняет жизнь, надо городить еще не малый кусок программы, плюс это надо еще придумать чтоб корректно работало. Проще было б использовать переменную куда б это число помещалось, но такого нет :cry:

Если есть идеи как разделить дробную часть и целые, пишите, буду благодарен за любой совет
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Если есть идеи как разделить дробную часть и целые, пишите, буду благодарен за любой совет
Ваши вычисления нам неизвестны, трудно что-то посоветовать.

ЗЫ: Может дробную часть сделать поменьше ? На порядок, к примеру.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

60 МГц с разрешением в 0.001 Гц ? :shock:
Что ваш AVR тут делает? :dont_know:
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Сообщение Cheba »

Можно использовать BСD представление. И тогда разрядность числа может быть какой угодно большой. Существует чуть ли не тысячи готовых библиотек с реализацией BCD арифметики. Но, в любом случае, если в каком-то устройстве в числах появляются 8-10 разрядов, это первый признак, что это устройство либо супердорогое и супернавороченное, либо сделанное ламером.
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

double - 8 b - -1.8E-308 ... 1.8E+308

Можно так и записать: 60000000.000 !
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

Не обратил внимания, что пишется в CodeVision. В нём 64-битные переменные double воспринимаются как 32-битные. Так что придётся разбивать на две части.
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Сообщение Cheba »

mehanik_all писал(а): Можно так и записать: 60000000.000
Угу, с 11-12 значащими разрядами. Записать то можно, но вот вопрос, что больше, 60000000.000 или 60000000.001 может поставить в тупик вашу программу. Кстати, типичная ошибка начинающего программиста, потеря точности при расчётах с плавающей арифметикой.
mehanik_all писал(а): В нём 64-битные переменные double воспринимаются как 32-битные. Так что придётся разбивать на две части.
Это как ? :shock:
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

Cheba писал(а):Это как ? :shock:
Что как? Тип double в Си/С++ это 8 байт.
В CodeVisionAVR:
long int - длинное целое 32 бит
unsigned long int - длинное целое без знака 32 бит
signed long int - длинное целое со знаком 32 бит
float - с плавающей точкой 32 бит
double - двойное 32 бит

Или как разбивать на две части?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Не совсем. Стандарт Си не оговаривает конкретный размер типа данных. Все зависит от реализации. В Си принято что char 1 байт, short 2 байта, int 4 байта, long 8 байт ну и так далее. Я так понимаю что int равняется одному машинному слову а char по традиции 1 байт. Но еще раз, все зависит от реализации. В контроллерах частенько int 2 байта. Впрочем, при проверке выяснилось что мой компилятор не видит разницы между int и long int, считая обоих по 4 байта.
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

Стандарт Си не оговаривает конкретный размер типа данных - по-этому у каждого компилятора есть свои нюансы.
int является типом целочисленных данных. Со всеми спецификаторами и модификаторами я знаю 17 штук. Часть из них 2 байта, часть 4 байта, и ещё часть длинной не менее 2-ух байт в зависимости от длинны (с последним я сам не разобрался пока - возможно имелось ввиду зависимость от разрядности системы).
Здесь как раз int не менее 2-ух байт, long int 4 байта. Хотя в CVAVR int-2 и long int-4.

long это не тип данных, это модификатор типа. Может имелось ввиду double, который как раз 8 байт в Си.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Простой long, как и short, без явного типа, воспринимается компилятором как long int и short int.
double это вроде long float. По крайней мере считается дробным числом удвоенного размера.
Не знаю вот насколько много можно этих long поставить перед идентификатором. Ну там long long long int.
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение 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-ом полюбому проще манипулировать
Последний раз редактировалось vek Пн сен 09, 2013 16:36:40, всего редактировалось 4 раза.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Ответить

Вернуться в «AVR»