artemkad 69 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать. Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Не подскажет ли кто такую мелочь. Надо в процессе работы сперва запретить прерывание АЦП, а затем его разрешить. Естественно не трогая биты флага и не перезапуская преобразование. Не подскажет ли кто как это совсем правильно сделать. Проц - AtMega48 . Смущает - все биты в перемешку в ADCSRA и просто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние... Не очень понятно. В каком режиме работает АЦП? И на чём пишите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 7 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Скорее всего, ADSC=ADIF=0, остальные флаги считать из регистра ADCSRA перед записью Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба росто устанавливая/сбрасывая бит можно там цеплять в т.ч. и соседние... А вы не трогайте соседние. Запись нуля в шестой бит безвредна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 (изменено) · Жалоба А вы не трогайте соседние. Запись нуля в шестой бит безвредна. 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-ого Изменено 17 апреля, 2010 пользователем ILYAUL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 (изменено) · Жалоба Cкорее не совсем так, вот что по этому поводу пишет DS Да вот как раз именно так. Биты сбрасываются записью 1. Ноль не оказывает никакого значения. А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать. ADCSRA=10000xxx; - запрет прерывания ADCSRA=10001xxx;- разрешение прерывний. И ничего нигде не испортится. Единственное, надо посмотреть - не потеряет ли контроллер прерываний прерывание, если преобразование закончится во время запрета прерываний. Судя по схеме - не должен. Флаг ADIF и ADIE работают параллельно (по и). Изменено 17 апреля, 2010 пользователем DpInRock Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 (изменено) · Жалоба А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать. Я думаю , только в случае отложенного прерывания, когда по каким- то причинам его надо пропустить, а потом обработать, но тогда можно сбрасывать ADIF - запоминать , что он был установлен и затем обрабатывать. При работе в режиме одиночного преобразования, это вполне возможно , результат преобразования не изменяется Да вот как раз именно так. Вот , что получилось , после того как я просто модифицировал рабочий код Первая картинка , инит АЦП, вторая - я убрал всё , кроме записи в бит ADCS т.е все биты сбросились в ноль, хотя просто модифицировал бит . Но его конечно не возможно поймать в 1 Изменено 17 апреля, 2010 пользователем ILYAUL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 · Жалоба Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 · Жалоба Значит так. Выбросьте это на помойку. И пользуйтесь нормальными средствами контроля. Что именно , работающий проект. Или AVRStudio. Интерсно , что сможет поймать ADСS , если после установки этого бита , он сбрасывается аппаратно по окончанию преобразования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 17 апреля, 2010 Опубликовано 17 апреля, 2010 · Жалоба А вот зачем это делать - запрещать прерывания АЦП - это другой вопрос. Спрашивается, зачем тогда по прерыванию вообще работать. Запрет прерывания понадобился в другом прерывании. Точнее в прерывании SPI работающим в Slave-режиме и принимающем длинную колбасу данных. Во время приема проц не может надолго отвлекаться (иначе потеряет байты). Но за время приема всей колбасы он может терять несколько символов принимаемых по USART-у. В результате в прерывании SPI понадобилось временно запретить все прерывания кроме USART-а, а затем в не критичных местах глобально разрешить прерывания (по сути только USART). По поводу "зачем вообще по прерыванию" - еще проще. АЦП меряет некоторые величины влияющие на работу всей, достаточно разветвленной программы. Устанавливать в каждом цикле еще и процедуру обработки АЦП - лишний код и тормоза в цикле. ADCSRA=10000xxx; - запрет прерывания ADCSRA=10001xxx;- разрешение прерывний. И ничего нигде не испортится. Вот хорошо-бы кабы так... Смущает бит ADSC . В режиме одиночного преобразование преобразование начинается по первому наростающему фронту тактовой АЦП при установленном ADSC . По моему если вдруг нечаянно сбросить бит ADSC между его установкой и первым фронтом (тактовая проца в несколько раз выше тактовой АЦП), то преобразование может вообще не начаться. А если установить после его прекращения, то оно начнется заново (а с учетом уже стоящего флага - результат может быть весьма хреновый)... К тому-же тут еще и вопрос - а что станется с текущим преобразованием если во время его сбросить ADSC ? ЗЫ. Зря тему перенесли в раздел "для начинающих". Несмотря на кажущуюся простоту вопрос ДАЛЕКО не так прост... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 17 апреля, 2010 Опубликовано 17 апреля, 2010 (изменено) · Жалоба .... По моему если вдруг нечаянно сбросить бит ADSC между его установкой и первым фронтом (тактовая проца в несколько раз выше тактовой АЦП), то преобразование может вообще не начаться. Ну , это надо ещё умудриться попасть , максимально такой промежуток - один период тактовой частоты АЦП. Но судя по диаграммам, если Вы таки попадёте, то ёк , преобразования не будет. Так как этот бит должен "стоять" всё время преобразования. А если установить после его прекращения, то оно начнется заново (а с учетом уже стоящего флага - результат может быть весьма хреновый)... К тому-же тут еще и вопрос - а что станется с текущим преобразованием если во время его сбросить ADSC ? Ну тут , уж как напишите обработку, После преобразования у Вас опять есть, максимум, всё тот же период , когда начнётся новое преобразование , но и + 13 периодов всё той же частоты АЦП. А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП. На P.S. ответить сможет только тот кто перенёс тему З.Ы Запрет прерывания понадобился в другом прерывании. Не понадобится , при входе в любое прерывание флаг I регистра SREG сбрасывается, все прерывания запрещены. Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания. Но судя по всему Вам это как раз и нужно что бы не потерять USART. Изменено 17 апреля, 2010 пользователем ILYAUL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 19 апреля, 2010 Опубликовано 19 апреля, 2010 · Жалоба Что бы обработать какое либо вложенное прерывание надо дать команду SEI- разрешить прерывания. .... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по SPI), ошибка приема данных в SPI гарантирована. Мне надо разрешать не все прерывания, а только одно конкретное! если Вы таки попадёте, то ёк , преобразования не будет. Не только преобразования, но и прерывания. А по сути - цикл опроса АЦП остановится, что намного хуже простого отсутствия преобразования. :( Ну , это надо ещё умудриться попасть , максимально такой промежуток - один период тактовой частоты АЦП. Период тактовой АЦП - 8 мкс. При основной 0,125 мкс (8МГц) это 64 исполненные команды. Если учесть, что преобразование запускается по окончании прерывания АЦП, умудриться - запросто! А ADSC сбрасывается сам , в конце преобразования , максимум на 14-й период АЦП. Понятно, что сам сбрасывается. Но что будет если его сбросить вручную командой? ADSRA=10000ххх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 19 апреля, 2010 Опубликовано 19 апреля, 2010 · Жалоба .... и получить обработку всех разрешенных на тот момент прерываний. С учетом того, что длительность обработки некоторых прерываний достаточно велика (больше одного символа по 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 измерений , как бог на душу положит. Нет логики . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 19 апреля, 2010 Опубликовано 19 апреля, 2010 · Жалоба Но он предоставляет выбор , с какими прерываниями Вы хотите работать , не нужные можно отключить , просто запретив их в регистрах и оставить разрешения для USART и SPI. Именно это и делал. И в процессе этого наткнулся на необходимость запрета прерывания АЦП. Маску которого Atmel не пожелал вынести в отдельный регистр из-за чего задача получилась неоднозначной. Честно , говоря я не нашёл инфы по этому поводу , но скорее всего ничего не будет. Вот и я не нашел. Того и спрашиваю - вдруг кто уже с подобным сталкивался. ЗЫ. А то недавно столкнулся с тем, что цикл АЦП запускается даже при выключенном ADSC - командой Sleep (Idle). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 19 апреля, 2010 Опубликовано 19 апреля, 2010 · Жалоба ЗЫ. А то недавно столкнулся с тем, что цикл АЦП запускается даже при выключенном ADSC - командой Sleep (Idle). Так это для ADC стандартный режим. Команда Sleep , автоматом выставляет ADSC , если ADC включён . И в регистре отвечающим за режим сна стоит разрешение входить в режим сна. И DpInRock Вам дал ответ на вопрос как наложить маску , что бы ничего не испротить, если Вы пишите на СИ .... ADCSRA=10000xxx; - запрет прерывания ADCSRA=10001xxx;- разрешение прерывний. И ничего нигде не испортится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться