Сообщение от Znamen
|
|
Т.е. как я понял чтобы постоянно работало преобразования нужно после оканчания преобразования опять устанавливать бит ADIF в 1? или как?
|
На ассме пишу, как говорят со словарем, но алгоритм работы с АЦП могу объяснить. При желании можно все выложить и в Протеусе (но на Си).
Инициализация АЦП
Первый способ.
1. Настроили порт на вход.
2. ADCSRA = (1 ‹‹ ADEN) | ADC_CONV_SP; - включили АЦП (ADEN) и установили предделитель (ADPS2, ADPS1, ADPS0) – скорость преобразования (переменная ADC_CONV_SP).
3. ADMUX = (1 ‹‹ REFS0) | (1 ‹‹ ADLAR) | ADC_CHANNEL; - опорное AVCC с внешним конденсатором на выводе AREF, выбрал выравнивание (ADLAR), выбор аналогового канала (MUX4, MUX3, MUX2, MUX1, MUX) (переменная ADC_CHANNEL).
4. ADCSRA |= (1 ‹‹ ADSC); запустил преобразование.
5. while(ADCSRA & (1 ‹‹ ADSC)); ждем окончания преобразования, если ADSC равно нулю, то выход из цикла.
6. Читаем ADCH.
Пункты 4, 5, 6 должны быть вставлены в программу там, где мы читаем АЦП. Для чтения АЦП они должны повторяться, так как указаны.
Я обычно делаю так, сразу читаю ADCH (естественно там ерунда), затем ADCSRA |= (1 ‹‹ ADSC); запустил преобразование и ушел на цикл программы (цикл ожидания не ставлю), просчитываю цикл программы так, чтобы следующее чтение ADCH дало правильный результат. Так и кручусь в цикле. Такой способ дает возможность не задерживаться в пустом цикле while. Мы как бы читаем с отставанием, но на практике это неважно.
В крайнем случае, ставлю проверку по if (ADCSRA & (1 ‹‹ ADSC) == 0) {var = ADCH; ADCSRA |= (1 ‹‹ ADSC);}
Другой способ это автоматическое преобразование.
Первым делом настраиваем таймер/счетчик 0 или 1 согласно опций регистра SFIOR.
Например, включаю таймер0 (установил предделитель).
TCCR0 &= 0xf8;
TCCR0 |= 0x05;
Затем все пункты такие же, только выбрасываем пункт 5, и добавляем
7. ADCSRA |= (1 ‹‹ ADATE); включили Auto Trigger.
8. SFIOR |=(1‹‹ADTS2); разрешили автопреобразование по переполнению таймера0.
Все. После этого в любом месте программы читаю ADCH (если 8 бит). Изменение данных в нем будет происходить с частотой переполнения таймера0 (в данном примере).
Последовательность настроек не догма, можно их менять (согласно дате, там есть нюансы).
Но если несколько каналов, то разумный способ первый (все пункты по порядку).