Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор канала АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Ich
Всем доброго времени суток!
Столкнулся с проблемой.... Пишу программу которая изменяет напряжение (в двух точках) и выводит ее на экран из 7-сегментных матриц. Т.е. мне нужно реализовать два канала для измерения... С одним каналом все работает без проблем, но не могу заставить его выводить значение с другого канала АЦП... По прерыванию таймера выбираю первый канал (в моем случае AD0) и запускаю преобразование АЦП, затем выбираю второй канал (AD3) и опять запускаю преобразование... Между запуском преобразования и считыванием результата выдерживаю 15 тактов. Но вот возникла проблема blink.gif результат воторого преобразования тот же самый что и первого angry.gif , т.е. как я понимаю либо не переключается канал АЦП либо не запускается второе преобразование... Помогите пожалуйста...Может я где ошибся? rolleyes.gif Очень надо. a14.gif Контройлер Mega 16. Шью понипрогом последним через STK 200.


clr temp
ldi temp,(1<<REFS0)
out ADMUX,temp
clr temp
ldi temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS2)+(1<<ADPS0)
out ADCSR,temp
nop
nop
....
nop
in YL,ADCL
in YH,ADCH
;=======================
clr temp
ldi temp,(1<<REFS0)+(1<<MUX1)+(1<<MUX0)
out ADMUX,temp
clr temp
ldi temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS2)+(1<<ADPS0)
out ADCSR,temp
nop
....
nop
in ZL,ADCL
in ZH,ADCH


Заранее благодарен...
SasaVitebsk
Если Вы будете делать следующим образом, то время измерения у вас увеличится, а время получения результата - сохранится.
Я делаю так.
1) прерывание по времени гарантировано больше двух (для запаса) циклов измерения.
2) Вкаждом прерывании
а) Сначала читаю результат
б) Выставляю новый канал
в) выхожу из прерывания.

Тактм образом м/у началом измерения и съёмом результата проходит не 15 тактов, а одно прерывание.
singlskv
>>По прерыванию таймера выбираю первый канал (в моем случае AD0) и запускаю преобразование

АЦП, затем выбираю второй канал (AD3) и опять запускаю преобразование...
Вы должны запускать преобразование на новом канале и сваливать из прерывания
Следующее прерывание будет с результатом

>> Между запуском преобразования и считыванием результата выдерживаю 15 тактов.

А почему именно 15 а не 25 ? типа больше чем 13,5 ?
Вы похоже не очень внимательно курили даташит
ADC clock это совсем не то же самое то XTAL frequency
вот это (1<<ADPS2)+(1<<ADPS0) в Ваших настройках говорит о том
что ADC clock = XTAL frequency / 32
то есть преобразование займет 432 такта (13,5*32)
собственно для этого и придумали прерывания от ADC
запустил его и когда преобразование закончилось попали в прерывание

Да и еще,
не нужно стирать регистр перед тем как в него записать
clr temp
ldi temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS2)+(1<<ADPS0)

оно и само как-нибудь перезапишется smile.gif

И курите даташиты внимательнее...
Ich
Спасибо всем! cheers.gif Исправил... Заработало! biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.