Страница 112 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 11, 2011 14:17:38
Cepera77
ARV писал(а):проблема только в том, что если вдруг какая-то БИБЛИОТЕЧНАЯ функция тоже использует регистры R11 и R12, вы получите черти-что...
Тестовые прогоны показали, что в случае использования регистров R11, R12 библиотечной функцией, значения в переменных result_1,2 меняются в унисон изменению значения регистров, черти-чего не происходит, а так как значения переменных нужны только в момент выхода из подпрограммы, то дальнейшая их судьба, вернее содержание, не важно. Теоретически, если в момент выполнения библиотечной функции, мы поменяем значение регистров, то возможен сбой, но как это вообще возможно практически, да еще на Си, ума не приложу.
ARV писал(а): int это 2 байта, а
R11 - это один байт... и что там компилятор будет делать с этим - еще надо разобраться

Компилятор так и оставляет int intом, при считывании значения регистра в переменную int втрой байт заполняется нулями, попытка присвоить переменной result_1 значение больше 255, к краху не привело, в переменной присвоенное значение, а в регистр R11 заносится какое-то другое число. Но в этом случае лучше использовать тип char или unsigned char, абсолютно согласен.
Сначала я предпологал, что эти регистровые переменные, это закамуфлированные указатели на регистры, но по всей видимости нет, они имеют свои адреса в памяти, и могут иметь различное с регистром значение. Я еще поэкспериментирую.
Так что в целом метод вполне рабочий.
ARV писал(а):напрасно не желаете меня слушать... но дело ваше.
С чего Вы взяли? Я Вас очень внимательно слушаю.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 11, 2011 15:01:47
ARV
прилепив к кошке крылья, вы из нее стрекозу не сделаете. она, хотя и не помрет, но летать не станет.
это я к тому, что добившись на частном примере корявой работоспособности при вашем изначально неверном подходе, вы еще огребете проблем в будущем, я только не могу сказать, когда именно и в каком именно проекте это произойдет. если б вы меня действительно слушали, то есть воспринимали бы мои слова, вы бы давно написали свою функцию на чистом Си без примеси ассемблера, и не морочили бы голову с регистрами. сомневаюсь, что у вас как раз тот весьма редкий случай, когда без ассемблера обойтись ну никак невозможно...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 12:14:04
Amstron
Умные коты! Подскажи как можно из 2000 точек измеренных АЦП высчитывать среднее значение, при следующем условии:
При снятии новых 100 точек, первые 100 должны не считаться и новое среднее значение, должно высчитываться с учетом
новых 100 - та точек.
Если без пойнтеров , то можно завести массив на 20 значений и заносить в него средние по 100 точкам,
каждый раз выкидывая самое старое и меняя на новое. Ну и считать
среднее по этому массиву.
Хотелось бы что бы программа тормазила как можно меньше и думаю, что надо делать при помощи пойнтеров.
посоветуйте как это сделать?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 12:34:33
ChipKiller
Amstron писал(а):как можно из 2000 точек измеренных АЦП высчитывать среднее значение
... думаю что проще без массива. Заводим переменную i_ADC типа
int и при каждом считывании i_ADC+=очередное значение, а потом делим на кол-во считываний.
PS ... главное не допускать переполнения i_ADC
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 12:42:10
Amstron
ChipKiller писал(а):Amstron писал(а):как можно из 2000 точек измеренных АЦП высчитывать среднее значение
... думаю что проще без массива. Заводим переменную i_ADC типа
int и при каждом считывании i_ADC+=очередное значение, а потом делим на кол-во считываний.
PS ... главное не допускать переполнения i_ADC
Работать будет, но не так как мне надо.
жду еще предложений!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 12:55:42
ChipKiller
Amstron писал(а):Хотелось бы что бы программа тормазила как можно меньше
... работа с массивами в Вашем случае просто не нужна и кроме "торможения" ничего не даст
Amstron писал(а):Работать будет, но не так как мне надо.
... тогда сначала определитесь с тем
что Вам надо
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 13:13:06
Amstron
ChipKiller писал(а):
... тогда сначала определитесь с тем что Вам надо
Из 2000 точек измеренных АЦП высчитывать среднее значение, при следующем условии:
При снятии новых 100 точек, первые 100 удаляются и новое среднее значение, должно высчитываться с учетом
новых 100 - та точек.
Забыл написать. У меня сейчас есть функция которая высчитывает среднее значение из 100 точек.
Вопщем надо как бы создать массив и что бы в нем созранялись 20 значений. (одно значение - это среднее из 100 точек)
При появлении нового среднего значения - старое значение должно удаляться и записываться туда новое значение и далее вычисляться среднее.
Слышал, что можно это делать при помощи указателей.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 13:22:57
ARV
я не понял, чем не устраивает такое:
Код: Выделить всё
int ave100(void); // это ваша функция, которая выдает среднее по 100 замерам
int values[20]; // это ваш массив из 20 средних значений
int i=0;
while(1){
values[i++] = ave100();
if(i == 20) i = 0;
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 13:27:08
ChipKiller
Amstron писал(а):Забыл написать. У меня сейчас есть функция которая высчитывает среднее значение из 100 точек.
Вопщем надо как бы создать массив и что бы в нем созранялись 20 значений. (одно значение - это среднее из 100 точек)
.. заполняя массив - делаете двойную (...и не нужную) работу
Код: Выделить всё
i_ADC=0; i=50; // i*j=2000
while(i--){
i1_ADC=0; j=40;
while(j--){ i1_ADC+=GetADC(); }
i1_ADC/=40;
i_ADC+=i1_ADC;
}
i_ADC/=50;
... а если принять i,j кратное степени 2, то деление заменяется сдвигом, что работает быстрее
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 13:36:28
Amstron
ARV писал(а):я не понял, чем не устраивает такое:
Код: Выделить всё
int ave100(void); // это ваша функция, которая выдает среднее по 100 замерам
int values[20]; // это ваш массив из 20 средних значений
int i=0;
while(1){
values[i++] = ave100();
if(i == 20) i = 0;
}
Смысл мне понятен! Сасибо.
А если использовать уазатели, то быстрее работать будет?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 13:51:48
Amstron
ChipKiller писал(а):Amstron писал(а):Забыл написать. У меня сейчас есть функция которая высчитывает среднее значение из 100 точек.
Вопщем надо как бы создать массив и что бы в нем созранялись 20 значений. (одно значение - это среднее из 100 точек)
.. заполняя массив - делаете двойную (...и не нужную) работу
Код: Выделить всё
i_ADC=0; i=50; // i*j=2000
while(i--){
i1_ADC=0; j=40;
while(j--){ i1_ADC+=GetADC(); }
i1_ADC/=40;
i_ADC+=i1_ADC;
}
i_ADC/=50;
... а если принять i,j кратное степени 2, то деление заменяется сдвигом, что работает быстрее
как то сложновато для меня и не понятно.
Вариант предложенный AVR мне больше подходит.
Как насчет использования указателей?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс фев 13, 2011 14:02:14
ARV
судя по вашим вопросам, применение указателей вам будет даваться намного труднее

массив - это тот же указатель, но в другом виде. маловероятно, что отказ от массива в пользу указателей даст вам выигрыш в скорости...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт фев 15, 2011 20:19:41
Valek87
Подскажите, где можно скачать книги, где расписываются все функции контроллеров на Си. Например, как реализовать таймер на Си и т.д..
И еще. Допустим я создал проект на ассемблере. Как мне прошить контроллер через codevisionAVR?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт фев 15, 2011 22:28:55
Сериг
купите в озоне пообие для начинающих Codevision avr .
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт фев 15, 2011 23:00:31
andrey_artemov
Могу порекомендовать пару книг в электронном виде
1. Практически даташит на русском языке
Евстифеев А.В. - Микроконтроллеры AVR семейства Mega
2. Книга по кодевижион (не сильно я надругался над названием компилятора ?)
М.Б.Лебедев 2008-600M - CodeVisionAVR Пособие для начинающих
Если в нете не найдёшь скинь адрес э.почты, пошлю тебе...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 16, 2011 08:19:41
Valek87
Допустим я создал проект на ассемблере. Как мне прошить контроллер через codevisionAVR?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 16, 2011 11:05:05
ChipKiller
Valek87 писал(а):Как мне прошить контроллер через codevisionAVR?
... после успешной компиляции - в меню
Tools выбрать
Chip Programmer
PS Самое главное не ставить "галочку" в Program Fuse Bit(s), не разобравшись какие FUSe, что значат.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 17, 2011 19:59:24
Ardarik
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF;
while(1)
{
PORTB = 0x00;
_delay_ms(250);
PORTB = 0xFF;
_delay_ms(250);
}
return 0;
}
почему ругается на первую строчку?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 17, 2011 20:14:21
ARV
Ardarik писал(а):Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF;
while(1)
{
PORTB = 0x00;
_delay_ms(250);
PORTB = 0xFF;
_delay_ms(250);
}
return 0;
}
почему ругается на первую строчку?
потому что эта (и другие) строчка характерна для
WinAVR, а вы ее тулите в CVAVR
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 17, 2011 20:19:18
Ardarik
Ну первую строчку исправил а вторую как?