Страница 103 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 14:50:46
ValBag
Amstron писал(а):unsigned int indication_IND;
Если вывести число a[0] = 186; то оно правильно выводится, а остальные неправильно... Что то я не догоняю...
А вы уверены, что
unsigned int? Похоже на восмиразрядную переменную. Поэтому все ваши числа, начиная с 279 отображаются неверно. Так 372 будет 116; 465 - 209, и т. д.
Это может быть даже не здесь, а при обработке вывода на индикатор.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 15:04:12
ValBag
Amstron писал(а):если я объявляю массив как flash unsigned int a[100]; то как потом мне в нем изменить значение элементов?
Насколько известно, только при программировании МК. Если нужно, записывайте в EEPROM. Там оперативные изменения возможны.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 15:29:36
Amstron
Нужно решить это математическое действие зная все переменные.
indication_IND = (y1 + ((y2-y1)/(x2-x1))*(x-x1));
float y1, y2, x, x1, x2, ;
unsigned int indication_IND;
Почему то у меня на индикаторе indication_IND всегда горит Ноль! Почему? Я же ведь использую переменные с плавающей точкой!!!
indication_IND = (30+((45-30)/(465-372))*(418-372)) = 37,419
Или нельзя сразу много действий делать?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 15:39:03
ValBag
Amstron писал(а):Почему то у меня на индикаторе indication_IND всегда горит Ноль! Почему? Я же ведь использую переменные с плавающей точкой!!!
indication_IND = (30+((45-30)/(465-372))*(418-372)) = 37,419
У вас результат записывается в переменную
unsigned int, несмотря на то, что в правой части используются переменные
float
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 15:47:43
Amstron
ValBag писал(а):Amstron писал(а):Почему то у меня на индикаторе indication_IND всегда горит Ноль! Почему? Я же ведь использую переменные с плавающей точкой!!!
indication_IND = (30+((45-30)/(465-372))*(418-372)) = 37,419
У вас результат записывается в переменную
unsigned int, несмотря на то, что в правой части используются переменные
float
А почему если я делаю так, то у меня на индикаторе пишется число 6 ??? По Вашему умузаключению же такого быть не может!
x1 = 93;
y1 =15 ;
indication_IND = x1/y1; //indication_IND = 6,2
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 15:58:14
Amstron
Ноль выводил, потомуто накосячил с выводом числа x1 и тому подобных.
А вопщих чертах работает!!! и нет ни какой ругани с unsigned int, несмотря на то, что в правой части используются переменные float!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 16:10:23
ValBag
Amstron писал(а):А почему если я делаю так, то у меня на индикаторе пишется число 6 ??? По Вашему умузаключению же такого быть не может!
x1 = 93;
y1 =15 ;
indication_IND = x1/y1; //indication_IND = 6,2
Соответствие типов переменных, это не мое умозаключение, а правила СИ. Я не сказал, что
0 на индикаторе будет всегда. Ругани не будет, а компилятор молча запишет результат в
целочисленную (а не дробную) переменную
int, а отрицательный "результат" вылезет потом.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 17:41:24
odesasha
Amstron писал(а):
А вопщих чертах работает!!! и нет ни какой ругани с unsigned int, несмотря на то, что в правой части используются переменные float!
Выключены предупреждения в настройке Compiler по несоответствию типов.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 02, 2011 17:55:20
Amstron
odesasha писал(а):Amstron писал(а):
А вопщих чертах работает!!! и нет ни какой ругани с unsigned int, несмотря на то, что в правой части используются переменные float!
Выключены предупреждения в настройке Compiler по несоответствию типов.
Ну, да так и есть... Пока не вижу смысла паниковать...(((
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 10:30:15
Amstron
Помогите разобраться! Если я создаю массив приведеный ниже то у меня программа занмает 1537 слов 0% eeprom
unsigned int massiv[100];
А если создам в eeprom, то
eeprom unsigned int massiv[100]; 1569 слов, 200 байт eeprom 39,1 % от eeprom.
Вопрос: я как пологаю 1569 это общий размер файла прошивки. При создании массива в области eeprom у меня добавилось еще 32 слова - я пологаю это вектора адресов на массив коорый находится в eeprom???
Второе: При создании массива в eeprom компиль ругнулся следующей фразой: Warning : L40: uninitialized EEPROM
Что бы это могло значить? Переводчик говорит что неинициализированный EEPROM.
Скажите, если я делаю массив в памяти eeprom, то где его инициализировать? Точнее как в этот массив записать значения?
Далаю вот такую запись eeprom massiv[5] = 279; не проканывает! Тоесть все как и раньше, только вставляю слово eeprom - но не получается.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 10:40:18
radio-kot
как в Хелпе CVAVR написано в примерах
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 11:36:28
ValBag
Amstron писал(а):Помогите разобраться!
Чтобы не было варнинга, объявление переменной в ЕЕPROM:
Код: Выделить всё
#pragma warn-
eeprom unsigned int massiv[100] = {...}; // инициализация, если нужно.
#pragma warn+
Ну а дальше, обращение как к обычной переменной, без всякого EEPROM.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:00:48
Amstron
ValBag писал(а):Ну а дальше, обращение как к обычной переменной, без всякого EEPROM.
Все отлично! Спасибо! Но есть одно НООО!
Те ячейки массива которые не были инициализированны имеют одно и тоже число 535 (по крайней мере у меня на семисегментнике 3-х разрядном), а должно быть НОЛЬ... Как быть???
Почитал Лебедева, там написано что ВСЕ элементы массива инициализируются нулями , если записать так:
#pragma warn-
eeprom unsigned int ddd[100];
#pragma warn+
У меня раньше так и было, пока я не стал использовать eeprom! Пойду в настройках компиля пошарюсь...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:07:35
radio-kot
Начать думать.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:21:48
ValBag
Amstron писал(а):Те ячейки массива которые не были инициализированны имеют одно и тоже число 535 (по крайней мере у меня на семисегментнике 3-х разрядном), а должно быть НОЛЬ... Как быть???
Устанавливаются в
"0" неинициализированные ячейки глобального массива, а локального - могут содержать что угодно. Так-что, если необходимы нули, придется их "вставлять". Или, если не делали, попробуйте перед программированием стереть МК.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:29:18
Amstron
ValBag писал(а):Amstron писал(а):Те ячейки массива которые не были инициализированны имеют одно и тоже число 535 (по крайней мере у меня на семисегментнике 3-х разрядном), а должно быть НОЛЬ... Как быть???
Устанавливаются в "0" неинициализированные ячейки глобального массива, а локального - могут содержать что угодно. Так-что, если необходимы нули, придется их "вставлять". Или, если не делали, попробуйте перед программированием стереть МК.
Я стирать пробывал. Проверил, все ли стерто!!! Все равно ни как...
Он у меня глобальный!!! И раньше им был и все было в норме!
Откройте страницу 477 в Лебедеве пособие для начинающих 2008 год. В низу есть два обзаца. ДАк в них говориться:
В последнем говорится, что все элементы массив инициализируются со значением НОЛЬ!
Почему то у меня не так, после того как я начал использовать
eeprom ...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:42:04
ValBag
Amstron писал(а):Я стирать пробывал. Проверил, все ли стерто!!! Все равно ни как... Он у меня глобальный!!! И раньше им был и все было в норме!
Если все стерто в EEPROM, ищите "косяк": или в программе или в "полудохлом" EEPROM-е. Можете еще проделать такой фокус: В цикле запрограммируйте все члены массива нулями, а затем прочитайте EEPROM. Если все нормально, инициализируйте нужное.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:48:53
Amstron
ValBag писал(а):Amstron писал(а):Я стирать пробывал. Проверил, все ли стерто!!! Все равно ни как... Он у меня глобальный!!! И раньше им был и все было в норме!
Если все стерто в EEPROM, ищите "косяк": или в программе или в "полудохлом" EEPROM-е. Можете еще проделать такой фокус: В цикле запрограммируйте все члены массива нулями, а затем прочитайте EEPROM. Если все нормально, инициализируйте нужное.
Попробывал отдельно элемент масива запрограмировать нулем - ПОЛУЧИЛОСЬ!
Странное дело... почему же у меня неинициализированные элементы инициализируются не НУЛЯМИ... а совсем другими ОДИНАКОВЫМИ числами?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:54:53
Amstron
ValBag писал(а):Amstron писал(а):Я стирать пробывал. Проверил, все ли стерто!!! Все равно ни как... Он у меня глобальный!!! И раньше им был и все было в норме!
Если все стерто в EEPROM, ищите "косяк": или в программе или в "полудохлом" EEPROM-е. Можете еще проделать такой фокус: В цикле запрограммируйте все члены массива нулями, а затем прочитайте EEPROM. Если все нормально, инициализируйте нужное.
Считал еепром (сейчас вспомнил что в программаторе есть такое окно). Дак вот почти везде FF и только дасять элементов массива которые я инициализировал, записанны мои часла. Странно.... почему же у меня на индикацию выводится не НОЛЬ а совсем другое число((((
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 03, 2011 12:59:41
ARV
потому что вы юзаете CVAVR

очевидно, он считает, что неинициализированные явно "переменные" в eeprom сохраняют свое значение, а оно при стирании
eeprom равно
0xFF