CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Столкнулся в КВ с непонятными моментами.
1. Как записать ( считать) , скажем char buffer [10] в eeprom?
В библиотеке не нашел ничего понятного.
В том-же ВинАВР есть вполне понятная функция чтения в рам из еепром н-байт примерного вида eeprom_reed_block ( adr_ram, adr_eeprom, n_bytes).
Здесь же функций никаких, только указатели на еепром. И что с ними делать?
2. Почему не получается скопировать два одинаковых массива из одного в другой подобным образом:
array1 = array2;
В других компиляторах такое прокатывает, здесь нет. И как быть в этом случае?
1. Как записать ( считать) , скажем char buffer [10] в eeprom?
В библиотеке не нашел ничего понятного.
В том-же ВинАВР есть вполне понятная функция чтения в рам из еепром н-байт примерного вида eeprom_reed_block ( adr_ram, adr_eeprom, n_bytes).
Здесь же функций никаких, только указатели на еепром. И что с ними делать?
2. Почему не получается скопировать два одинаковых массива из одного в другой подобным образом:
array1 = array2;
В других компиляторах такое прокатывает, здесь нет. И как быть в этом случае?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а воспользоваться циклами подойдет?
пример
только нужно вроде в конце массива нулевой завершающий элемент добавить.если компилятор не добавляет.
пример
Код: Выделить всё
while (massive[i++]=read_eeprom(addr++));
только нужно вроде в конце массива нулевой завершающий элемент добавить.если компилятор не добавляет.
В поисках истины человек развивается.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
R_ura писал(а):2. Почему не получается скопировать два одинаковых массива из одного в другой подобным образом:
array1 = array2;
В других компиляторах такое прокатывает, здесь нет. И как быть в этом случае?
Как задаётся массив? Если так:
<type> array1[<count>]
то в таком случае array1 является указателем на начало массива в памяти и соответственно вашим действием происходит очень простая операция: копирование значения указателя array2 в указатель array1. После этого и array1, и array2 указывают только на один массив: тот что создавался под array2. Это, как понятно, копированием не является. Первый массив, что создавался под именем array1, теряется и уходит в мусор, т.к. после этой операции мы не знаем его адрес, если только перед этим не сохранили его где нибудь. То есть в итоге после этой операции если мы что-то поменяем в массиве array1, то тоже самое изменится и в array2.
Что значит "не прокатывает"? Если имеется, что он не компилирует это, то, вероятно, он просто не даёт выстрельнуть себе в ногу. Другие компиляторы просто предполагали, что ты знаешь что делаешь, рассматривая эту конструкцию.
Копировать массивы надо копированием области памяти. Это можно сделать или поэлементным копированием в цикле или спецфункциями аля memcpy.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
идеология CVAVR как раз в том, чтобы "считывать массив из EEPROM" было не нужно. вы работаете с массивом, как будто он уже в RAM - компилятор за вас доделает все необходимое. если вам это не нравится - используйте WinAVR
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: CodeVision AVR в вопросах и ответах
Мастер Ломастер писал(а):идеология CVAVR как раз в том, чтобы "считывать массив из EEPROM" было не нужно. вы работаете с массивом, как будто он уже в RAM - компилятор за вас доделает все необходимое. если вам это не нравится - используйте WinAVR
Не то, чтобы не нравится, не могу въехать в суть такой идеологии. Как это на практике выглядит?
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Вроде что-то типа:
Код: Выделить всё
...
char buffer[10] = {1,2,3,4,5,6,7,8,9,10}; // ОЗУ
eeprom char eebuf[10]; // Место в EEPROM
...
for (int r=0; r<10; r++) eebuf[r]=buffer[r];
...
Re: CodeVision AVR в вопросах и ответах
IfoR писал(а): Другие компиляторы просто предполагали, что ты знаешь что делаешь, рассматривая эту конструкцию.
Копировать массивы надо копированием области памяти. Это можно сделать или поэлементным копированием в цикле или спецфункциями аля memcpy
Не помню в каком компиляторе точно, но запись вида
array_1 = array_2; приводила к перезаписи циклом данных из array_2 в array_1. И как расценивать такой компилятор - толи умный, толи тупой?)))
Как задаётся массив? Если так:
<type> array1[<count>]
char array_1 [10] ;
char array_2 [10];
Что значит "не прокатывает"? Если имеется, что он не компилирует это, то, вероятно, он просто не даёт выстрельнуть себе в ногу..
Выдает ошибку и не компилируется.
Последний раз редактировалось R_ura Вт фев 28, 2012 21:07:28, всего редактировалось 1 раз.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну не тупой точно. Во всяком случае так делать не стоит.
Re: CodeVision AVR в вопросах и ответах
IfoR писал(а):Вроде что-то типа:Код: Выделить всё
...
char buffer[10] = {1,2,3,4,5,6,7,8,9,10}; // ОЗУ
eeprom char eebuf[10]; // Место в EEPROM
...
for (int r=0; r<10; r++) eebuf[r]=buffer[r];
...
О-о-о, спасибо, теперь понятно.. А так можно записать:
for (int r=0; r<(sizeof(buffer)); r++) eebuf[r]=buffer[r];
Кстати, а зачем именно так:
for (int r=0; r<10; r++) eebuf[r]=buffer[r];
Можно через while сделать, до нуля в конце строки?
А зачем r типа int?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Неправильно пишете.
У меня код вижн только так глотает.
Пример из книги Риччи
У меня код вижн только так глотает.
Код: Выделить всё
char r;
for ( r=0; r<10; r++) eebuf[r]=buffer[r];
Пример из книги Риччи
Код: Выделить всё
main()
{
int fahr;
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
printf(“%3d %6.1fn”, fahr, (5.0/9.0)*(fahr-32));
}
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):
char r;
for ( r=0; r<10; r++) eebuf[r]=buffer[r];
Как-то неудобно это, если полсотни раз этой конструкцией воспользовать . Не удобнее ли сделать некую функцию? типа:
void eeprom_write ( ee_adr, ram_adr) {
char r;
for ( r=0; r<(sizeof (ee_adr)); r++) eebuf[r]=buffer[r];
}
Корректно ли так поступить в КодВижн?
И как правильно тогда при ее вызове передавать в нее параметры?
eeprom_write ( int* eebuf, int* buffer);
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
повторяю, в CVAVR внешне не существует разницы между переменными/массивами в ОЗУ и переменными/массивами в EEPROM, поэтому процедура копирования из одного массива в другой чаще всего лишена смысла.зачем копировать в ОЗУ? ВСЕ манипуляции можно делать прямо с EEPROM-овским массивом.
Код: Выделить всё
eeprom char buffer[10] = {0,1,2,3,4,5,6,7,8,9}; // определили массив в EEPROM
buffer[4] = 0; // просто взяли и обнулили его ячейкубитва с дураками проиграна, победители торжествуют. слава победителям!
Re: CodeVision AVR в вопросах и ответах
Мастер Ломастер писал(а):повторяю, в CVAVR внешне не существует разницы между переменными/массивами в ОЗУ и переменными/массивами в EEPROM, поэтому процедура копирования из одного массива в другой чаще всего лишена смысла.
Непривычно, но должно быть удобно во многих случаях.. Спасибо, буду знать.
т.е. если у нас есть некий фаврийный флаг
Код: Выделить всё
eeprom char e_flag;
// То в программе можно обращаться к нему напрямую ?
if (e_flag = stop_all_voves) {
stop ();
e_flag = 0;
} зачем копировать в ОЗУ? ВСЕ манипуляции можно делать прямо с EEPROM-овским массивом.
Ну как это зачем? Работа программы ведется ведь с переменными в ОЗУ. Перед выключением питания их надо сохранить в еепром. После включения питания, извлечь назад в ОЗУ.
Или я чего-то не понимаю?
в КодВижн клавишей табуляции удаляется выделенный фрагмент текста. Причем с шифтом, как и положено, сдвигает на несколько пробелов влево. Это так и должно быть, или в настройках что-то не включено?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Вот из учебника для начинающих
Лебедев М.Б.
в коде вижн есть кнопочка в первой строке кнопок для сдвига кучки строк!!!
Код: Выделить всё
Доступ к внутреннему EEPROM AVR осуществляется путём использования глобальных переменных, следующих за ключевым словом еергоm.
Пример:
/* Глобальные переменные, хранящиеся в EEPROM */
eeprom int var_eep=5; // Значение 5 запишется в EEPROM в
// процессе программирования чипа
eeprom long array_eep[8]; // Объявление массива длинных целых переменных
eeprom char var_eepl; // Объявление символьной переменной var_eepl
eeprom char string[]="Hello";// Строка (символьный массив) запишется в
// EEPROM в процессе программирования чипа
Пример:
/* Использование EEPROM в программе */
eeprom int var_eep; // Объявление целой переменной var_eep,
// хранящейся в EEPROM
/* Основная функция программы */
void main(void) {
int i; // Объявление целой переменной i, хранящейся
// в SRAM
int eeprom *point_to_eep; // объявление указателя EEPROM
// сам указатель хранится в SRAM
/* Непосредственная запись значения 98 в EEPROM */ var_eep=98;
/* Косвенная запись того же значения с использованием указателя */
point_to_eep=&var_eep;
*point_to_eep=98;
/* Непосредственное чтение значения из EEPROM */ i=var_eep;
/* Косвенное чтение того же значения с использованием указателя */ i=*point_to_eep;
Указатели на EEPROM ВСЕГДА используют 16 битов.
Лебедев М.Б.
в КодВижн клавишей табуляции удаляется выделенный фрагмент текста. Причем с шифтом, как и положено, сдвигает на несколько пробелов влево. Это так и должно быть, или в настройках что-то не включено?
в коде вижн есть кнопочка в первой строке кнопок для сдвига кучки строк!!!
В поисках истины человек развивается.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
это для нормальных программ и программистов так, а для CVAVR не так. "переменные", размещаемые в EEPROM (т.е. с префиксом eeprom) автоматически при каждом своем изменении обновляются в EEPROM, поэтому сохранения (копирования) перед выключением не требуется - в EEPROM в любой момент работы уже хранится самое свежее значение переменной. а при включении питания эти переменные инициализировать так же не нужно - они ведь по сути не в ОЗУ, а в EEPROM хранятся, т.е. уже содержат значения!R_ura писал(а):зачем копировать в ОЗУ? ВСЕ манипуляции можно делать прямо с EEPROM-овским массивом.
Ну как это зачем? Работа программы ведется ведь с переменными в ОЗУ. Перед выключением питания их надо сохранить в еепром. После включения питания, извлечь назад в ОЗУ.
Или я чего-то не понимаю?
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: CodeVision AVR в вопросах и ответах
Мастер Ломастер писал(а): это для нормальных программ и программистов так, а для CVAVR не так. !
))))))) Хорошо фраза звучит...
Спасибо.Суть я понял, но все же я вас полностью не пойму. Вы ведь не будете в программе работать с еепром, как с рам? У нее ресурс просто кончится через неделю (100.000 циклов записи, как пишут в дш). К примеру в программе используется сотня переменных, флагов и счетчиков всевозможных, определяющих логику работы устройства, положение инструмента, состояние датчиков и т.д.
Все они находятся в рам. Если прервать работу устройства, то желательно после включения продолжить с точки останова, для чего все текущие состояния надо сохранить в еепром. Вот этот массив переменных , флагов состояний, счетчиков и т.д. и надо сохранить в такой же массив в еепром. Вроде бы так должно быть. Или в КВ как-то по другому можно сделать?
З.Ы. А какие еще есть в КВ особенности? если не секрет. Потому что про такую работу с еепром, я только от вас услышал.
Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
я-то не буду, и, как я понимаю, у вас тоже здравый смысл пока побеждаетR_ura писал(а):Вы ведь не будете в программе работать с еепром, как с рам? У нее ресурс просто кончится через неделю (100.000 циклов записи, как пишут в дш).
сам я про CVAVR знаю только понаслышке и сообщениям на этом форуме. для меня - это недоразумение какое-то, а не система программированияR_ura писал(а):А какие еще есть в КВ особенности? если не секрет. Потому что про такую работу с еепром, я только от вас услышал.
лично мне и это представляется довольно спорным удобством, хотя в некоторых случаях бывает действительно удобно. только вотт от стандартна Си это отступает уже далеко.
вот чего не знаю - того не знаю. зато знаю, что "мастер" кода принудительно вставляет в main инициализацию НУЛЯМИ большинства регистров специального назначения, которые и без этого при аппаратном сбросе устанавливаются в ноль. и почти никто из пользователей CVAVR этот лишний кусок кода никогда не удаляетR_ura писал(а):Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?
битва с дураками проиграна, победители торжествуют. слава победителям!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
R_ura писал(а):Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?
Чистит. И устанавливает переменные. Эту фичу можно отключить в свойствах проекта.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Мастер Ломастер писал(а): т.е. тут виден "прозрачный" метод доступа к falsh взамен принятого в WinAVR доступа при помощи pgm_read_byte() и т.п.
Думается , что во многих случаях это удобно.
вот чего не знаю - того не знаю. зато знаю, что "мастер" кода принудительно вставляет в main инициализацию НУЛЯМИ большинства регистров специального назначения, которые и без этого при аппаратном сбросе устанавливаются в ноль. и почти никто из пользователей CVAVR этот лишний кусок кода никогда не удаляет
Я удалил на фиг. Мне это тоже не понравилось))) Да еще на три строчки ненужной инициализации сверху четыре строчки комментариев.
Кстати, у меня почему-то визард сначала располагает обработчики прерываний, а затем уже предлагает определять глобальные переменные. А если переменная будет обрабатываться в прерывании?
Мда-а-а, какое-то двоякое чувство этот КВ вызывает. С одной стороны все довольно просто, с другой - нестандартная вещь в себе . С третьей - мне-то для хобби, зачем мне все сложности классического Си? Я как-то пытался с ВинАВРом разбираться, как-то сложно и громоздко показалось - редактор один, компилятор другой, отладчик третий.. )))
З.Ы. никто не скажет, какой размер кода КВ выдает, скажем, в сравнении с ВинАВРом?
Судя по листингу КВ довольно сообразительный компилятор..
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
не смешите мои тапки: WinAVR встраивается в AVR Studio и получается одна среда с редактором, компилятором и отладчиком. а вот в CVAVR для отладки надо что-то стороннее юзать.R_ura писал(а):Я как-то пытался с ВинАВРом разбираться, как-то сложно и громоздко показалось - редактор один, компилятор другой, отладчик третий.. )))
битва с дураками проиграна, победители торжествуют. слава победителям!
