реклама на сайте
подробности

 
 
> Выбор канала АЦП
Ich
сообщение Jan 30 2007, 23:16
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 12-05-05
Пользователь №: 4 962



Всем доброго времени суток!
Столкнулся с проблемой.... Пишу программу которая изменяет напряжение (в двух точках) и выводит ее на экран из 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


Заранее благодарен...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
SasaVitebsk
сообщение Jan 31 2007, 00:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Тактм образом м/у началом измерения и съёмом результата проходит не 15 тактов, а одно прерывание.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2007, 01:59
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



http://electronix.ru/forum/index.php?showtopic=26373
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 31 2007, 02:45
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



>>По прерыванию таймера выбираю первый канал (в моем случае 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

И курите даташиты внимательнее...
Go to the top of the page
 
+Quote Post
Ich
сообщение Jan 31 2007, 11:00
Сообщение #5





Группа: Новичок
Сообщений: 8
Регистрация: 12-05-05
Пользователь №: 4 962



Спасибо всем! cheers.gif Исправил... Заработало! biggrin.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016