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

Обсуждаем контроллеры компании Atmel.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Столкнулся в КВ с непонятными моментами.
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 в вопросах и ответах

Сообщение vitalik_1984 »

а воспользоваться циклами подойдет?
пример

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

while (massive[i++]=read_eeprom(addr++));
 

только нужно вроде в конце массива нулевой завершающий элемент добавить.если компилятор не добавляет.
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

R_ura писал(а):2. Почему не получается скопировать два одинаковых массива из одного в другой подобным образом:
array1 = array2;
В других компиляторах такое прокатывает, здесь нет. И как быть в этом случае?


Как задаётся массив? Если так:
<type> array1[<count>]
то в таком случае array1 является указателем на начало массива в памяти и соответственно вашим действием происходит очень простая операция: копирование значения указателя array2 в указатель array1. После этого и array1, и array2 указывают только на один массив: тот что создавался под array2. Это, как понятно, копированием не является. Первый массив, что создавался под именем array1, теряется и уходит в мусор, т.к. после этой операции мы не знаем его адрес, если только перед этим не сохранили его где нибудь. То есть в итоге после этой операции если мы что-то поменяем в массиве array1, то тоже самое изменится и в array2.
Что значит "не прокатывает"? Если имеется, что он не компилирует это, то, вероятно, он просто не даёт выстрельнуть себе в ногу. Другие компиляторы просто предполагали, что ты знаешь что делаешь, рассматривая эту конструкцию.
Копировать массивы надо копированием области памяти. Это можно сделать или поэлементным копированием в цикле или спецфункциями аля memcpy.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

идеология CVAVR как раз в том, чтобы "считывать массив из EEPROM" было не нужно. вы работаете с массивом, как будто он уже в RAM - компилятор за вас доделает все необходимое. если вам это не нравится - используйте WinAVR
битва с дураками проиграна, победители торжествуют. слава победителям!
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Мастер Ломастер писал(а):идеология CVAVR как раз в том, чтобы "считывать массив из EEPROM" было не нужно. вы работаете с массивом, как будто он уже в RAM - компилятор за вас доделает все необходимое. если вам это не нравится - используйте WinAVR

Не то, чтобы не нравится, не могу въехать в суть такой идеологии. Как это на практике выглядит?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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];

...
 
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

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 в вопросах и ответах

Сообщение IfoR »

Ну не тупой точно. Во всяком случае так делать не стоит.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

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 в вопросах и ответах

Сообщение vitalik_1984 »

Неправильно пишете.
У меня код вижн только так глотает.

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


char r
;
for ( 
r=0r<10r++) eebuf[r]=buffer[r];
 

Пример из книги Риччи

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


main
()
{
    
int fahr;
    for (
fahr LOWERfahr <= UPPERfahr fahr STEP)
        
printf(%3d %6.1fn”fahr, (5.0/9.0)*(fahr-32));
}
 
В поисках истины человек развивается.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

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 char buffer[10] = {0,1,2,3,4,5,6,7,8,9}; // определили массив в EEPROM

buffer[4] = 0; // просто взяли и обнулили его ячейку
зачем копировать в ОЗУ? ВСЕ манипуляции можно делать прямо с EEPROM-овским массивом.
битва с дураками проиграна, победители торжествуют. слава победителям!
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Мастер Ломастер писал(а):повторяю, в 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 в вопросах и ответах

Сообщение vitalik_1984 »

Вот из учебника для начинающих

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


Доступ к внутреннему 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 в вопросах и ответах

Сообщение Мастер Ломастер »

R_ura писал(а):
зачем копировать в ОЗУ? ВСЕ манипуляции можно делать прямо с EEPROM-овским массивом.

Ну как это зачем? Работа программы ведется ведь с переменными в ОЗУ. Перед выключением питания их надо сохранить в еепром. После включения питания, извлечь назад в ОЗУ.
Или я чего-то не понимаю?
это для нормальных программ и программистов так, а для CVAVR не так. "переменные", размещаемые в EEPROM (т.е. с префиксом eeprom) автоматически при каждом своем изменении обновляются в EEPROM, поэтому сохранения (копирования) перед выключением не требуется - в EEPROM в любой момент работы уже хранится самое свежее значение переменной. а при включении питания эти переменные инициализировать так же не нужно - они ведь по сути не в ОЗУ, а в EEPROM хранятся, т.е. уже содержат значения!
битва с дураками проиграна, победители торжествуют. слава победителям!
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Мастер Ломастер писал(а): это для нормальных программ и программистов так, а для CVAVR не так. !


))))))) Хорошо фраза звучит...

Спасибо.Суть я понял, но все же я вас полностью не пойму. Вы ведь не будете в программе работать с еепром, как с рам? У нее ресурс просто кончится через неделю (100.000 циклов записи, как пишут в дш). К примеру в программе используется сотня переменных, флагов и счетчиков всевозможных, определяющих логику работы устройства, положение инструмента, состояние датчиков и т.д.
Все они находятся в рам. Если прервать работу устройства, то желательно после включения продолжить с точки останова, для чего все текущие состояния надо сохранить в еепром. Вот этот массив переменных , флагов состояний, счетчиков и т.д. и надо сохранить в такой же массив в еепром. Вроде бы так должно быть. Или в КВ как-то по другому можно сделать?

З.Ы. А какие еще есть в КВ особенности? если не секрет. Потому что про такую работу с еепром, я только от вас услышал.
Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

R_ura писал(а):Вы ведь не будете в программе работать с еепром, как с рам? У нее ресурс просто кончится через неделю (100.000 циклов записи, как пишут в дш).
я-то не буду, и, как я понимаю, у вас тоже здравый смысл пока побеждает :) а вот изобретатели CVAVR считают иначе.
R_ura писал(а):А какие еще есть в КВ особенности? если не секрет. Потому что про такую работу с еепром, я только от вас услышал.
сам я про CVAVR знаю только понаслышке и сообщениям на этом форуме. для меня - это недоразумение какое-то, а не система программирования :) возможно, кто-то вам расскажет про нюансы более подробно. я же знаю только про "переменные" во flash, точнее, это уже константы какие-то: flash int var = 12; - это означает. что число 12 на самом деле хранится во flash-памяти программ и при обращении к "переменной" var будет оттуда считано (на запись такой переменной компилятор вас обругает). т.е. тут виден "прозрачный" метод доступа к falsh взамен принятого в WinAVR доступа при помощи pgm_read_byte() и т.п.

лично мне и это представляется довольно спорным удобством, хотя в некоторых случаях бывает действительно удобно. только вотт от стандартна Си это отступает уже далеко.
R_ura писал(а):Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?
вот чего не знаю - того не знаю. зато знаю, что "мастер" кода принудительно вставляет в main инициализацию НУЛЯМИ большинства регистров специального назначения, которые и без этого при аппаратном сбросе устанавливаются в ноль. и почти никто из пользователей CVAVR этот лишний кусок кода никогда не удаляет :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

R_ura писал(а):Если я правильно понял из листинга, то КВ сам при старте программы "чистит" и рам и РОН?

Чистит. И устанавливает переменные. Эту фичу можно отключить в свойствах проекта.
Docendo discimus
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Мастер Ломастер писал(а): т.е. тут виден "прозрачный" метод доступа к falsh взамен принятого в WinAVR доступа при помощи pgm_read_byte() и т.п.

Думается , что во многих случаях это удобно.

вот чего не знаю - того не знаю. зато знаю, что "мастер" кода принудительно вставляет в main инициализацию НУЛЯМИ большинства регистров специального назначения, которые и без этого при аппаратном сбросе устанавливаются в ноль. и почти никто из пользователей CVAVR этот лишний кусок кода никогда не удаляет :)))


Я удалил на фиг. Мне это тоже не понравилось))) Да еще на три строчки ненужной инициализации сверху четыре строчки комментариев.
Кстати, у меня почему-то визард сначала располагает обработчики прерываний, а затем уже предлагает определять глобальные переменные. А если переменная будет обрабатываться в прерывании?

Мда-а-а, какое-то двоякое чувство этот КВ вызывает. С одной стороны все довольно просто, с другой - нестандартная вещь в себе . С третьей - мне-то для хобби, зачем мне все сложности классического Си? Я как-то пытался с ВинАВРом разбираться, как-то сложно и громоздко показалось - редактор один, компилятор другой, отладчик третий.. )))

З.Ы. никто не скажет, какой размер кода КВ выдает, скажем, в сравнении с ВинАВРом?
Судя по листингу КВ довольно сообразительный компилятор..
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

R_ura писал(а):Я как-то пытался с ВинАВРом разбираться, как-то сложно и громоздко показалось - редактор один, компилятор другой, отладчик третий.. )))
не смешите мои тапки: WinAVR встраивается в AVR Studio и получается одна среда с редактором, компилятором и отладчиком. а вот в CVAVR для отладки надо что-то стороннее юзать.
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

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