Перейти к содержанию
    

Ну совсем детский вопрос по АЦП

Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.

Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать.

Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, ADSC=ADIF=0, остальные флаги считать из регистра ADCSRA перед записью

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да вот как раз именно так.

Биты сбрасываются записью 1. Ноль не оказывает никакого значения.

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

ADCSRA=10000xxx; - запрет прерывания

ADCSRA=10001xxx;- разрешение прерывний.

И ничего нигде не испортится.

Единственное, надо посмотреть - не потеряет ли контроллер прерываний прерывание, если преобразование закончится во время запрета прерываний.

Судя по схеме - не должен. Флаг ADIF и ADIE работают параллельно (по и).

Изменено пользователем DpInRock

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

При работе в режиме одиночного преобразования, это вполне возможно , результат преобразования не изменяется

 

Да вот как раз именно так.

Вот , что получилось , после того как я просто модифицировал рабочий код

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

Изменено пользователем ILYAUL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

ADCSRA=10000xxx; - запрет прерывания

ADCSRA=10001xxx;- разрешение прерывний.

И ничего нигде не испортится.

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

 

ЗЫ. Зря тему перенесли в раздел "для начинающих". Несмотря на кажущуюся простоту вопрос ДАЛЕКО не так прост...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

 

З.Ы

Запрет прерывания понадобился в другом прерывании.

 

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

Изменено пользователем ILYAUL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Мне надо разрешать не все прерывания, а только одно конкретное!

если Вы таки попадёте, то ёк , преобразования не будет.

Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования. :(

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

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

А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП.

Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой?

ADSRA=10000ххх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Мне надо разрешать не все прерывания, а только одно конкретное!

 

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

 

Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования. :( !

 

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

 

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

 

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

 

Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой?

ADSRA=10000ххх

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Честно , говоря я не нашёл инфы по этому поводу , но скорее всего ничего не будет.

Вот и я не нашел. Того и спрашиваю - вдруг кто уже с подобным сталкивался.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

 

....

ADCSRA=10000xxx; - запрет прерывания

ADCSRA=10001xxx;- разрешение прерывний.

И ничего нигде не испортится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...