Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ну совсем детский вопрос по АЦП
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ArtemKAD
Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.
Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...
ILYAUL
Цитата(ArtemKAD @ Apr 17 2010, 00:02) *
Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.
Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

Не очень понятно. В каком режиме работает АЦП? И на чём пишите?
V_G
Скорее всего, ADSC=ADIF=0, остальные флаги считать из регистра ADCSRA перед записью
DpInRock
Цитата
росто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

А вы не трогайте соседние. Запись нуля в шестой бит безвредна.
ILYAUL
Цитата(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-ого
DpInRock
Цитата
Cкорее не совсем так, вот что по этому поводу пишет DS

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

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

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

Вот , что получилось , после того как я просто модифицировал рабочий код
Первая картинка , инит АЦП, вторая - я убрал всё , кроме записи в бит ADCS т.е все биты сбросились в ноль, хотя просто модифицировал бит . Но его конечно не возможно поймать в 1
DpInRock
Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля.
ILYAUL
Цитата(DpInRock @ Apr 17 2010, 17:36) *
Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля.

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

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

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

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

ЗЫ. Зря тему перенесли в раздел "для начинающих". Несмотря на кажущуюся простоту вопрос ДАЛЕКО не так прост...
ILYAUL
Цитата(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.
ArtemKAD
Цитата
Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания.

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

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

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

Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой?
ADSRA=10000ххх
ILYAUL
Цитата(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 измерений , как бог на душу положит. Нет логики .
ArtemKAD
Цитата
Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI.

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

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

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


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

....
ADCSRA=10000xxx; - запрет прерывания
ADCSRA=10001xxx;- разрешение прерывний.
И ничего нигде не испортится.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.