Страница 109 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 21, 2011 21:36:53
Modest
это был пример.

а во вторых - непонял? всмысли бесполезно переписываются?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 21, 2011 21:58:53
AI_Disable
Modest писал(а): как распихать данные из X в порты побитно - т.е.
PORTB.5 = 0-ой бит,
PORTC.0 = 1-ый бит
и т. д.
т.д.:
PORTC.5 = 0-ой бит,
PORTC.4 = 1-ой бит,
PORTC.3 = 2-ой бит,
PORTC.2 = 3-ой бит,
PORTD.4 = 4-ой бит,
PORTC.1 = 5-ой бит,
PORTC.0 = 6-ой бит,
PORTB.5 = 7-ой бит,
Запись в 4-й и 5-й биты происходит два раза. Данные первых записей теряются. Поэтому они бесполезны.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 21, 2011 22:15:45
Modest
AI_Disable пока выделял цветами не заметил что порты разные? порт С, порт B и порт D 8)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 21, 2011 22:17:48
*Trigger*
Может, попробовать X.1, X.2 и т. д.?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 21, 2011 22:21:44
AI_Disable
Эм.. нетъ. мой fail, да.
Но в данном случаи всё равно придётся работать побитно:
PORTC.5 = X.0;
PORTC.4 = X.1;
и т.д.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 22, 2011 23:15:18
RoTToR
Все доброго времени суток! Подскажите пожалуйста как в CVAR с генерировать случайное число ХХХ типа как "одноруких электронных бандитах" ?? пробовал функцию rand() из stdlib.h , так слишком часто выпадают две одинаковые цифры, примерно раз через раз..
Спасибо!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 22, 2011 23:29:54
AI_Disable
Когда мне бал нужен генератор случайных чисел на МК, я делал так: Включаем АЦП с усилением X200 -> припеваем к входу АЦП антенну -> снимем с этого канала случайные значения с огромнейшим разбросом от 0 до 1023.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 22, 2011 23:30:36
Apparatchik
RoTToR писал(а):Все доброго времени суток! Подскажите пожалуйста как в CVAR с генерировать случайное число ХХХ типа как "одноруких электронных бандитах" ?? пробовал функцию rand() из stdlib.h , так слишком часто выпадают две одинаковые цифры, примерно раз через раз..
Спасибо!
В начале программы нужно использовать srand(int seed), а потом уже rand(). В хелпе написано.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс янв 23, 2011 01:13:44
Modest
Программно это будут псевдослучайные числа, т. е. их последовательность будет заранее известна.
Нужно делать как советует AI_Disable, т е на железном уровне.
Можно ещё на ацп повешать низкочастотный генератор...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс янв 23, 2011 13:38:22
Apparatchik
В качестве аргумента нужно использовать переменную которая меняется. Например в часах часы+минуты+секунды.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн янв 24, 2011 01:54:24
RusikOk
создаю переменную
eeprom unsigned char eepromVer[48];

пытаюсь в нее записать данные
eepromVer = "2df";

выдает ошибку
Error: C:\cvavreval\project\watchDog\main.c(111): the expression must be a modifiable lvalue

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн янв 24, 2011 04:15:39
Goodefine
RusikOk писал(а):создаю переменную
eeprom unsigned char eepromVer[48];
пытаюсь в нее записать данные
eepromVer = "2df";
eepromVer - это указатель на первый элемент массива, размещенного в eeprom. Т.е. это АДРЕС. Причем константный, поскольку при объявлении CAVR автоматически отводит ему место в EEPROM и в дальнейшем менять его дислокацию не собирается. Вы же пытаетесь его модифицировать, присваивая адрес из пространства флеш памяти... Очевидно, что это неправильно...
По идее, должно быть что то вроде:

Код: Выделить всё

eeprom char eepromVer[10];
//.....
void str_copy(eeprom char *eepromVer, flash char *string, char len)
{
char i=0;
while (len--)
{
*(eepromVer+i)=*(string+i);
++i;
}
//....
//Использование:
str_copy(eepromVer,"1234567",7);
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт янв 25, 2011 22:16:29
Amstron
Смысл в следующем!!! У меня есть два массива по 101 элементу.
Эти массивы храняться в энергонезависимой памяти.
Я инициализизирую каждый элемент нулем. Инициализирую что бы компиль не ругался и что бы не вставлять
#pragma warn-


Выяснил следующее и это 100 %

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

А, вот если между массивами ставлю переменные которые тоже сохраняются в энергонезависимой памяти, то ошибка сокращается на много!!!.

Если я в программе верхний массив не инициализирую, то проблем ни каких нет! В чем собака зарыта???

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 01:04:47
ibiza11
Amstron, учитесь вопросы задавать....

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 05:33:49
Amstron
ibiza11 писал(а):Amstron, учитесь вопросы задавать....
Поробую поподробнее описать проблему.

У меня есть два массива по 101 элементу.
Эти массивы храняться в энергонезависимой памяти.
Я инициализизирую каждый элемент нулем.
Инициализирую что бы компиль не ругался и что бы не вставлять #pragma warn-

Выяснил следующее и это 100 %

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

А, вот если между массивами ставлю переменные которые тоже сохраняются в энергонезависимой памяти, то ошибка сокращается на много!!!.

Если я в своем устройстве верхний массив не инициализирую (у меня есть функция , при нажатии определенных кнопок записи нулями все элементы массива), то проблем ни каких нет!

Если я пропишу в два массива значения, то у меня появляются проблема работы с мими.
Считывал отдельно память EEPROM, там все олично. Запись идет в нужный массив.

Вопрос: почему есть разница как в программе записывать массив?
У меня вот так он создан:
eeprom unsigned int а[101]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};

Я на это пол дня убил и не смог решить проблему! Иначе бы не писал...
Подскажите как правильно записать массив в EEPROM? Числа в нем должны храниться до 35635.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 10:07:48
ARV
у вас EEPROM-а хватает? два массива int-ов по 101 штуке - это 404 байта EEPROM. далеко не каждый AVR имеет такой объем EEPROM, тем более, если добавляются еще какие-то переменные...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 10:17:52
Amstron
ARV писал(а):у вас EEPROM-а хватает? два массива int-ов по 101 штуке - это 404 байта EEPROM. далеко не каждый AVR имеет такой объем EEPROM, тем более, если добавляются еще какие-то переменные...
Я делаю проект на at mega8 , там 500 байт можно записать. Общая сумма получается с переменными 414 байт (80,9 %)

Если я меняю местами массивы, то у меня начинает косячить вычисления с другого массива.

Еще раз повторюсь, что если между массивами я вставляю переменные (у меня их 5), то вычисления получаются более мение сносные.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 13:55:43
ValBag
Amstron писал(а):Я на это пол дня убил и не смог решить проблему! Иначе бы не писал...
Из того, что наговорили в 2-х постах - яснее стало, что проблема есть, а не её суть. Что за выражение:
...то ошибка сокращается на много!!!.
Переведите на русский. Если проект не секретный, приложите код, с пояснениями по тексту о конкретной ошибке.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 19:54:13
Amstron
"Если CodeVision этого не умеет, а оно очень нужно — в очередной раз подумайте, насколько Вам нужен компилятор, котрый такого не умеет. Вот так вот потихоньку и поймёте, почему многие называют CodeVisionAVR не «компилятором языка С», а «компилятором С-подобного языка»"



Вариант первый: Показвает не то значения подставляя в мою формулу значения с f массива

eeprom unsigned int a = 0 ;
eeprom unsigned int b = 0 ;
eeprom unsigned int c = 0;
eeprom unsigned int d = 0 ;
eeprom unsigned int e = 0 ;


eeprom unsigned int f[101]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};


eeprom unsigned int g[101]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};



Вариант второй: Работает более менее сностоно. Вычисленное значение близко к реальному


eeprom unsigned int f[101]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};

eeprom unsigned int a = 0 ;
eeprom unsigned int b = 0 ;
eeprom unsigned int c = 0;
eeprom unsigned int d = 0 ;
eeprom unsigned int e = 0 ;

eeprom unsigned int g[101]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};



Дайте мне ответ!!!
Почему вставляя между массивами инициализацию этих переменных, то результат вычисления меняется??

Сейчас, стер слово eeprom , тоесть создал массивы не в EEPROM, такая же хрень!!!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср янв 26, 2011 21:33:45
ValBag
Amstron
Попробую перевести сам:
Скорее всего вы отлаживаете в AVR Studio. И в отладчике - в отлаживаемой программе - получаете не те данные, которые записаны в EEPROM и которые есть в файле *.dep.
На такие "грабли" уже наступали и была подсказка ARV о причине.
Чтобы AVR Studio "видел" данные EEPROM, их, после перехода в отладчик, необходимо загрузить: Меню >> Debug >> Up/Download Memory. В появившемся окне выбрать EEPROM, далее выбрать файл проекта *.eep и загрузить >> Load from File. Теперь все данные EEPROM, записанные туда при инициализации переменных, будут доступны в отладке. В процессе отладки, изменяя далее в программе данные в EEPROM, можно их добавить в тот же файл *.eep, той же процедурой, что описана выше, только другой конечной операцией >> Save to File.