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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

... можно поступить, как, например, в Паскале - 1-ый элемент хранит размер массива

типа перед каждым обращением к массиву ставить проверку не обращаешься ли ты "за границу" массива??

а компилятор, неможет сам прощитать "все варианты работы программы" и если найдет косяки - сообщить об этом пользователю?? Понимаю, что займет много времени, но яб согласился и часик подождать.
KIT
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

.. а компилятор, неможет сам прощитать "все варианты работы программы"
не может - для С возможность выхода за границу массива не является ошибкой ( .. на то он и С - за большие возможности - большой спрос :) )
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

дело в том, что язык Си изначально построен по принципу "программисту виднее", т.е. компилятор обязан показывать только явно грубые ошибки и немного "подозрительных" варнингов, но вот контроль размерности массивов и значений указателей никогда компилятором Си не контролировались (и вряд ли будут). поэтому ваши надежды напрасны - хотите такого контроля, программируйте на Pascal или других языках со строгой типизацией и контролем (говорят, Ada в этом отношении страшно четкий язык, даже значение параметров функций способен контролировать)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

Ясно. Спасибо.



PS. :))) :))) что уже и помечтать нельзя :))) :)))
KIT
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

Столкнулся с таким ахтунгом...
AtMega8535, Proteus 7.6 sp4, CVAVR 2.04.4a
Конструкция типа

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

data[1]=eep_read(0x20+weekday*2);

Не хочет работать в Proteus. При входе в эту функцию, мк виснет. Но прерывания идут, и часовая микросхема успешно опрашивается по i2c.
Такая конструкция идет на ура:

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

tmp=(0x20+weekday*2);
data[1]=eep_read(tmp);
Но требует доп. переменную.

Такой блудняк что с чтением что с записью.

eep_read и eep_write взяты из даташита на мегу.

Чей это косяк? в МК такое очень палевно заливать...
O-LED писал(а):Так вот, если в программе ошибочно обратиться к шестому элементу массива mass1, то он "без зазрения совести" принимает значение первого элемента массива mass2. Очень трудно уловимый глюк был..... Подскажите, есть ли способ как то обезопасить себя от таких случаев в будущем??
у меня тоже было такое, давно в курсе что за трабла но до сих пор это еще не исправил :))) :))) :)))
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

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

Сообщение igor-x »

Добрый день.

подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

igor-x писал(а):Добрый день.

подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.

У нормально меня пишет с помощью стандартных СИшных функций из даташита.
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

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

Сообщение igor-x »

Волосатый писал(а):
igor-x писал(а):Добрый день.

подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.

У нормально меня пишет с помощью стандартных СИшных функций из даташита.


я взял пример из CVAVR.. возможно он будет работать не во всех случаях на реальном МК?
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

igor-x писал(а):
Волосатый писал(а):
igor-x писал(а):Добрый день.

подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.

У нормально меня пишет с помощью стандартных СИшных функций из даташита.


я взял пример из CVAVR.. возможно он будет работать не во всех случаях на реальном МК?

Мне кажется лучше брать стандартный код из даташита на ваш камешек, ну или хотябы на семейство МК.
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

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

Сообщение igor-x »

Волосатый писал(а):Мне кажется лучше брать стандартный код из даташита на ваш камешек, ну или хотябы на семейство МК.


согласен. но функция по даташиту пишет по абсолютным адресам епром, - неудобно работать с переменными. а возможно я просто неправильно все понимаю.
ладно ,попробую делать как CV рекомендует
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

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

Сообщение igor-x »

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


начинаю понимать что это проблема связки CV - Proteus.
так что на время отладки поместил все RAM .
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

А что скажете про баг вычислений в параметрах (выше) ?
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я не знаю, как определена ваша функция, которая получает неверные параметры. приведите ее прототип полностью - тогда можно будет подумать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

ARV писал(а):я не знаю, как определена ваша функция, которая получает неверные параметры. приведите ее прототип полностью - тогда можно будет подумать

eep_write :

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

//==================eep_write==================
void eep_write(u16 addr, u8 data) {

/* Ожидаем окончание предыдущей записи */
while(EECR & (1<<EEWE));

/* Указание адреса и данных */
EEAR = addr;
EEDR = data;
/* Запись лог. 1 в  EEMWE */
EECR |= (1<<EEMWE);
/* Запуск записи в ЭСППЗУ путем установки EEWE */
EECR |= (1<<EEWE);
};
//----------

eep_read :

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

//==================eep_read====================
u8 eep_read(u16 addr) {
/* Ожидание  завершения предыдущей записи*/
while(EECR & (1<<EEWE))
;
/* Установка адресного регистра */
EEAR = addr;
/* Разрешение чтения из ЭППЗУ путем установки EERE */
EECR |= (1<<EERE);
/* Возврат данных из регистра данных ЭСППЗУ*/
return EEDR;
}
//----------

Все из даташита...
Опыт приходит сразу после того, как он был нужен...
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

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

Сообщение clawham »

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

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

eeprom float             eep_WattsPerHz     = 100;
float                    WattsPerHz;


потом в маине делаю

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

WattsPerHz     = eep_WattsPerHz; 

вродебы чтение...
но в WattsPerHz получается полный бред.....
в мап файле почему-то вот такое

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

RAM
WattsPerHz                                                        02A8h        4

EEPROM
eep_WattsPerHz                                                 0000h        2

почему 2-то???? если флоат 32 битный? или я чота недопонял?
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

clawham писал(а):почему 2-то???? если флоат 32 битный? или я чота недопонял?
Вот на моем компиляторе:

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

RAM Allocation
Variable                                                          Address   Size
----------
WattsPerHz                                                        0160h        4

EEPROM Allocation
Variable                                                          Address   Size
----------
eep_WattsPerHz                                                    0000h        4
Всё в порядке. У вас что-то "кривое".
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

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

Сообщение clawham »

я не спорю что чтото да и кривое...я сейчас через юнион и 4 чара сохраняю и читаю ... но..
а какая у Вас версия компилятору? официалка или уже сразу с 111111111 в ключе?
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

clawham
Перекомпилировал то, что прислали:

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

EEPROM Allocation
Variable                                                          Address   Size
----------
Safed                                                             0000h        1
FirstPower                                                        0001h        1
eep_ClocksPerSec                                                  0002h        4
eep_WattsPerHz                                                    0006h        4
eep_TicksPerkWh                                                   000Ah        2
eep_TicksPerk18                                                   000Ch        2
eep_Timeout                                                       000Eh        2
eep_TotalKWH1                                                     0010h        4
Типам данных соответствует.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

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

Сообщение clawham »

а вы обратили внимание что там нет флоата?
эти переменные сейчас это eeprom char ee_clocks[4]!!!
вот если бы вместо этого изврата поставить сразу флоат....
лонг кстати пишет нормально...4 байта...
наверное переустановлю свою кодвижну....и буду таки уходить от флоатов...много они памяти жрут...особенно их вывод на экран...
так то через унион у меня всё получилось и работает...но....пришло время немного экономить каждый байт...вчера вон не меняя вообще логики программы сэкономил 4 процента флеши...было 100% занято а сейчас 97 :)
но если уйти из флоата то было бы очень хорошо....
просто интересно почему и только ли это у меня запись eeprom float a=8000000; превращается в какой-то бред а когда потом копируеш это значвение в РАМовский буффер float b=a; то в b потом получается какой-то бред несусветный...

сейчас делаю вот так

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

union{
float f;
char c[4];
}uf;

eeprom unsigned char     FirstPower     = 0;

eeprom char          eep_ClocksPerSec[4];
float                    ClocksPerSec;

процедурки для чтения и записи флоата в/из еепром

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

float readfeep(eeprom char *ch)
{
    for(a=0;a<=4;a++)
        uf.c[a]=ch[a];
    return uf.f;   
}

void writef(eeprom char *ch, float f)
{
    uf.f = f;
    for(a=0;a<=4;a++)
        ch[a] = uf.c[a];
}

потом инициализирую при первом запуске

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

if(FirstPower!=132)
{
    // первый запуск
    FirstPower = 132;
    writef(eep_ClocksPerSec, 8000000.0);
}

ClocksPerSec    = readfeep(eep_ClocksPerSec);
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Ответить

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