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

Обсуждаем контроллеры компании Atmel.
Cepera77
Родился
Сообщения: 4
Зарегистрирован: Пт фев 11, 2011 11:07:59

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

Сообщение Cepera77 »

ARV писал(а):проблема только в том, что если вдруг какая-то БИБЛИОТЕЧНАЯ функция тоже использует регистры R11 и R12, вы получите черти-что...

Тестовые прогоны показали, что в случае использования регистров R11, R12 библиотечной функцией, значения в переменных result_1,2 меняются в унисон изменению значения регистров, черти-чего не происходит, а так как значения переменных нужны только в момент выхода из подпрограммы, то дальнейшая их судьба, вернее содержание, не важно. Теоретически, если в момент выполнения библиотечной функции, мы поменяем значение регистров, то возможен сбой, но как это вообще возможно практически, да еще на Си, ума не приложу.


ARV писал(а): int это 2 байта, а R11 - это один байт... и что там компилятор будет делать с этим - еще надо разобраться :)))


Компилятор так и оставляет int intом, при считывании значения регистра в переменную int втрой байт заполняется нулями, попытка присвоить переменной result_1 значение больше 255, к краху не привело, в переменной присвоенное значение, а в регистр R11 заносится какое-то другое число. Но в этом случае лучше использовать тип char или unsigned char, абсолютно согласен.
Сначала я предпологал, что эти регистровые переменные, это закамуфлированные указатели на регистры, но по всей видимости нет, они имеют свои адреса в памяти, и могут иметь различное с регистром значение. Я еще поэкспериментирую.
Так что в целом метод вполне рабочий.

ARV писал(а):напрасно не желаете меня слушать... но дело ваше.

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

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Умные коты! Подскажи как можно из 2000 точек измеренных АЦП высчитывать среднее значение, при следующем условии:
При снятии новых 100 точек, первые 100 должны не считаться и новое среднее значение, должно высчитываться с учетом
новых 100 - та точек.


Если без пойнтеров , то можно завести массив на 20 значений и заносить в него средние по 100 точкам,
каждый раз выкидывая самое старое и меняя на новое. Ну и считать
среднее по этому массиву.

Хотелось бы что бы программа тормазила как можно меньше и думаю, что надо делать при помощи пойнтеров.

посоветуйте как это сделать?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Amstron писал(а):как можно из 2000 точек измеренных АЦП высчитывать среднее значение
... думаю что проще без массива. Заводим переменную i_ADC типа int и при каждом считывании i_ADC+=очередное значение, а потом делим на кол-во считываний.

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

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

Сообщение Amstron »

ChipKiller писал(а):
Amstron писал(а):как можно из 2000 точек измеренных АЦП высчитывать среднее значение
... думаю что проще без массива. Заводим переменную i_ADC типа int и при каждом считывании i_ADC+=очередное значение, а потом делим на кол-во считываний.

PS ... главное не допускать переполнения i_ADC


Работать будет, но не так как мне надо.

жду еще предложений!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

Сообщение Amstron »

ChipKiller писал(а):... тогда сначала определитесь с тем что Вам надо

Из 2000 точек измеренных АЦП высчитывать среднее значение, при следующем условии:
При снятии новых 100 точек, первые 100 удаляются и новое среднее значение, должно высчитываться с учетом
новых 100 - та точек.

Забыл написать. У меня сейчас есть функция которая высчитывает среднее значение из 100 точек.
Вопщем надо как бы создать массив и что бы в нем созранялись 20 значений. (одно значение - это среднее из 100 точек)

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

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

Сообщение ARV »

я не понял, чем не устраивает такое:

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

int ave100(void); // это ваша функция, которая выдает среднее по 100 замерам
int values[20]; // это ваш массив из 20 средних значений
int i=0;
while(1){
   values[i++] = ave100();
   if(i == 20) i = 0;
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение 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, то деление заменяется сдвигом, что работает быстрее
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

ARV писал(а):я не понял, чем не устраивает такое:

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

int ave100(void); // это ваша функция, которая выдает среднее по 100 замерам
int values[20]; // это ваш массив из 20 средних значений
int i=0;
while(1){
   values[i++] = ave100();
   if(i == 20) i = 0;
}

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

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

Сообщение 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 мне больше подходит.
Как насчет использования указателей?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Valek87
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

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

Сообщение Valek87 »

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

И еще. Допустим я создал проект на ассемблере. Как мне прошить контроллер через codevisionAVR?
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

купите в озоне пообие для начинающих Codevision avr .
Аватара пользователя
andrey_artemov
Встал на лапы
Сообщения: 136
Зарегистрирован: Сб авг 15, 2009 21:26:50
Откуда: Пенза
Контактная информация:

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

Сообщение andrey_artemov »

Могу порекомендовать пару книг в электронном виде
1. Практически даташит на русском языке
Евстифеев А.В. - Микроконтроллеры AVR семейства Mega
2. Книга по кодевижион (не сильно я надругался над названием компилятора ?)
М.Б.Лебедев 2008-600M - CodeVisionAVR Пособие для начинающих
Если в нете не найдёшь скинь адрес э.почты, пошлю тебе...
Valek87
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

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

Сообщение Valek87 »

Допустим я создал проект на ассемблере. Как мне прошить контроллер через codevisionAVR?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Valek87 писал(а):Как мне прошить контроллер через codevisionAVR?
... после успешной компиляции - в меню Tools выбрать Chip Programmer

PS Самое главное не ставить "галочку" в Program Fuse Bit(s), не разобравшись какие FUSe, что значат.
Аватара пользователя
Ardarik
Вымогатель припоя
Сообщения: 671
Зарегистрирован: Пн май 18, 2009 16:26:10
Откуда: Саранск
Контактная информация:

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

Сообщение 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;
}

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

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

Сообщение 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
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ardarik
Вымогатель припоя
Сообщения: 671
Зарегистрирован: Пн май 18, 2009 16:26:10
Откуда: Саранск
Контактная информация:

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

Сообщение Ardarik »

Ну первую строчку исправил а вторую как?
Хватит жить как получается- надо жить как хочется
Ответить

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