реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Флаг ADIF регистра ADCSRA-в АЦП ATmega8-непонятно
serj32
сообщение Sep 27 2013, 14:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Здравствуйте.Вот если перевести АЦП в непрерывный режим флаг ADIF установится сразу после окончания преобразования,но непонятно когда он сбросится , а ведь на очереди очередное преобразование.
Этот флаг необходимо програмно сбрасывать ,чтобы увидеть очередное преобразование.В даташите не увидел ответа.Благодарю всех ответившим.
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 27 2013, 14:56
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



он сбросится аппаратно в момент перехода на обработчик прерывания


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
serj32
сообщение Sep 27 2013, 15:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Цитата(ARV @ Sep 27 2013, 18:56) *
он сбросится аппаратно в момент перехода на обработчик прерывания

Спасибо понятно.А можно ли считывать результат АЦП в любое время (Режим непрерывного преобразования) при считывании результата АЦП
ну вначале младший ADCL затем ADCH, при считывании младшего старший будет заблокирован пока и он не будет прочитан.И мне не надо ожидать окончания преобразования просто устройство примитивное-индикатор на 8 светодиодов.Для обучения.Спасибо.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Sep 27 2013, 15:38
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



В том экземпляре даташита, что есть у меня, в описании флага ADIF сказано:
Alternatively, ADIF is cleared by writing a logical one to the flag.
А в непрерывном режиме без использования прерываний можете спокойно читать из регистра ADC в любое время sm.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 27 2013, 18:57
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



для обучения лучше делать правильно, а не "как-нибудь". считывать ADC до завершения преобразования все равно что определять время по компасу - оно то, конечно, можно, но бессмысленно...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
serj32
сообщение Sep 27 2013, 20:33
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Цитата(ARV @ Sep 27 2013, 22:57) *
для обучения лучше делать правильно, а не "как-нибудь". считывать ADC до завершения преобразования все равно что определять время по компасу - оно то, конечно, можно, но бессмысленно...


А если так.Дождаться когда завершится преобразование-Флаг ADIF установится,далее програмно сбросим ADIF и "поработаем" со светодиодами потом снова на метку-("Дождаться когда завершится преобразование-Флаг ADIF установится")
Или по прерыванию от АЦП и уже обработчик прерывания будет зажигать светодиоды.
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 27 2013, 23:31
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Идея топикстартера корректно реализуема в atxmega, причем даже в многоканальном варианте. АЦП работает сам по себе в непрерывном режиме (и даже последовательно опрашивая каналы), а пользователь в произвольные моменты времени считывает специальные буферные регистры требуемого канала, в которых хранится последний результат преобразования по каналу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 28 2013, 06:55
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (serj32 @ Sep 27 2013, 22:33) *
А если так.Дождаться когда завершится преобразование-Флаг ADIF установится,далее програмно сбросим ADIF и "поработаем" со светодиодами
Именно так и нужно делать (если без прерываний). Или так: Проверили флаг ADIF, если он еще не установлен - пошли, недолго поделали что-нибудь полезное. Потом снова вернулись на проверку флага.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Sep 28 2013, 07:51
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(ARV @ Sep 27 2013, 22:57) *
для обучения лучше делать правильно, а не "как-нибудь". считывать ADC до завершения преобразования все равно что определять время по компасу - оно то, конечно, можно, но бессмысленно...

Для задачи топикстартера - вовсе не бессмысленно - читаем непрерывно, непрерывно индицируем, и нам пофигу, что мы 10 (100 или 1000) раз отобразили значение предыдущего измерения sm.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 28 2013, 13:30
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(RabidRabbit @ Sep 28 2013, 11:51) *
Для задачи топикстартера - вовсе не бессмысленно - читаем непрерывно, непрерывно индицируем, и нам пофигу, что мы 10 (100 или 1000) раз отобразили значение предыдущего измерения sm.gif

вы уверены, что считывая регистр ADC до завершения очередного преобразования мы получим результат предыдущего завершенного преобразования?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 28 2013, 21:03
Сообщение #11


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(V_G @ Sep 28 2013, 03:31) *
АЦП работает сам по себе в непрерывном режиме (и даже последовательно опрашивая каналы), а пользователь в произвольные моменты времени считывает специальные буферные регистры требуемого канала, в которых хранится последний результат преобразования по каналу.


Подскажите, пожалуйста, как называются эти "специальные буферные регистры"?
Кандидатов на эту роль вижу два:
ADCA.CH1.RES
ADCA.CH1RES
Который из?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 28 2013, 22:52
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Названия регистров различаются в Си и ассемблере (я из тех извращенцев, что предпочитают ассемблер). Тем не менее, указанные Вами регистры имеют разные адреса, и в этом заключается фишка (содержимое регистров одинаковое).
Конкретно, в ассемблерном варианте, адреса регистров, принадлежащих одному каналу:
ADCA_CH0_CTRL,
ADCA_CH0_MUXCTRL,
ADCA_CH0_INTCTRL,
ADCA_CH0_INTFLAGS,
ADCA_CH0_RES,
идут подряд друг за другом, позволяя организовать обращение к общему блоку регистров канала (например, через DMA).

С другой стороны, адреса регистров
ADCA_CH0RES,
ADCA_CH1RES,
ADCA_CH2RES,
ADCA_CH3RES
также идут последовательно, что позволяет организовать блоковое обращение к регистрам результата всех каналов.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 28 2013, 23:09
Сообщение #13


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(V_G @ Sep 29 2013, 02:52) *
Названия регистров различаются в Си и ассемблере (я из тех извращенцев, что предпочитают ассемблер). Тем не менее, указанные Вами регистры имеют разные адреса, и в этом заключается фишка (содержимое регистров одинаковое).
Конкретно, в ассемблерном варианте, адреса регистров, принадлежащих одному каналу:
...
ADCA_CH0_RES,
идут подряд друг за другом, позволяя организовать обращение к общему блоку регистров канала (например, через DMA).

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


Я не об этом спрашивала. Меня интересует, откуда брать готовые данные. Из ADCA_CH0_RES или из ADCA_CH0RES? Тем более, если, по вашим словам, это имена не синонимы, а "имеют разные адреса".
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 29 2013, 00:48
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Ну так я написал же, что содержимое регистров одинаковое. Откуда хотите, оттуда берите.
Этот вопрос я задавал еще в конце 2008 в техподдержку Атмела. Вот их ответ:

The two registers in ATxmega64A3def.inc (ADCA_CH0RES/ADCA_CH0_RES) are actually holding the same result from the ADC. The reason for having this is to enable easier C-code implementation.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Sep 29 2013, 11:50
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(ARV @ Sep 28 2013, 17:30) *
вы уверены, что считывая регистр ADC до завершения очередного преобразования мы получим результат предыдущего завершенного преобразования?

В случае с одним каналом - да, абсолютно уверен. А что, в регистрах ADC есть битовый флаг "данные в регистре ADC протухли и содержат случайный набор битов"?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 29 2013, 20:06
Сообщение #16


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(V_G @ Sep 29 2013, 04:48) *
Ну так я написал же, что содержимое регистров одинаковое. Откуда хотите, оттуда берите.


А! Так они оба буферные! А я-то по вашему рассказу решила, что один из них простой, а второй буферный. Вот и пыталась выяснить, который из них кто.

Так, значит, в любой момент времени я могу тот регистр прочитать (как двухбайтное слово) и никогда не может получиться так, что старший байт мне достанется от одного измерения, а младший от другого? Или я что-то должна сделать эдакое, чтобы оба байта гарантированно принадлежали одному измерению?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 29 2013, 23:25
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Для полноты картины почитайте параграф "Accessing 16-bits Registers" в мануале по xmeg'ам.
Коротко: при чтении сначала читайте младший байт, при этом в том же цикле старший байт будет занесен во временный регистр. Второй командой читайте старший байт, он будет считан из временного регистра. Перед чтением запретите прерывания, т.к. временный регистр на АЦП всего один, и в прерываниях могут быть команды доступа к 16-разрядным регистрам, которые испортят содержимое временного. Этот регистр доступен и сам по себе, называется ADCA_TEMP.

Эта тема - одна из причин, почему я предпочитаю ассемблер. Сишные программисты редко лезут в такие дебри.
Была одна небольшая задачка (реализация ЧМ детектора на TigerSharс), которую я для теста написал на Си, чтобы не углубляться в архитектуру. Все быстро заработало, но для боевого применения в многоканальных системах обработки данных предпочту asm-реализацию с полным доступом ко всем вкусностям архитектуры TigerSharс. Хотя, возможно, такое возможно и на чистом Си, но с обязательным учетом особенностей аппаратной архитектуры.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Sep 30 2013, 00:31
Сообщение #18


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(V_G @ Sep 30 2013, 03:25) *
Коротко: при чтении сначала читайте младший байт, при этом в том же цикле старший байт будет занесен во временный регистр. Второй командой читайте старший байт, он будет считан из временного регистра.

Но на C чтение двухбайтового значения именно так и происходит:
Код
// ADC_data = ADCA.CH1.RES;
LDS     R16, 556
LDS     R17, (556+1)
...
Я бы и на ассемблере короче не написала.

Цитата(V_G @ Sep 30 2013, 03:25) *
Перед чтением запретите прерывания, т.к. временный регистр на АЦП всего один, и в прерываниях могут быть команды доступа к 16-разрядным регистрам, которые испортят содержимое временного. Этот регистр доступен и сам по себе, называется ADCA_TEMP.

А вот это непонятно. Почему команды доступа к 16-разрядным регистрам в прерываниях должны портить именно ADCA_TEMP? А если они к АЦП никак не относятся (скажем, это 16-разрядный регистр таймера), то содержимое ADCA_TEMP тоже будет угроблено? Или вы имели в виду только обращения к 16-разрядным регистрам других каналов АЦП?

На счет запрета прерывания тоже имею вопрос: годится ли вместо пары STI/CLI запись CCP=0xD8, или protected IO register не может быть в этом деле помощником? Говорят, что он на 4 такта работу блокирует, там может быть этого хватит?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 30 2013, 02:14
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Xenia @ Sep 30 2013, 10:31) *
Почему команды доступа к 16-разрядным регистрам в прерываниях должны портить именно ADCA_TEMP? А если они к АЦП никак не относятся (скажем, это 16-разрядный регистр таймера), то содержимое ADCA_TEMP тоже будет угроблено? Или вы имели в виду только обращения к 16-разрядным регистрам других каналов АЦП?

Если в прерываниях доступ к 16-разрядным регистрам AЦП не предполагается (или если само считывание идет в прерывании высокого приоритета), то можно и не запрещать прерывания, т.к. у других блоков свои временные регистры. Тем не менее, если процедуры других прерываний достаточно длинные, я бы запретил прерывания при чтении АЦП от греха подальше.

Цитата(Xenia @ Sep 30 2013, 10:31) *
На счет запрета прерывания тоже имею вопрос: годится ли вместо пары STI/CLI запись CCP=0xD8, или protected IO register не может быть в этом деле помощником? Говорят, что он на 4 такта работу блокирует, там может быть этого хватит?

Вроде особых противопоказаний нет, но надо смотреть, какой код сгенерирует компилятор (включая запись CCP). Тут где-то обсуждалось, что иногда вставляется что-то типа цепочки RJMP next_addr которые могут расходовать драгоценные защищенные циклы.
Go to the top of the page
 
+Quote Post
serj32
сообщение Oct 1 2013, 08:23
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Хотел бы уточнить по флагу ADIF регистра ADCSRA.Вот если сбросить ADIF -запишу лог.1 в 4 бит регистра ADCSRA и когда буду читать этот же бит следующей командой то будет считан уже лог.0-(будем считать ,что преобразование ещё не завершено).Правильны ли мои рассуждения ? Зараннее всем благодарен.
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 1 2013, 08:53
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Если преобразование еще не завершено, то и флаг ADIF не выставлен, будет читаться нулем хоть со сбросом, хоть без сброса.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Oct 1 2013, 09:58
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(serj32 @ Oct 1 2013, 12:23) *
Вот если сбросить ADIF -запишу лог.1 в 4 бит регистра ADCSRA и когда буду читать этот же бит следующей командой то будет считан уже лог.0-(будем считать ,что преобразование ещё не завершено).Правильны ли мои рассуждения ?

Да, совершенно верно.
Go to the top of the page
 
+Quote Post
serj32
сообщение Oct 1 2013, 12:03
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Цитата(V_G @ Oct 1 2013, 12:53) *
Если преобразование еще не завершено, то и флаг ADIF не выставлен, будет читаться нулем хоть со сбросом, хоть без сброса.

Вот если преобразование завершено то прочитав 4бит ADCSRA там будет лог.1 ,далее я записываю в этот бит лог.1 -значит этот бит я сбрасываю и уже следующей командой прочитав этот бит то там будет лог.0 и
завершение следующего преобразования установит в лог.1 этот бит(бит ADIF , 4 бит. регистра ADCSRA).Мне непонятно-вроде я записываю лог.1 ,а считываю оттуда лог.0

Сообщение отредактировал serj32 - Oct 1 2013, 12:12
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 1 2013, 12:26
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (serj32 @ Oct 1 2013, 14:03) *
Мне непонятно-вроде я записываю лог.1 ,а считываю оттуда лог.0
Это очень хорошая логика. Не конкретно в этом случае, а для регистров с многими флагами. Прочитав этот регистр, проанализировав и обработав выставленные флаги вы можете записать то считанное число обратно и сбросятся только те флаги, которые вы уже обработали. А флаги, которые взвелись после момента чтения останутся нетронутыми и вы сможете получить их при следующем чтении. Вы можете даже сразу записать считанное из регистра число обратно (сбросив выставленные флаги) и дальше работать со считанной копией. И уже к концу обработки в регистре флагов могут появиться те же флаги уже от нового события, вы их не потеряете и не затрете случайно. У AVR по такой логике сделаны все программно сбрасываемые флаги.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
serj32
сообщение Oct 1 2013, 14:17
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Цитата(V_G @ Oct 1 2013, 12:53) *
Если преобразование еще не завершено, то и флаг ADIF не выставлен, будет читаться нулем хоть со сбросом, хоть без сброса.

Ну а если предыдущие преобразования установили ADIF в лог.1 , а преобразование происходящее в настоящий момент ещё не закончено и сброса ADIF не происходило то в ADIF будет лог.1.Наверно будет так.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 1 2013, 14:41
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Повторю сказанное выше IDIF сбрасывается аппаратно (если работает прерывание) или ручками (если сами опрашиваете флаг).
При непрерывном преобразовании применять ручной опрос флага - ИМХО - нонсенс. Процу только и метаться туда сюда дабы не упустить момент готовности.Прерывание Вам в помощь
Однократное преобразование выставит флаг и будет ждать , когда Вы снова запустите преобразование. Вот тут IDIF можно и ручками посбрасывать.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 14:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01635 секунд с 7
ELECTRONIX ©2004-2016