Страница 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
Ну первую строчку исправил а вторую как?