|
Ну совсем детский вопрос по АЦП, запрет-разрешение прерывания |
|
|
|
 |
Ответов
(1 - 14)
|
Apr 17 2010, 11:14
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 17 2010, 11:21
|

Гуру
     
Группа: Участник
Сообщений: 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)
|
|
|
|
|
Apr 17 2010, 11:52
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 17 2010, 19:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать. Запрет прерывания понадобился в другом прерывании. Точнее в прерывании SPI работающим в Slave-режиме и принимающем длинную колбасу данных. Во время приема проц не может надолго отвлекаться (иначе потеряет байты). Но за время приема всей колбасы он может терять несколько символов принимаемых по USART-у. В результате в прерывании SPI понадобилось временно запретить все прерывания кроме USART-а, а затем в не критичных местах глобально разрешить прерывания (по сути только USART). По поводу "зачем вообще по прерыванию" - еще проще. АЦП меряет некоторые величины влияющие на работу всей, достаточно разветвленной программы. Устанавливать в каждом цикле еще и процедуру обработки АЦП - лишний код и тормоза в цикле. Цитата ADCSRA=10000xxx; - запрет прерывания ADCSRA=10001xxx;- разрешение прерывний. И ничего нигде не испортится. Вот хорошо-бы кабы так... Смущает бит ADSC . В режиме одиночного преобразование преобразование начинается по первому наростающему фронту тактовой АЦП при установленном ADSC . По моему если вдруг нечаянно сбросить бит ADSC между его установкой и первым фронтом (тактовая проца в несколько раз выше тактовой АЦП), то преобразование может вообще не начаться. А если установить после его прекращения, то оно начнется заново (а с учетом уже стоящего флага - результат может быть весьма хреновый)... К тому-же тут еще и вопрос - а что станется с текущим преобразованием если во время его сбросить ADSC ? ЗЫ. Зря тему перенесли в раздел "для начинающих". Несмотря на кажущуюся простоту вопрос ДАЛЕКО не так прост...
|
|
|
|
|
Apr 17 2010, 21:41
|

Профессионал
    
Группа: Свой
Сообщений: 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. ответить сможет только тот кто перенёс тему  З.Ы Цитата(ArtemKAD @ Apr 18 2010, 00:06)  Запрет прерывания понадобился в другом прерывании. Не понадобится , при входе в любое прерывание флаг I регистра SREG сбрасывается, все прерывания запрещены. Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания. Но судя по всему Вам это как раз и нужно что бы не потерять USART.
Сообщение отредактировал ILYAUL - Apr 17 2010, 22:05
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 19 2010, 07:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания. .... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по SPI), ошибка приема данных в SPI гарантирована. Мне надо разрешать не все прерывания, а только одно конкретное! Цитата если Вы таки попадёте, то ёк , преобразования не будет. Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования.  Цитата Ну , это надо ещё умудриться попасть , максимально такой промежуток - один период тактовой частоты АЦП. Период тактовой АЦП - 8 мкс. При основной 0,125 мкс (8МГц) это 64 исполненные команды. Если учесть, что преобразование запускается по окончании прерывания АЦП, умудриться - запросто! Цитата А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП. Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой? ADSRA=10000ххх
|
|
|
|
|
Apr 19 2010, 07:52
|

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

|
Цитата(ArtemKAD @ Apr 19 2010, 11:37)  .... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по SPI), ошибка приема данных в SPI гарантирована. Мне надо разрешать не все прерывания, а только одно конкретное! Ну эта проблема решаема . Без глобального разрешения прерываний Вам всё равно не куда дется , так уж устроен процессор. Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI. Кстати , приоритет обработки тоже существует , может и не придётся отключать лишние. Цитата(ArtemKAD @ Apr 19 2010, 11:37)  Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования.  ! Ну это понятно , не будет преобразования , не будет и прерывания. Цитата(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 измерений , как бог на душу положит. Нет логики .
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 19 2010, 08:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI. Именно это и делал. И в процессе этого наткнулся на необходимость запрета прерывания АЦП. Маску которого Atmel не пожелал вынести в отдельный регистр из-за чего задача получилась неоднозначной. Цитата Честно , говоря я не нашёл инфы по этому поводу , но скорее всего ничего не будет. Вот и я не нашел. Того и спрашиваю - вдруг кто уже с подобным сталкивался. ЗЫ. А то недавно столкнулся с тем, что цикл АЦП запускается даже при выключенном ADSC - командой Sleep (Idle).
|
|
|
|
|
Apr 19 2010, 09:59
|

Профессионал
    
Группа: Свой
Сообщений: 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;- разрешение прерывний. И ничего нигде не испортится.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|