CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
это был пример.
а во вторых - непонял? всмысли бесполезно переписываются?
а во вторых - непонял? всмысли бесполезно переписываются?
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
AI_Disable пока выделял цветами не заметил что порты разные? порт С, порт B и порт D 
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: CodeVision AVR в вопросах и ответах
Может, попробовать X.1, X.2 и т. д.?
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Эм.. нетъ. мой fail, да.
Но в данном случаи всё равно придётся работать побитно:
PORTC.5 = X.0;
PORTC.4 = X.1;
и т.д.
Но в данном случаи всё равно придётся работать побитно:
PORTC.5 = X.0;
PORTC.4 = X.1;
и т.д.
Re: CodeVision AVR в вопросах и ответах
Все доброго времени суток! Подскажите пожалуйста как в CVAR с генерировать случайное число ХХХ типа как "одноруких электронных бандитах" ?? пробовал функцию rand() из stdlib.h , так слишком часто выпадают две одинаковые цифры, примерно раз через раз..
Спасибо!
Спасибо!
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Когда мне бал нужен генератор случайных чисел на МК, я делал так: Включаем АЦП с усилением X200 -> припеваем к входу АЦП антенну -> снимем с этого канала случайные значения с огромнейшим разбросом от 0 до 1023.
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
RoTToR писал(а):Все доброго времени суток! Подскажите пожалуйста как в CVAR с генерировать случайное число ХХХ типа как "одноруких электронных бандитах" ?? пробовал функцию rand() из stdlib.h , так слишком часто выпадают две одинаковые цифры, примерно раз через раз..
Спасибо!
В начале программы нужно использовать srand(int seed), а потом уже rand(). В хелпе написано.
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
Программно это будут псевдослучайные числа, т. е. их последовательность будет заранее известна.
Нужно делать как советует AI_Disable, т е на железном уровне.
Можно ещё на ацп повешать низкочастотный генератор...
Нужно делать как советует AI_Disable, т е на железном уровне.
Можно ещё на ацп повешать низкочастотный генератор...
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
В качестве аргумента нужно использовать переменную которая меняется. Например в часах часы+минуты+секунды.
«И всё-таки она вертится!»
- RusikOk
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн янв 24, 2011 01:51:48
- Откуда: Украина, Киев
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
создаю переменную
eeprom unsigned char eepromVer[48];
пытаюсь в нее записать данные
eepromVer = "2df";
выдает ошибку
Error: C:\cvavreval\project\watchDog\main.c(111): the expression must be a modifiable lvalue
eeprom unsigned char eepromVer[48];
пытаюсь в нее записать данные
eepromVer = "2df";
выдает ошибку
Error: C:\cvavreval\project\watchDog\main.c(111): the expression must be a modifiable lvalue
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
Смысл в следующем!!! У меня есть два массива по 101 элементу.
Эти массивы храняться в энергонезависимой памяти.
Я инициализизирую каждый элемент нулем. Инициализирую что бы компиль не ругался и что бы не вставлять
#pragma warn-
Выяснил следующее и это 100 %
Если я массивы ставлю один за другим, то у меня тот массив который стоит ниже, то с ним все отлично, программа с него берет и вычисляет правильно.
А, вот если между массивами ставлю переменные которые тоже сохраняются в энергонезависимой памяти, то ошибка сокращается на много!!!.
Если я в программе верхний массив не инициализирую, то проблем ни каких нет! В чем собака зарыта???
Эти массивы храняться в энергонезависимой памяти.
Я инициализизирую каждый элемент нулем. Инициализирую что бы компиль не ругался и что бы не вставлять
#pragma warn-
Выяснил следующее и это 100 %
Если я массивы ставлю один за другим, то у меня тот массив который стоит ниже, то с ним все отлично, программа с него берет и вычисляет правильно.
А, вот если между массивами ставлю переменные которые тоже сохраняются в энергонезависимой памяти, то ошибка сокращается на много!!!.
Если я в программе верхний массив не инициализирую, то проблем ни каких нет! В чем собака зарыта???
Re: CodeVision AVR в вопросах и ответах
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.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
у вас EEPROM-а хватает? два массива int-ов по 101 штуке - это 404 байта EEPROM. далеко не каждый AVR имеет такой объем EEPROM, тем более, если добавляются еще какие-то переменные...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
ARV писал(а):у вас EEPROM-а хватает? два массива int-ов по 101 штуке - это 404 байта EEPROM. далеко не каждый AVR имеет такой объем EEPROM, тем более, если добавляются еще какие-то переменные...
Я делаю проект на at mega8 , там 500 байт можно записать. Общая сумма получается с переменными 414 байт (80,9 %)
Если я меняю местами массивы, то у меня начинает косячить вычисления с другого массива.
Еще раз повторюсь, что если между массивами я вставляю переменные (у меня их 5), то вычисления получаются более мение сносные.
Re: CodeVision AVR в вопросах и ответах
Из того, что наговорили в 2-х постах - яснее стало, что проблема есть, а не её суть. Что за выражение:Amstron писал(а):Я на это пол дня убил и не смог решить проблему! Иначе бы не писал...
Переведите на русский. Если проект не секретный, приложите код, с пояснениями по тексту о конкретной ошибке....то ошибка сокращается на много!!!.
Re: CodeVision AVR в вопросах и ответах
"Если 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, такая же хрень!!!
Вариант первый: Показвает не то значения подставляя в мою формулу значения с 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 в вопросах и ответах
Amstron
Попробую перевести сам:
Скорее всего вы отлаживаете в AVR Studio. И в отладчике - в отлаживаемой программе - получаете не те данные, которые записаны в EEPROM и которые есть в файле *.dep.
На такие "грабли" уже наступали и была подсказка ARV о причине.
Чтобы AVR Studio "видел" данные EEPROM, их, после перехода в отладчик, необходимо загрузить: Меню >> Debug >> Up/Download Memory. В появившемся окне выбрать EEPROM, далее выбрать файл проекта *.eep и загрузить >> Load from File. Теперь все данные EEPROM, записанные туда при инициализации переменных, будут доступны в отладке. В процессе отладки, изменяя далее в программе данные в EEPROM, можно их добавить в тот же файл *.eep, той же процедурой, что описана выше, только другой конечной операцией >> Save to File.
Попробую перевести сам:
Скорее всего вы отлаживаете в AVR Studio. И в отладчике - в отлаживаемой программе - получаете не те данные, которые записаны в EEPROM и которые есть в файле *.dep.
На такие "грабли" уже наступали и была подсказка ARV о причине.
Чтобы AVR Studio "видел" данные EEPROM, их, после перехода в отладчик, необходимо загрузить: Меню >> Debug >> Up/Download Memory. В появившемся окне выбрать EEPROM, далее выбрать файл проекта *.eep и загрузить >> Load from File. Теперь все данные EEPROM, записанные туда при инициализации переменных, будут доступны в отладке. В процессе отладки, изменяя далее в программе данные в EEPROM, можно их добавить в тот же файл *.eep, той же процедурой, что описана выше, только другой конечной операцией >> Save to File.