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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

удалить как пост ?
Последний раз редактировалось urry Сб мар 03, 2012 09:07:12, всего редактировалось 1 раз.
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

сделайте и структуру и массив в одном флаконе, используя union

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

union{
 struct {
    int  cnt_X ;          //рабочий счетчик X
    int  cnt_Y ;          //рабочий счетчик Y
    int  cnt_Z ;          //рабочий счетчик Z
    unsigned char cnt_c ; //размер основных врезок
    unsigned char cnt_n ; //кол-во отрезов
    unsigned char cnt_t ; //пауза стола
    }wrk;
  unsigned char arr[9];
}un;

Я плохо знаю кодевижин - вроде юнионы не работали в младших версиях - где-то с 2.3.4 надо версию
Реклама
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

urry писал(а):Я плохо знаю кодевижин - вроде юнионы не работали в младших версиях - где-то с 2.3.4 надо версию


Работают и в младших.На 1.25.5 по крайней мере я их использовал.
Последний раз редактировалось demiurg301 Сб мар 03, 2012 10:08:35, всего редактировалось 1 раз.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

demiurg301 я ничего не говорю. лишь бы ляпнуть - мне откровенно влом искать 4-х летней давности проект, но я отчетливо помню глюк именно с битовыми полями в юнионах, который вылечился переходом на версию 2.3.4
Это была одна из причин, после чего я плюнул на кодевижин и перешел на винавр.
Реклама
Эиком - электронные компоненты и радиодетали
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

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

 Вот и как поэлементно скопировать структуру в структуру, если непонятно как к элементу структуры обращаться по его порядковому номеру в структуре?


Можно вот так

typedef struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
wrk;
typedef eeprom struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
ee_wrk;

wrk X;
ee_wrk Y;

void copy(eeprom unsigned char *pE, unsigned char *pR)
{
unsigned char L=sizeof(*pE);
while (L--)
{
*pE++=*pR++;
};
};

гдето в программе
copy((eeprom unsigned char*)&Y,(unsigned char*)&X);

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

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

Сообщение R_ura »

demiurg301 писал(а):
wrk X;
ee_wrk Y;

А что это за действия? Не нравится компилятору эти строчки.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

Обновление блин что я пишу... Это объявление переменных свежеобъявленных типов (ee_wrk и wrk)
Последний раз редактировалось vitalik_1984 Пн мар 05, 2012 22:19:42, всего редактировалось 1 раз.
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

R_ura писал(а): А что это за действия? Не нравится компилятору эти строчки.


Чо пишет?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

кстати у меня не на эти строчки ругается...

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

}ee_wrk; 

Warning: C:\Docs\Платы\Проекты AVR\1\1.c(18): 'eeprom' memory attribute ignored for type storage
атрибут памяти игнорирован для типа данных.
Проверил данные не помещаются в еепром

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

copy((eeprom unsigned char*)&Y,(unsigned char*)&X); 

Warning: C:\Docs\Платы\Проекты AVR\1\1.c(35): suspicious pointer conversion
Подозрительная конверсия указателя.
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

Не знаю, я так во внешнюю ПЗУшину пишу структуру из 15 массивов по 10 байт. Правда , насколько я понял, такая фишка возможна только в 8битках, потому как "выравнивает" по машинному слову.

А что это за действия? Не нравится компилятору эти строчки.


Вот так запиши.

wrk X;
eeprom ee_wrk Y;
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

подозрительная ошибка исчезла :)

Не нужно писать ЕЕпром при объявлении структуры.
А при объявлении переменной объявленного типа просто помещать в ее область вот так:

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

typedef struct {
int cnt_X //рабочий счетчик X
int cnt_Y //рабочий счетчик Y
int cnt_Z //рабочий счетчик Z
unsigned char cnt_c //размер основных врезок
unsigned char cnt_n //кол-во отрезов
unsigned char cnt_t //пауза стола
}
type_wrk;

type_wrk X;
eeprom type_wrk Y
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

В CV?
Видимо это фишка CVAVR - вот что в хелпе по этому поводу:

/* type definitions */
typedef eeprom struct {
int a;
char b[5];
} eeprom_struct_type;

/* variable declaration */
eeprom eeprom_struct_type struct1;
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Именно тема ведь про него, но в таком виде как я написал все компилируется и помещается в ее сектор.
И вообще мне непонятно зачем создавать какие то лишние типы данных.

Что смысл меняется разве, если вы файл будете хранить на жестком диске или на внешнем флеш накопителе.Тип файла то от этого не поменяется.


demiurg301 писал(а):В CV?
Видимо это фишка CVAVR - вот что в хелпе по этому поводу:

/* type definitions */
typedef eeprom struct {
int a;
char b[5];
} eeprom_struct_type;

/* variable declaration */
eeprom eeprom_struct_type struct1;


Странно у вас похоже какой то другой хелп

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

[<memory attribute>] struct [<structure tag-name>] {
    [<type> <variable-name>[,<variable-name>, ...]];
    [<type> [<bitfield-id>]:<width>[,[<bitfield-id>]:<width>, ...]];
    ...} [<structure variables>]; 


Пример:

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

/* Global structure located in EEPROM */
eeprom struct eeprom_structure {
             char a;
             int  b;
             char c[15];
             } se; 


А когда добавляете typedef eeprom игнорируется.

Вот про typedef

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

typedef <type definition> <identifier>; 

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

/* type definitions */
typedef unsigned char byte;
typedef struct {
               
int a;
               
char b[5];
               } 
struct_type;
 

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

/* structure stored in EEPROM */
eeprom struct_type struct3;
 
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

А что за версия? Я из 1.25.5 выложил.

Даёт error и говорит - область переменной должна соответствовать области описания.

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

Что смысл меняется разве, если вы файл будете хранить на жестком диске или на внешнем флеш накопителе.Тип файла то от этого не поменяется.


Логика мне понятна - она не понятна компилятору :)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

ну намутили... Покажите, как сделать на юнионах и все - тем более, что еепром склонна к порче и необходимо считать контрольную сумму.
И, demiurg301,я что, один вижу подводный камень в этом выражении ??? Размер чего вернет ??? :)

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

{
unsigned char L=sizeof(*pE);
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

urry писал(а):И, demiurg301,я что, один вижу подводный камень в этом выражении ??? Размер чего вернет ??? :)


Действительно. Туда надо
sizeof(wrk);
:)))
А контрольную сумму можно хранить в этой же структуре.

PS А вот кстати - а если сделать на юнионах, то будет ли это работать везде, на любой платформе? У мну такая же хрень просто с преобразованием структуры в массив. При этом структура содержит ещё одну структуру :))
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

Это нормально,юнионы работают везде. Единственно, что при 16-32 битных компиляторах нельзя забывать о выравнивании по байту, иначе структура может занять неожиданное количество байт.
Например, так - для visual

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

#pragma pack(push,1)
union bla bla bla
#pragma pack(pop)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

demiurg301 писал(а):А что за версия? Я из 1.25.5 выложил.

Версия 2.05.5а EVAL
demiurg301 писал(а):Логика мне понятна - она не понятна компилятору

Ну вроде как в хелпе так и написано делать как я показал.Значит таким образом понятно.Тем более компилируется.
И в ее сектор помещает убираешь eeprom из объявления переменной - не помещает.
urry писал(а):Например, так - для visual

visual что? studio?
В поисках истины человек развивается.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

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

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

Сообщение R_ura »

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

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

#include <mega32.h>
//#include <stdlib.h>
//#include <string.h>
//#include <alcd.h>
//#include <delay.h>

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// определить тип данных
typedef struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
type_wrk;

type_wrk    wrk, prg;                // определить переменнse wrk, prg в рам типа    type_wrk
eeprom type_wrk    ee_wrk_1;  // определить переменную ee_wrk_1 в eeprom типа    type_wrk
eeprom type_wrk    ee_wrk_2;  // определить переменную ee_wrk_2 в eeprom типа    type_wrk
 
//...........................................................................................
 
//Ф-ция записывает данные в структуру *pE /EEprom/ из струтуры *pR /RAM/
void write_struct_to_eeprom (eeprom unsigned char *pE, unsigned char *pR, unsigned char size)
{
 while (size--){*pE++=*pR++;};
};
//............................................................................................
 
//Ф-ция копирует данные в структуру *pR /RAM/ из струтуры *pE /EEprom/   
void read_struct_from_eeprom (unsigned char *pR,eeprom unsigned char *pE,  unsigned char size)
{
while (size--){*pR++=*pE++;};
};
//........................................................................................................................

//Ф-ция копирует данные в структуру *pR /RAM/ из струтуры *pE /EEprom/   
void copy_struct_to_struct_in_eeprom (eeprom unsigned char *pR,eeprom unsigned char *pE,  unsigned char size)
{
while (size--){*pR++=*pE++;};
};
//............................................................................................
 
//Ф-ция копирует данные в структуру *p1 /RAM/ из струтуры *p2 /RAM/ 
void copy_struct_to_struct (unsigned char *p1,  unsigned char *p2,  unsigned char size)
{
while (size--){*p1++=*p2++;};
};
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void main(void)
{
 
while (1)
      {
write_struct_to_eeprom  ((eeprom unsigned char*)&ee_wrk_1,(unsigned char*)&wrk, sizeof(wrk));   
read_struct_from_eeprom ((unsigned char*)&wrk,(eeprom unsigned char*)&ee_wrk_1,sizeof(prg)); 
copy_struct_to_struct   ((unsigned char*) &wrk,  (unsigned char*)&prg,  sizeof(prg));
copy_struct_to_struct_in_eeprom ((eeprom unsigned char*)&ee_wrk_2,(eeprom unsigned char*)&ee_wrk_1,sizeof(ee_wrk_1));
      }
}


Неясны некоторые моменты.
При вызове функции

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

write_struct_to_eeprom  ((eeprom unsigned char*)&ee_wrk_1,(unsigned char*)&wrk, sizeof(wrk));  


зачем перед &ee_wrk_1 определять тип данных (eeprom unsigned char*)&ee_wrk_1 и почему в скобках? Это такая особенность КВ или стандартная сишная вещь?

Что-то вообще непонятное возникло ... Вот скриншот отладчика. Дело в том, что функция чтения из еепром ( против нее стоит желтая стрелка), почему-то меняет значение ee_wrk_1.cnt_X, расположенного в ЕЕпром. Причем это изменение наблюдается только в окне Watch, а в окне памяти ЕЕпром не меняется.
К тому же обведенная красным строчка не меняет содержимое wrk.cnt_X, хотя в него должно скопироваться из ee_wrk_1.cnt_X то значение, которое он имеет в окне Watch. При этом та же строчка правильно копирует из еепром в рам значение, если его устновить в поле памяти ЕЕпром вручную.
Как это понимать, как глюк студии?
З.Ы. Где-то читал ,что из каких-то соображений ( не помню уже) рекомендовали не использовать начальные адреса еепром.

Изображение

Да! нельзя ли где-то видеть, по какому адресу в еепром компилятор разместил ту или иную переменную?
Последний раз редактировалось R_ura Вт мар 06, 2012 23:12:35, всего редактировалось 4 раза.
Ответить

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