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

 
 
> Ну совсем детский вопрос по АЦП, запрет-разрешение прерывания
ArtemKAD
сообщение Apr 16 2010, 19:47
Сообщение #1


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.
Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
ILYAUL
сообщение Apr 16 2010, 21:08
Сообщение #2


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

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



Цитата(ArtemKAD @ Apr 17 2010, 00:02) *
Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.
Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

Не очень понятно. В каком режиме работает АЦП? И на чём пишите?


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
V_G
сообщение Apr 16 2010, 23:36
Сообщение #3


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

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



Скорее всего, ADSC=ADIF=0, остальные флаги считать из регистра ADCSRA перед записью
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 16 2010, 23:37
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
росто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

А вы не трогайте соседние. Запись нуля в шестой бит безвредна.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 17 2010, 11:14
Сообщение #5


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

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



Цитата(DpInRock @ Apr 17 2010, 03:52) *
А вы не трогайте соседние. Запись нуля в шестой бит безвредна.

Cкорее не совсем так, вот что по этому поводу пишет DS
...Alternatively, ADIF is cleared by writing a logical one to the flag. Beware that if doing a Read-Modify-
Write on ADCSRA, a pending interrupt can be disabled. This also applies if the SBI and CBI
instructions are used.
Альтернативно, ADIF сбрасывается записью логической единицы в флаг. Помните, что если делаете Чтение-Модификация-Запись ADCSRA прерывания могут быть отключены.
Это также применимо если используются SBI и CBI комманды"

Я бы поступил так
ldi temp,1<<ADEN|0<<ADIE|1<<ADPS2|1<<ADPS1|1<<ADPS0
sts или in ADCSRA,temp
ldi temp,1<<ADEN|1<<ADIE|1<<ADPS2|1<<ADPS1|1<<ADPS0
sts или in ADCSRA,temp
Не смотрел , в какой области регистр для 48-ого

Сообщение отредактировал ILYAUL - Apr 17 2010, 11:15


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 17 2010, 11:21
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
Cкорее не совсем так, вот что по этому поводу пишет DS

Да вот как раз именно так.
Биты сбрасываются записью 1. Ноль не оказывает никакого значения.
А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать.
ADCSRA=10000xxx; - запрет прерывания
ADCSRA=10001xxx;- разрешение прерывний.
И ничего нигде не испортится.
Единственное, надо посмотреть - не потеряет ли контроллер прерываний прерывание, если преобразование закончится во время запрета прерываний.
Судя по схеме - не должен. Флаг ADIF и ADIE работают параллельно (по и).

Сообщение отредактировал DpInRock - Apr 17 2010, 11:27


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 17 2010, 11:52
Сообщение #7


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

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



Цитата(DpInRock @ Apr 17 2010, 15:36) *
А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать.

Я думаю , только в случае отложенного прерывания, когда по каким- то причинам его надо пропустить, а потом обработать, но тогда можно сбрасывать ADIF - запоминать , что он был установлен и затем обрабатывать.
При работе в режиме одиночного преобразования, это вполне возможно , результат преобразования не изменяется

Цитата(DpInRock @ Apr 17 2010, 15:36) *
Да вот как раз именно так.

Вот , что получилось , после того как я просто модифицировал рабочий код
Первая картинка , инит АЦП, вторая - я убрал всё , кроме записи в бит ADCS т.е все биты сбросились в ноль, хотя просто модифицировал бит . Но его конечно не возможно поймать в 1

Сообщение отредактировал ILYAUL - Apr 17 2010, 11:55


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 17 2010, 13:21
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 17 2010, 13:39
Сообщение #9


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

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



Цитата(DpInRock @ Apr 17 2010, 17:36) *
Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля.

Что именно , работающий проект. Или AVRStudio. Интерсно , что сможет поймать ADСS , если после установки этого бита , он сбрасывается аппаратно по окончанию преобразования?


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Apr 17 2010, 19:51
Сообщение #10


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать.

Запрет прерывания понадобился в другом прерывании. Точнее в прерывании SPI работающим в Slave-режиме и принимающем длинную колбасу данных. Во время приема проц не может надолго отвлекаться (иначе потеряет байты). Но за время приема всей колбасы он может терять несколько символов принимаемых по USART-у.
В результате в прерывании SPI понадобилось временно запретить все прерывания кроме USART-а, а затем в не критичных местах глобально разрешить прерывания (по сути только USART).

По поводу "зачем вообще по прерыванию" - еще проще. АЦП меряет некоторые величины влияющие на работу всей, достаточно разветвленной программы. Устанавливать в каждом цикле еще и процедуру обработки АЦП - лишний код и тормоза в цикле.
Цитата
ADCSRA=10000xxx; - запрет прерывания
ADCSRA=10001xxx;- разрешение прерывний.
И ничего нигде не испортится.

Вот хорошо-бы кабы так... Смущает бит ADSC . В режиме одиночного преобразование преобразование начинается по первому наростающему фронту тактовой АЦП при установленном ADSC . По моему если вдруг нечаянно сбросить бит ADSC между его установкой и первым фронтом (тактовая проца в несколько раз выше тактовой АЦП), то преобразование может вообще не начаться. А если установить после его прекращения, то оно начнется заново (а с учетом уже стоящего флага - результат может быть весьма хреновый)... К тому-же тут еще и вопрос - а что станется с текущим преобразованием если во время его сбросить ADSC ?

ЗЫ. Зря тему перенесли в раздел "для начинающих". Несмотря на кажущуюся простоту вопрос ДАЛЕКО не так прост...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 17 2010, 21:41
Сообщение #11


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

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



Цитата(ArtemKAD @ Apr 18 2010, 00:06) *
.... По моему если вдруг нечаянно сбросить бит ADSC между его установкой и первым фронтом (тактовая проца в несколько раз выше тактовой АЦП), то преобразование может вообще не начаться.

Ну , это надо ещё умудриться попасть , максимально такой промежуток - один период тактовой частоты АЦП. Но судя по диаграммам, если Вы таки попадёте, то ёк , преобразования не будет. Так как этот бит должен "стоять" всё время преобразования.

Цитата(ArtemKAD @ Apr 18 2010, 00:06) *
А если установить после его прекращения, то оно начнется заново (а с учетом уже стоящего флага - результат может быть весьма хреновый)... К тому-же тут еще и вопрос - а что станется с текущим преобразованием если во время его сбросить ADSC ?

Ну тут , уж как напишите обработку, После преобразования у Вас опять есть, максимум, всё тот же период , когда начнётся новое преобразование , но и + 13 периодов всё той же частоты АЦП. А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП.

На P.S. ответить сможет только тот кто перенёс тему blush.gif

З.Ы
Цитата(ArtemKAD @ Apr 18 2010, 00:06) *
Запрет прерывания понадобился в другом прерывании.


Не понадобится , при входе в любое прерывание флаг I регистра SREG сбрасывается, все прерывания запрещены. Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания. Но судя по всему Вам это как раз и нужно что бы не потерять USART.

Сообщение отредактировал ILYAUL - Apr 17 2010, 22:05


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Apr 19 2010, 07:22
Сообщение #12


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания.

.... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по SPI), ошибка приема данных в SPI гарантирована.
Мне надо разрешать не все прерывания, а только одно конкретное!
Цитата
если Вы таки попадёте, то ёк , преобразования не будет.

Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования. sad.gif
Цитата
Ну , это надо ещё умудриться попасть , максимально такой промежуток - один период тактовой частоты АЦП.

Период тактовой АЦП - 8 мкс. При основной 0,125 мкс (8МГц) это 64 исполненные команды. Если учесть, что преобразование запускается по окончании прерывания АЦП, умудриться - запросто!
Цитата
А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП.

Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой?
ADSRA=10000ххх
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 19 2010, 07:52
Сообщение #13


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

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



Цитата(ArtemKAD @ Apr 19 2010, 11:37) *
.... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по SPI), ошибка приема данных в SPI гарантирована.
Мне надо разрешать не все прерывания, а только одно конкретное!


Ну эта проблема решаема . Без глобального разрешения прерываний Вам всё равно не куда дется , так уж устроен процессор. Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI. Кстати , приоритет обработки тоже существует , может и не придётся отключать лишние.

Цитата(ArtemKAD @ Apr 19 2010, 11:37) *
Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования. sad.gif !


Ну это понятно , не будет преобразования , не будет и прерывания.

Цитата(ArtemKAD @ Apr 19 2010, 11:37) *
Период тактовой АЦП - 8 мкс. При основной 0,125 мкс (8МГц) это 64 исполненные команды. Если учесть, что преобразование запускается по окончании прерывания АЦП, умудриться - запросто! !


Так давайте разберём последовательность 1. Вкл. преобразование 2. Оно само по себе идёт 3. Закончилось -выставляется ADIF. 4. Запускается обработчик прерывания , который элементарно состоит из 4 команд , считать данные с регистров ADC и запихнуть ( например в память SRAM) , + увеличить адрес SRAM ну и команды сохранения в стеке и выталкивания из стека. Всё вы снова в основной программе , хотите запустите снова преобразование , не хотите подождите. Это если в одиночном режиме. Будет время посмотрите SRAM ,что он у Вас там на преобразовал и примите решение.

Цитата(ArtemKAD @ Apr 19 2010, 11:37) *
Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой?
ADSRA=10000ххх

Честно , говоря я не нашёл инфы по этому поводу , но скорее всего ничего не будет. Если преобразование началось т.е. Вы дали на это добро , то дядьки из Atmel думаю просто фронтом тактового сигнала защёлкнули это разрешение , что бы по окончанию преобразования его самим и сбросить. Не логично было бы оставлять возможность сброса , и что бы мы тогда бы получили в конце - 2, 3 , 4.. разряда АЦП т.е. вместо 1024 измерений , как бог на душу положит. Нет логики .


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Apr 19 2010, 08:40
Сообщение #14


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI.

Именно это и делал. И в процессе этого наткнулся на необходимость запрета прерывания АЦП. Маску которого Atmel не пожелал вынести в отдельный регистр из-за чего задача получилась неоднозначной.
Цитата
Честно , говоря я не нашёл инфы по этому поводу , но скорее всего ничего не будет.

Вот и я не нашел. Того и спрашиваю - вдруг кто уже с подобным сталкивался.
ЗЫ. А то недавно столкнулся с тем, что цикл АЦП запускается даже при выключенном ADSC - командой Sleep (Idle).
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 19 2010, 09:59
Сообщение #15


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

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



Цитата(ArtemKAD @ Apr 19 2010, 12:55) *
ЗЫ. А то недавно столкнулся с тем, что цикл АЦП запускается даже при выключенном ADSC - командой Sleep (Idle).

Так это для ADC стандартный режим. Команда Sleep , автоматом выставляет ADSC , если ADC включён . И в регистре отвечающим за режим сна стоит разрешение входить в режим сна.


И DpInRock Вам дал ответ на вопрос как наложить маску , что бы ничего не испротить, если Вы пишите на СИ

....
ADCSRA=10000xxx; - запрет прерывания
ADCSRA=10001xxx;- разрешение прерывний.
И ничего нигде не испортится.


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

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

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

 


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


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