AVR ADC & IAR2.28

Do you have a question? Post it now! No Registration Necessary

Threaded View
Hello, All !

Hаписал (собственно перетащил из другого проекта) я вот такой вот код (ниже).
Один раз вызывается init_ADC(), потом например по прерыванию от таймера раз в
миллисекунду вызывается get_ad(), который последовательно канал за каналом (по
одному на вызов) опрашивает АЦП и заполняет массив ad_res[] отфильтрованными
значениями медленно меняющихся величин. Вопрос в том, что почему-то без
помеченых "??????????" действий значения оказываются сдвинутыми на 1. То есть
по нулевому индексу значение последнего канала, по первому - нулевого, ну и так
далее. Это я смотрю и не вижу чего-то очевидного, аппаратная особенность (не
похоже) или ошибка при компиляции (тоже не похоже). Я почесал в голове и
продолжил дальше работать, задача не перенести на Mega32L программу, а освоить
средства разработки перед началом работы с новым атмеловским кристаллом,
которая начнется как только будут улажены юридические формальности, но вопрос
остался.

Заодно и еще один вопрос. Как сказать компилятору в IDE чтобы он код вида
puts("Hello, World!"); не компилировал как константную строку в ПЗУ и указатель
на нее в ОЗУ.

____________types.h_________________________
typedef unsigned int WORD;
typedef unsigned int word;
typedef unsigned char BYTE;
typedef unsigned char byte;
____________types.h_________________________

____________adc.h____________________________
#define ad_num 8 // channels
#define _8BIT_

void init_ADC(void);
void get_ad();
extern __no_init byte ad_res[];            /* AD average results */
extern __no_init byte ad_adj[];            /* AD adjustment values */
____________adc.h____________________________

____________adc.c____________________________

// 8 bit ADC -> 8 bit low pass filtered

#define ENABLE_BIT_DEFINITIONS
#include <iom32.h>
#include <types.h>
#include <ina90.h>
#include <ADC.h>

#define LPF

// Private variables
__no_init static byte ad_ch;               /* ADC channel */
__no_init static word ad_res_w[ad_num];   /* AD temporary values */

// Public variables
__no_init byte ad_res[ad_num];            /* AD average results */
__no_init byte ad_adj[ad_num];            /* AD adjustment values */


void init_ADC(void)
{
  register byte i;

  ADMUX = (1<<REFS0)|(1<<ADLAR);
  ADCSRA = ((1<<ADEN)|6); // CLK/64
  ad_ch = 0;
#ifdef _8BIT_
  ADMUX = 0x60;
#else
  ADMUX = 0x40;
#endif
  for(i = 0;i < ad_num; i++)
    {
     ad_res_w[i] = 0;
     ad_adj[i] = 128;
    }
  DDRA &= (byte)(255 << ad_num);
}


/* AD measurement and average value calculation (low pass digital filter) */
/* one channel per call */

void get_ad()
{
#ifdef LPF
 word ad_tmp_w;

 ADCSRA |= (1<<ADSC);  //Start ADC
 while ((ADCSRA & (1<<ADSC)) == 1);

#ifdef _8BIT_
 ad_tmp_w = (word)ADCH * 128U; // Scale AD value
#else
 ad_tmp_w = (word)ADC * 32U;
#endif

 ad_res_w[ad_ch] += ((signed)(ad_tmp_w - ad_res_w[ad_ch]) / 16);

 ad_res[ad_ch] = (byte)(((ad_res_w[ad_ch] /128) * ad_adj[ad_ch]) / 128); // *
Scale outcome */


 /* Select next channel */
 if (++ad_ch == ad_num) ad_ch = 0;

#ifdef _8BIT_
 if (ad_ch == ad_num - 1) ADMUX = 0x60; /* ?????????? */
 else ADMUX = 0x60 | ad_ch+1;
#else
 if (ad_ch == ad_num - 1) ADMUX = 0x40;
 else ADMUX = 0x40 | ad_ch+1;
#endif

#else //LPF
 ADCSRA |= (1<<ADSC);
 while ((ADCSRA & (1<<ADSC)) == 1);
 ad_res[ad_ch] = ADCH;
 /* Select next channel */
 if (++ad_ch == ad_num) ad_ch = 0;
 ADMUX = 0x60;
#endif //LPF
}
____________adc.c____________________________

С уважением, Дима Орлов.


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к All 29.01.2004:

 DO> Заодно и еще один вопрос. Как сказать компилятору в IDE чтобы он код
 DO> вида puts("Hello, World!"); не компилировал как константную строку в
 DO> ПЗУ и указатель на нее в ОЗУ.

Чтобы именно этот код - никак. Поскольку функция puts работает со строкой из
ОЗУ. Есть функция puts_P, которая работает со строкой из flash. Есть опция
"--string_literals_in_flash" при включении которой все литералы будут
размещаться во flash, а не в ОЗУ. Или, если эту опцию не включать,
разместить строку во flash можно так:
char __flash str[]="Hello, World!";

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /


Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  DO> Заодно и еще один вопрос. Как сказать компилятору в IDE чтобы он код
 >  DO> вида puts("Hello, World!"); не компилировал как константную строку в
 >  DO> ПЗУ и указатель на нее в ОЗУ.

 > Чтобы именно этот код - никак. Поскольку функция puts работает со
 > строкой из ОЗУ. Есть функция puts_P, которая работает со строкой из flash.

Я вообще-то не имел в виду никаких библиотечных функций, это моя функция.

void puts(const char * str);

Вобщем я примерно понял куда надо копать, спасибо.

 > Есть опция
 > "--string_literals_in_flash" при включении которой все литералы будут
 > размещаться во flash, а не в ОЗУ. Или, если эту опцию не включать,
 > разместить строку во flash можно так:
 > char __flash str[]="Hello, World!";

Я пока что пользуюсь IDE, там эта опция не включается...

С уважением, Дима Орлов.


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov 30.01.2004:

Quoted text here. Click to load it
 >> "--string_literals_in_flash" при включении которой все литералы будут

 DO> Я пока что пользуюсь IDE, там эта опция не включается...

включается, как и любая другая. В параметрах компилятора в IDE есть поле
"Additional compiler options", куда можно вписать все, что угодно.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /


Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >>> Есть опция
 >>> "--string_literals_in_flash" при включении которой все литералы будут

 >  DO> Я пока что пользуюсь IDE, там эта опция не включается...

 > включается, как и любая другая. В параметрах компилятора в IDE есть поле
 > "Additional compiler options", куда можно вписать все, что угодно.

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

С уважением, Дима Орлов.

PS А по поводу загадочного поведения каналов АЦП идей нет?


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov 30.01.2004:


 DO> Меня насторожило то, что такая опция в принципе есть и
 DO> включается крыжиком, но при выборе меги 32 она становится неактивной.

нету там такого крыжика! А тот, который ты, видимо, имеешь в виду
предназначен для другого - он размещает строковые литералы во внешнем ПЗУ
данных, коего у меги 32 быть не может по причине отсутствия интерфейса
внешней памяти.

 DO> PS А по поводу загадочного поведения каналов АЦП идей нет?

да сильно много ты там понаписал - в лом разбираться. Но ни в компиляторе ни
в АЦП (mega128) я никаких странностей не замечал.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /


AVR ADC & IAR2.28
Fri Jan 30 2004 12:53, Dima Orlov wrote to Askold Volkov:


 DO> PS А по поводу загадочного поведения каналов АЦП идей нет?

 Ты бы написал cюда пример по-человечески, оставив только содержательную
 часть и убрав кучу #ifdef-ов, не относящихся к делу.

 VLV

"Evil will prevail because good is dumb" (c) Space Balls


Re: AVR ADC & IAR2.28
       Доброго здоровья, Askold!

30 Jan 04 12:53, Askold Volkov написал для Dima Orlov:

 >>> Есть опция
 >>> "--string_literals_in_flash" при включении которой все литералы будут

 DO>> Я пока что пользуюсь IDE, там эта опция не включается...

 AV> включается, как и любая другая. В параметрах компилятора в IDE есть поле
 AV> "Additional compiler options", куда можно вписать все, что угодно.

  в доке на 2.28 не нашел такого. компилер ругается на неправильный синтаксис.
или речь не о 2.28?
  а чтоб __vtbl в сегмент кода записать пока ничего не придумали?

    WBR, Сергей.                                     ICQ: 101347299


Re: AVR ADC & IAR2.28
Привет, 30 января 2004 г., 13:51:46, ты писал(а):

Quoted text here. Click to load it
DO>>> Я пока что пользуюсь IDE, там эта опция не включается...
AV>> включается, как и любая другая. В параметрах компилятора в
AV>> IDE есть поле
AV>> "Additional compiler options", куда можно вписать все, что угодно.
ST>   в доке на 2.28 не нашел такого. компилер ругается на неправильный
ST> синтаксис. или речь не о 2.28?

2.28А прекрасно понимает этот ключ

Всего хорошего.





--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: AVR ADC & IAR2.28
Fri, 30 Jan 2004 13:51:46 +0300 Sergei Tuchinski wrote to Askold Volkov:


[...]

ST>   в доке на 2.28 не нашел такого. компилер ругается на неправильный
ST> синтаксис. или речь не о 2.28?
ST>   а чтоб __vtbl в сегмент кода записать пока ничего не придумали?

    В смысле? Таблица виртуальных функций прекрасно размещается во флеши безо
всяких указаний.

--
H.Z.

harry.zhurov<antispam::at>ngs<antispam::period>ru

We've slightly trimmed the long signature. Click to see the full one.
Re: AVR ADC & IAR2.28
    Всем привет!

Sergei Tuchinski писал к Askold Volkov Fri, 30 Jan 2004 13:51:46 +0300:

 ??>>>> Есть опция
 ??>>>> "--string_literals_in_flash" при включении которой все литералы
 ??>>>> будут

 ST>   в доке на 2.28 не нашел такого. компилер ругается на неправильный
 ST> синтаксис. или речь не о 2.28?

Именно о нем. Ничего там никуда не ругается. Описано в iccavr.htm

 ST>   а чтоб __vtbl в сегмент кода записать пока ничего не придумали?

а что это такое и зачем надо?

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /



AVR ADC & IAR2.28
Hello Dima.

29 Jan 04 20:23, you wrote to all:

 DO> Hаписал (собственно перетащил из другого проекта) я вот такой вот код
 DO> (ниже). Один раз вызывается init_ADC(), потом например по прерыванию
 DO> от таймера раз в миллисекунду вызывается get_ad(), который
 DO> последовательно канал за каналом (по одному на вызов) опрашивает АЦП и
 DO> заполняет массив ad_res[] отфильтрованными значениями медленно
 DO> меняющихся величин. Вопрос в том, что почему-то без помеченых
 DO> "??????????" действий значения оказываются сдвинутыми на 1. То есть по

Я не стал вчитываться в потробности (тебе бы для понятности, надо было #ifdef-ы
раскрыть), но нужно учесть, что мультиплексор в AVR обновляется из регистра
ADMUX в конце преобразования. То есть, пока преобразование идет,
канал не переключится. Вчитайся в соответствующий раздел и поэкспериментируй.

 DO> нулевому индексу значение последнего канала, по первому - нулевого,
 DO> ну
 DO> и так далее.

Я в нашем устройстве (Автосканер) такими глюками наелся дофига. Только там
другая проблема - мультиплексор медленно переключается, и АЦП оцифровывал
сигнал с предыдущего канала.

Alexey


Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  DO> А объявленное константой содержимое ПЗУ в ОЗУ копировать эффективно?
 >  DO> Это очень зависит...

 >  DO> Hу так long'ом бы его сделали... Если уж такая борьба за совместимость.

 > А чего ты со мной-то споришь? Ты это IARовцам попробуй объяснить :)

Да я собственно и не спорю, просто мысли вслух.

 >  DO>>> Или спокойнее вообще убрать из стартапа эту автоинициализацию?

 >>> а чем она тебе помешала?

 >  DO> Лишний код. Я то, что нужно обычно инициализирую явно, причем совсем не
 >  DO> обязательно нулями.

 > Hу ты тут прямо как Шепелев :) Лишнего кода там байт 10. Все, не

И куча no_init в программе...

 > инициализированное явно, там размещается подряд и прописывается нулями в
 > цикле. А все явно инициализированное тоже размещается подряд и в
 > цикле же копируется из flash, что явно эффективнее, чем инициализировать
 > вручную и по-отдельности.

Зато в нужном месте, что важней.

С уважением, Дима Орлов.


Re: AVR ADC & IAR2.28
Hello, Askold Volkov !


 >  DO> Меня насторожило то, что такая опция в принципе есть и
 >  DO> включается крыжиком, но при выборе меги 32 она становится неактивной.

 > нету там такого крыжика! А тот, который ты, видимо, имеешь в виду
 > предназначен для другого - он размещает строковые литералы во внешнем ПЗУ
 > данных, коего у меги 32 быть не может по причине отсутствия интерфейса
 > внешней памяти.

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

 >  DO> PS А по поводу загадочного поведения каналов АЦП идей нет?

 > да сильно много ты там понаписал - в лом разбираться. Hо ни в

Hу да, по сути целых 5 строк...

 > компиляторе ни в АЦП (mega128) я никаких странностей не замечал.

Остальное у меня тоже работает после перекомпиляции, и там тоже разнообразные
операции с массивами. Hу есть вопросы с эффективностью и размещением
переменных, но это этап номер два и станет актуальным, если в имеющиеся Х к
чипа ХХХХ ХХХХХХХ 1/2 оно начнет не влазить, потому что первая задача собрать
проект на этом чипе и смотреть как оно в реальном энвайроменте живет.

С уважением, Дима Орлов.


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov Fri, 30 Jan 2004 14:53:00 +0300:

 DO>>> Меня насторожило то, что такая опция в принципе есть и
 DO>>> включается крыжиком, но при выборе меги 32 она становится неактивной.

 ??>> нету там такого крыжика! А тот, который ты, видимо, имеешь в виду
 ??>> предназначен для другого - он размещает строковые литералы во внешнем
 ??>> ПЗУ данных, коего у меги 32 быть не может по причине отсутствия
 ??>> интерфейса внешней памяти.

 DO> А, тогда понятно. Hепонятно только почему в ide, уже если ее сделали,
 DO> не внести все крыжики.

Точно ответить могут только авторы, я же могу только высказать свои догадки.
Во-первых, это свежая опция, возможно ее просто не успели внести в IDE к
моменту его выпуска. Во-вторых IARовцы очень долго сопротивлялись ее
введению, считая идеологически неправильной, и сделали это только под
давлением пользователей. И действительно - включение этой опции противоречит
стандарту языка.

 DO> Видимо пора от нее отказываться к чертовой матери, не дожидаясь
 DO> перитонита. Собственно от линковки с установленными крыжиками уже
 DO> пришлось отказаться - оно проесто перестало линковаться, и с идущим
 DO> линк-файлом тоже. Пришлось править...

Странно. А я из среды собираю и ничего.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /



Re: AVR ADC & IAR2.28
Sat Jan 31 2004 08:32, Askold Volkov wrote to Dima Orlov:
 
 DO>> А, тогда понятно. Hепонятно только почему в ide, уже если ее сделали,
 DO>> не внести все крыжики.

 AV> Точно ответить могут только авторы, я же могу только высказать свои
 AV> догадки.
 
 IARовцы тусуются в comp.embedded и активно отвечают на всякие вопросы
 почему и отчего.
 
 VLV

"Evil will prevail because good is dumb" (c) Space Balls


Re: AVR ADC & IAR2.28
Привет, 31 января 2004 г., 8:32:59, ты писал(а):

AV> Точно ответить могут только авторы, я же могу только высказать свои
AV> догадки.
AV> Во-первых, это свежая опция, возможно ее просто не успели внести в IDE к
AV> моменту его выпуска. Во-вторых IARовцы очень долго сопротивлялись ее
AV> введению, считая идеологически неправильной, и сделали это только под
AV> давлением пользователей. И действительно - включение этой опции
AV> противоречит
AV> стандарту языка.

Это еще каким местом противоречит ?

Всего хорошего.





--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: AVR ADC & IAR2.28
    Всем привет!

Alexey Krasnov писал к Askold Volkov Sat, 31 Jan 2004 10:13:41 +0000 (UTC):

 AV>> Точно ответить могут только авторы, я же могу только высказать свои
 AV>> догадки.
 AV>> Во-первых, это свежая опция, возможно ее просто не успели внести в IDE
 AV>> к моменту его выпуска. Во-вторых IARовцы очень долго сопротивлялись ее
 AV>> введению, считая идеологически неправильной, и сделали это только под
 AV>> давлением пользователей. И действительно - включение этой опции
 AV>> противоречит
 AV>> стандарту языка.

 AK> Это еще каким местом противоречит ?

противоречит тем местом, что по стандарту С строковый литерал - это char*, а
если он лежит во flash, это уже не char*, а "char __flash *" и передавать
его функции, имеющей параметр типа char* нельзя. Не пойму, правда, что
помешало IARовцам автоматически выбирать нужный тип в зависимости от
контекста.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /



AVR ADC & IAR2.28
* Crossposted in My_Mail
Привет, Dima!

Однажды, Thursday January 29 2004 20:23, Dima Orlov писал к All:

 DO> Hello, All !

 DO> Hаписал (собственно перетащил из другого проекта) я вот такой вот код
 DO> (ниже). Один раз вызывается init_ADC(), потом например по прерыванию
 DO> от таймера раз в миллисекунду вызывается get_ad(), который
 DO> последовательно канал за каналом (по одному на вызов) опрашивает АЦП и
 DO> заполняет массив ad_res[] отфильтрованными значениями медленно
 DO> меняющихся величин. Вопрос в том, что почему-то без помеченых
 DO> "??????????" действий значения оказываются сдвинутыми на 1. То есть по
 DO> нулевому индексу значение последнего канала, по первому - нулевого, ну
 DO> и так далее. Это я смотрю и не вижу чего-то очевидного, аппаратная
 DO> особенность (не похоже) или ошибка при компиляции (тоже не похоже). Я
 DO> почесал в голове и продолжил дальше работать, задача не перенести на
 DO> Mega32L программу, а освоить средства разработки перед началом работы
 DO> с новым атмеловским кристаллом, которая начнется как только будут
 DO> улажены юридические формальности, но вопрос остался.

 DO> Заодно и еще один вопрос. Как сказать компилятору в IDE чтобы он код
 DO> вида puts("Hello, World!"); не компилировал как константную строку в
 DO> ПЗУ и указатель на нее в ОЗУ.

[skip]

 DO> void get_ad()
 DO> {
 DO> #ifdef LPF
 DO>  word ad_tmp_w;

 DO>  ADCSRA |= (1<<ADSC);  //Start ADC
 DO>  while ((ADCSRA & (1<<ADSC)) == 1);
 ADSC != 0 (по крайней мере в mege128), ты просто не дожидаешся окончания
измерения а считываешь предыдущее измеренное значение


Пока.

                                                   E-Mail : snipped-for-privacy@box.vsi.ru

AVR ADC & IAR2.28
Hello, Michael Bobrov !

 >  DO>  ADCSRA |= (1<<ADSC);  //Start ADC
 >  DO>  while ((ADCSRA & (1<<ADSC)) == 1);
 >  ADSC != 0 (по крайней мере в mege128), ты просто не дожидаешся
 > окончания измерения а считываешь предыдущее измеренное значение

А вот это похоже на правду, послезавтра проверю, tnx.

С уважением, Дима Орлов.


Site Timeline