Клуб DiyAudio

Разное и полезное => Микроконтроллеры и их программирование => Тема начата: lgedmitry от 08 Мая 2013, 19:09:33

Название: режим FREE ADC в атмеге8
Отправлено: lgedmitry от 08 Мая 2013, 19:09:33
пытался подружить ацп, крутящийся в режиме FREE, с переключением входов "на лету".
Что-то ничего у меня не выходит.
Без переключения входов - выходит.
С переключением - тоже выходит, но только в SINGLE
Может я что-то недопонял? ??? ??? ???
Название: Re: режим FREE ADC в атмеге8
Отправлено: blindman от 09 Мая 2013, 02:12:01
Сергей, а что именно не выходит? По шаблону: делаю так, хочу получить это, получаю то.
Название: Re: режим FREE ADC в атмеге8
Отправлено: lgedmitry от 09 Мая 2013, 09:12:21
blindman, кхе-кхе, Андрей, тут так всего много. Попробую всё прям в виде программы изложить ;-[

$regfile = "m8def.dat"
$crystal = 8000000
.....
Config Adc = Free , Prescaler = 128 , Reference = Avcc      'тут были первые мои грабли. С прерываниями прога висела. Ценой бессонной ночи было придумано сделать АЦП помедленнее. Тогда всё заработало
'Очень быстрый АЦП тут не нужен. Нужно, чтоб основное тело программы крутилось максимально быстро.
Enable Adc                                                  'Разрешить АЦП
Start Adc
Adcsra.6 = 1
.....
On Adc Adc_isr
Let Admux = Admux And &B11111100       'включаю нулевой канальчик для начала (а может только думаю, что включаю, а он сам по себе уже включен)
.....
Dim _adc As Word
Dim _adcl As Byte At _adc + 0 Overlay                       'чей-то гениальный подход. Слямзил внаглую. Сам бы никогда не додумался
Dim _adch As Byte At _adc + 1 Overlay
.....
Do
.....
Loop
.....
Adc_isr:                                                    'прерывание от ацп

_adcl = Adcl                                                'очень хитрый ход с оверлейной переменной я стырил с какого-то форума
_adch = Adch                                                'сам бы вжисть до такого не додумался. Я и слов-то таких не слыхал ни разу
Let Nomerr = Nomer + 1
Let A(nomerr) = _adc                                        'массив А(1) А(2) - это переменные, куда надо записывать данные замеров с каналов 0 и 1 АЦП

   Let Nomer = Nomer + 1                                    ' отчего-то нумерация элементов массива с нуля у меня не пошла, отсюда и дурацкие лишние переменные
   If Nomer > 1 Then Let Nomer = 0
   Let Admux = Admux And &B11111100                         'вот без этих двух строчек переключения каналов АЦП всё прекрасно работает
   Let Admux = Admux And Nomer                                   'но без них - неинтересно, ибо только один канал меряется


Return

и добавил...
зы Я вот ещё думаю, а нет ли в строках типа Let Admux = Admux And &B11111100 какой ошибки синтаксической? ;-[ :d_know: ???
Название: Re: режим FREE ADC в атмеге8
Отправлено: blindman от 09 Мая 2013, 10:50:13
нет ли в строках типа Let Admux = Admux And &B11111100 какой ошибки синтаксической?
Синтаксической ошибки нет. Но налицо ошибка в использовании оператора AND. Разберем подробно.

Config Adc = Free , Prescaler = 128 , Reference = Avcc
В результате этой директивы в регистре ADMUX  будет 01000000 - AVCC  в качестве опоры, активен нулевой канал.

Let Admux = Admux And &B11111100
Очищаются 2 млаших бита ADMUX

Let Admux = Admux And Nomer
А вот и опа. Nomer содержит либо 0, либо 1. То есть гарантированно очищаются 7 старших разрядов ADMUX. А в младшем и так уже ноль в результате предыдущей строчки. И получается, что АЦП всегда подключен к нулевому каналу. И к тому же в качестве опоры вывод AREF.

Правильно будет синие строчки вот так записать:
Let Admux = (Admux And &B11111110) OR Nomer
Nomer должен быть гарантированно или 0, или 1. Иначе.. ну ты понял  ;)
Название: Re: режим FREE ADC в атмеге8
Отправлено: lgedmitry от 09 Мая 2013, 11:00:05
blindman, ёпсель-мопсель, Андрей, ну и лажанулся я :wall: :wall: :wall:  :%): :%): :%): :%): :%):
Спасибо огромное, буду исправлять :v: :v: :v:
Название: Re: режим FREE ADC в атмеге8
Отправлено: blindman от 09 Мая 2013, 11:10:06
И еще
Let Nomer = Nomer + 1
If Nomer > 1 Then Let Nomer = 0


В данном случае эквивалентно
Let Nomer = Nomer XOR 1
но с XOR быстрее
Название: Re: режим FREE ADC в атмеге8
Отправлено: khvilon от 09 Мая 2013, 11:11:15
Кллассическая школа!
Название: Re: режим FREE ADC в атмеге8
Отправлено: lgedmitry от 09 Мая 2013, 11:33:41
И еще
Let Nomer = Nomer + 1
If Nomer > 1 Then Let Nomer = 0


В данном случае эквивалентно
Let Nomer = Nomer XOR 1
но с XOR быстрее
Вот чесслово, Андрей, зуб даю. Эта мысля про "исключающее или" у меня в голове уже мелькала. Не далее, как вчера. А не реализовал её только потому, что надеюсь, что если в результате обкатки программы в железе она покажет достаточное быстродействие, то каналов измерения будет не 2, а 4. А уж если не покажет - ХОР туда точно придёт, а оставшимися каналами займётся кто-то другой ;) (Может даже и не атмега, там задача попроще, но это уже за рамками нашего обсуждения)
зы. поменял ЭНД на ОР. Усё работает теперь :yah: :yah: :yah: :yah: :yah:
Название: Re: режим FREE ADC в атмеге8
Отправлено: hippo64 от 12 Мая 2013, 07:58:07
Аккуратнее надо, штандартенфюрер (С)

Друзья, я испытываю личную неприязнь к хитромудрым приемам (хотя у учителя было отчество Адикович и фамилия Агранович  :laugh:) . Сначало пишу тупо в лоб с длинным текстом, не гнушаясь синтаксических повторов (ибо по моим наблюдениям длинная по тексту программулина быстрее работает  :d_know:), а ежели уж программной памяти не хватает, тогда можно и повыкобениваться.