Разное и полезное > Микроконтроллеры и их программирование

режим FREE ADC в атмеге8

(1/2) > >>

lgedmitry:
пытался подружить ацп, крутящийся в режиме FREE, с переключением входов "на лету".
Что-то ничего у меня не выходит.
Без переключения входов - выходит.
С переключением - тоже выходит, но только в SINGLE
Может я что-то недопонял? ??? ??? ???

blindman:
Сергей, а что именно не выходит? По шаблону: делаю так, хочу получить это, получаю то.

lgedmitry:
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: ???

blindman:

--- Цитата: lgedmitry от 09 Мая 2013, 09:12:21 ---нет ли в строках типа 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. Иначе.. ну ты понял  ;)

lgedmitry:
blindman, ёпсель-мопсель, Андрей, ну и лажанулся я :wall: :wall: :wall:  :%): :%): :%): :%): :%):
Спасибо огромное, буду исправлять :v: :v: :v:

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии