Автор Тема: режим FREE ADC в атмеге8  (Прочитано 13695 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
режим FREE ADC в атмеге8
« : 08 Мая 2013, 19:09:33 »
0
пытался подружить ацп, крутящийся в режиме FREE, с переключением входов "на лету".
Что-то ничего у меня не выходит.
Без переключения входов - выходит.
С переключением - тоже выходит, но только в SINGLE
Может я что-то недопонял? ??? ??? ???

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: режим FREE ADC в атмеге8
« Ответ #1 : 09 Мая 2013, 02:12:01 »
0
Сергей, а что именно не выходит? По шаблону: делаю так, хочу получить это, получаю то.

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
Re: режим FREE ADC в атмеге8
« Ответ #2 : 09 Мая 2013, 09:12:21 »
0
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: ???
« Последнее редактирование: 09 Мая 2013, 09:17:44 от lgedmitry »

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: режим FREE ADC в атмеге8
« Ответ #3 : 09 Мая 2013, 10:50:13 »
0
нет ли в строках типа 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

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
Re: режим FREE ADC в атмеге8
« Ответ #4 : 09 Мая 2013, 11:00:05 »
0
blindman, ёпсель-мопсель, Андрей, ну и лажанулся я :wall: :wall: :wall:  :%): :%): :%): :%): :%):
Спасибо огромное, буду исправлять :v: :v: :v:

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 798
  • Репутация: 13
  • Андрей
  • Поблагодарили: +18
Re: режим FREE ADC в атмеге8
« Ответ #5 : 09 Мая 2013, 11:10:06 »
0
И еще
Let Nomer = Nomer + 1
If Nomer > 1 Then Let Nomer = 0


В данном случае эквивалентно
Let Nomer = Nomer XOR 1
но с XOR быстрее

Оффлайн khvilon

  • Старожил
  • *****
  • Сообщений: 1698
  • Репутация: 16
  • женя, дер.кожухово, обращаться на ты
  • Поблагодарили: +146
Re: режим FREE ADC в атмеге8
« Ответ #6 : 09 Мая 2013, 11:11:15 »
0
Кллассическая школа!

Оффлайн lgedmitry

  • Старожил
  • *****
  • Сообщений: 4621
  • Репутация: 30
  • Сергей, Рыбинск
  • Поблагодарили: +701
Re: режим FREE ADC в атмеге8
« Ответ #7 : 09 Мая 2013, 11:33:41 »
0
И еще
Let Nomer = Nomer + 1
If Nomer > 1 Then Let Nomer = 0


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

Оффлайн hippo64

  • Читаю форум
  • *****
  • Сообщений: 7135
  • Репутация: 72
  • Владимир
  • Поблагодарили: +5153
Re: режим FREE ADC в атмеге8
« Ответ #8 : 12 Мая 2013, 07:58:07 »
0
Аккуратнее надо, штандартенфюрер (С)

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

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
13277 Просмотров
Последний ответ 12 Декабря 2010, 08:54:26
от tim
32 Ответов
22703 Просмотров
Последний ответ 30 Декабря 2012, 19:33:42
от TANk
5 Ответов
10555 Просмотров
Последний ответ 07 Июля 2013, 20:33:12
от MetalHeart
10 Ответов
12591 Просмотров
Последний ответ 28 Февраля 2017, 07:35:51
от dm34
7 Ответов
6243 Просмотров
Последний ответ 04 Марта 2021, 17:18:33
от Revelator