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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Дайте вашу программу.
Docendo discimus
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Как увеличить дальность действия команды Rcall ? если тот кусок кода из за которого она не достаёт (в основном это одни функции) запихать в библиотеку это может помочь?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

rcall? CodeVision?
Docendo discimus
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Да
Спойлер
pokk писал(а):Начал СV ругаться на команду RCALL в ассемблере.
"Error: E:\Documents and Settings\Максим\Мои документы\Dropbox\Public\sintezator\menu\MENU+BUTT\List\ADC.asm(1815): Relative branch out of reach"

Примерно понял почему ошибка выскакивает. Команд RCALL не сильно далеко может переходить видимо сильно много кода она не достаёт.Так ? Только как от этого избавится :dont_know:
Это стало появляться после того как внёс одну функцию(свою) в главный цикл.

7. Вопрос:
Не могу понять почему появляется ошибка: "Relative branch out of reach". Компилятор начал ругаться когда я добавил в программе несколько подпрограмм
(даже если они пустые) на brne, breq?
Ответ:
Команды условных переходов brne и breq имеют "дальность работы" от -64 до +63. У Вас расстояние до метки больше, поэтому ассемблер и выдает ошибку.
Используйте RCALL и RJMP, у которых дальность действия составляет от -2047 до +2047. И не строк, а команд (слов по 2 байта).

Ошибку понял правильно только как быть. Он ругается на 4 СALL которые находятся в прерывании по AЦП а этот кусок кода находится далековато от главного цикла. их разделяют функции.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

А чем не устраивает CALL?
Docendo discimus
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Может и устраивает Rcall CodeVision сам наставил =))
Как ему задать что бы он CAll использовал ?
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Кто нибудь объявлял переменные в еепром таким образом, как в инструкции к компилятору?
У меня не получается, говорит надо поставит точку сзапятой (;) в строке eeprom struct eeprom_structure {

Спойлер/* Global structure located in EEPROM */
eeprom struct eeprom_structure {
char a;
int b;
char c[15];
} se;


Еще раз задам вопрос: как объявлять переменные в еепром?
У меня версия компиля 2,05

Может быть последняя крякнутая версия поможет? Скажите какая есть крякнутая.
Если можно то ссылку или в личку.
Очень хочу разобраться, если получится, то обязательно здесь отпишусь!!!
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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

eeprom typedef struct 
{   
     
    unsigned char   N;     
    float           CKZ;    // расчётное среднеквадратическое значение
    unsigned char   Ky;     // коэффициент усиления
    float           CKZ_MS; // с микросхемы  среднеквадратическое значение
    char            read;   
}MYstructur;

У меня вот так вот всё нормально работает. Я так и не понял зачем там имя структуры писать.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

pokk писал(а):

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

eeprom typedef struct 
{   
     
    unsigned char   N;     
    float           CKZ;    // расчётное среднеквадратическое значение
    unsigned char   Ky;     // коэффициент усиления
    float           CKZ_MS; // с микросхемы  среднеквадратическое значение
    char            read;   
}MYstructur;

У меня вот так вот всё нормально работает. Я так и не понял зачем там имя структуры писать.


Не проканало.
Такаяже ошибка, надо точку с затятой поставит в том же месте.
К стати, компиль узнает словосочетание typedef struct - выделяет его...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Может у вас её выше не хватает?
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

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

typedef struct
{   
   
    unsigned char   N;     
    float           CKZ;    // расчётное среднеквадратическое значение
    unsigned char   Ky;     // коэффициент усиления
    float           CKZ_MS; // с микросхемы  среднеквадратическое значение
    char            read;   
}MyStructur;

MyStructur eeprom MyEEStructur;

MyEEStructur.N = стопиццот;
MyEEStructur.CKZ = тыщатыщ;
...
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

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

Спойлер/* Global structure located in EEPROM */
eeprom struct eeprom_structure {
char a;
int b;
char c[15];
} se;




я делал так, а так не работает, пишет что точку с затятой поставить надо!!!:
Спойлер/* Global structure located in EEPROM */
eeprom struct eeprom_structure {
char a = 0;
int b = 1;
char c[15];
} se;



Сейчас другая проблема:
в программе где встречаются переменные, которые я сохранил в ЕЕПРОМ, идет ругань типо эта переменная не была объявленна

Делал как в примере выше, результат такойже (undefined symbol)

Вопрос: как делать записть в переменную или массив:
У меня так:


Спойлерa = 5;
i = 5;
c[i] = 0;
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Жаль, что из форума ни кто помочь не смог!

Проблема была решина с помощью Brown-out детектора, настроенного на 4,3 вольта.

Я сам не верил в это, что это поможет (когда мне знакомый подсказал), но помогло.

Раньше проблема выскакивала (как я уже писал) при проппажи питания на МК и следующим пуском. Я уже 50 раз выкл/вкл - РБОТАЕТ!!!
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

А чего так кричать, ведь и так понятно что если снизить питание ниже допустимого уровня, то мк будет "творить" все что угодно, для этого и существуют даташиты, где указан диапазон питающего напряжения, ну и "детекторы".
«И всё-таки она вертится!»
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

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

Сообщение ELcat »

Amstron, проблема скорее всего не в детекторе провалов питания. У меня, например, МК без проблем пишут в EEPROM и при напряжении 2,8В, и даже ниже. Структурами не пользовался. Переменные обозначал как:
eeprom unsigned char/int/long/float ...;
Если присваивать им какие-то конкретные значения в самой программе, то необходимо кроме *.hex файла также прошивать и файл *.eep, который в этом случае генерируется средой.
Вам так же правильно писали и по поводу ресурса данной памяти - 100 тыс. Как-то в одном своём раннем проекте часов я заставил МК каждую минуту сохранять значение времени. Приблизительно через полгода МК начал читать из ячеек "хрень", что соответствовало наработке примерно 150 тыс. циклов.
В CV AVR версий 1.25.5 и 2.05.0 различий в этом вопросе нет.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Apparatchik писал(а):А чего так кричать, ведь и так понятно что если снизить питание ниже допустимого уровня, то мк будет "творить" все что угодно, для этого и существуют даташиты, где указан диапазон питающего напряжения, ну и "детекторы".

У меня в память еепром, сохраняется по нажатию кнопки. Так, что часто туда не записывается.

А глюк был , при выключении питания. Когда пропадало питание на МК, то почемуто еепром перезаписывалось чемто другим...
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Amstron писал(а):Когда пропадало питание на МК, то почемуто еепром перезаписывалось чемто другим...

Например для ATmega8A на странице 22 даташита есть рекомендации по предотвращению повреждения EEPROM
Preventing EEPROM Corruption
During periods of low VCC, the EEPROM data can be corrupted because the supply voltage is
too low for the CPU and the EEPROM to operate properly. These issues are the same as for
board level systems using EEPROM, and the same design solutions should be applied.
An EEPROM data corruption can be caused by two situations when the voltage is too low. First,
a regular write sequence to the EEPROM requires a minimum voltage to operate correctly. Second,
the CPU itself can execute instructions incorrectly, if the supply voltage is too low.
EEPROM data corruption can easily be avoided by following this design recommendation:

Keep the AVR RESET active (low) during periods of insufficient power supply voltage. This
can be done by enabling the internal Brown-out Detector (BOD). If the detection level of the
internal BOD does not match the needed detection level, an external low VCC Reset Protection
circuit can be used. If a reset occurs while a write operation is in progress, the write
operation will be completed provided that the power supply voltage is sufficient.

При работе с EEPROM нужно обязательно ставить детектор напряжения чтоб мк незаписал туда гадости когда напряжение питания станет критически низким для него (конденсаторы разряжаются медленно).

P.S. я понимаю что на английском и все такое, но можно было в даташите поискать по слову EEPROM и хотябы просмотреть с помощью переводчика.
«И всё-таки она вертится!»
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

ELcat писал(а):Amstron,
Если присваивать им какие-то конкретные значения в самой программе, то необходимо кроме *.hex файла также прошивать и файл *.eep, который в этом случае генерируется средой.


Я програмирую програматором, тоторый может отдельно програмировать и считывать по отдельности Main и EEPROM.
Когда я отдельно считываю EEPROM, то у меня сохраняется файл с расширением *.hex.

Зашол в папку компилятора, там есть три типа файла :

*.hex
*.eep
*.rom

Вопрос, как записать отдельно файл *.eep, если у меня програматору надо только *.hex ?
Програматор СТЕРХ 007. Очень хороший программатор.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Раз он очень хороший, то должен уметь заливать еепром. Если по какой-то причине вы не можите этого сделать, можно написать програмку, которая запишет вам нужные данные в еепром, и потом запрограмировать фьюз EESAVE, он защитит еепром при стирании мк.
«И всё-таки она вертится!»
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Apparatchik писал(а):Раз он очень хороший, то должен уметь заливать еепром. Если по какой-то причине вы не можите этого сделать, можно написать програмку, которая запишет вам нужные данные в еепром, и потом запрограмировать фьюз EESAVE, он не даст стереть еепром при стирании мк.

фьюз EESAVE у меня запрограмирован. Удобно. Спрошу у разработчика по еер... Спасибо!
Ответить

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