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

 
 
> ATMega16 и АЦП, настройка
mr_onnik
сообщение Nov 6 2007, 20:15
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 3-11-07
Пользователь №: 32 020



Имеется МК Mega 163, на вход ADC0 (PA0) которого подается изменяющееся напряжение 0...5 В;
AVcc и AREF соединен с Vcc, AGND соединен с GND.

В CodeVisionAVR пишу такой код:
Код
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | 0xff;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSR|=0x40;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
ADCSR|=0x10;
return ADCW;
}

//настройки портов

void main(void)
{ int a = 0;

   while(1)
   {
    a = (int)read_adc;
    PORTC.6 = 1;
    delay_ms(a);
    PORTC = 0x00;
    }
}


в результате светодион на шестом выводе порта С постоянно мигает с частотой примерно 0,5с. Наверное, снимается показание с внутреннего источника опорного напряжения, которое составляет примерно половину 5В.

Что неправильно сделано? Как сделать, чтобы частота мигания светодиода менялась в зависимости от подаваемого напряжения на ADC0?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SergeiCh
сообщение Nov 7 2007, 09:03
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415



Цитата(mr_onnik @ Nov 7 2007, 03:15) *
a = (int)read_adc;
(int)read_adc; - это адрес функции (точка входа в функцию), приведенный к целому типу, а не вызов функции. Почитайте какую-нибудь книжку по Си.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 7 2007, 09:33
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(SergeiCh @ Nov 7 2007, 11:03) *
(int)read_adc; - это адрес функции (точка входа в функцию), приведенный к целому типу, а не вызов функции. Почитайте какую-нибудь книжку по Си.

Ну и почему бы сразу не посоветовать написать правильно?
Код
a = (int)read_adc(0);
Так ли уж необходимы нравоучения?
Go to the top of the page
 
+Quote Post
mr_onnik
сообщение Nov 7 2007, 10:09
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 3-11-07
Пользователь №: 32 020



Цитата(IgorKossak @ Nov 7 2007, 11:33) *
Ну и почему бы сразу не посоветовать написать правильно?
Код
a = (int)read_adc(0);
Так ли уж необходимы нравоучения?


Исправил. Светодиод вообще перестал мигать. Что в таком случае может содержаться в переменной read_adc? Бесконечность?
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 7 2007, 10:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(mr_onnik @ Nov 7 2007, 14:09) *
Исправил. Светодиод вообще перестал мигать. Что в таком случае может содержаться в переменной read_adc? Бесконечность?

Поскольку
Код
ADMUX=adc_input | 0xff;

то мультиплексор подключен к земле и в значении АЦП должен быть 0.
Функция delay_ms(a) поддерживает 0? Проверьте. Засандальте туда 0 втупую и посмотрите.
Go to the top of the page
 
+Quote Post
mr_onnik
сообщение Nov 7 2007, 10:55
Сообщение #6





Группа: Новичок
Сообщений: 6
Регистрация: 3-11-07
Пользователь №: 32 020



Цитата(oran-be @ Nov 7 2007, 12:36) *
Поскольку
Код
ADMUX=adc_input | 0xff;

то мультиплексор подключен к земле и в значении АЦП должен быть 0.
Функция delay_ms(a) поддерживает 0? Проверьте. Засандальте туда 0 втупую и посмотрите.


Засандалил. Никаких изменений, пока вообще не убрал строку a = read_adc(0);
Получается, что на ней МК зависает ( Когда убрал ее, при delay_ms(0) светодиод горит, значит, delay работает. Получается, неправильное преобразование.

P.S. А как указать вместо 0xFF адрес ADC0?

Цитата(SergeiCh @ Nov 7 2007, 12:48) *
Странно, что раньше он мигал. Вы выводите в порт 0, вызываете функцию read_adc, пока она выполняется, а выполняется она быстро smile.gif, у вас ноль, после опять выводится 1. Т.е. светодиод выключен (другой вывод светодиода не земле?) пока выполняется функция. А где порт настраивается на выход? Или это CV в стартап коде делает? Действительно совет, попробуйте вашу программу погонять в AVR Studio или другом каком симуляторе. Гораздо полезнее разобраться самому. Задача-то простая.


Подразумевается, что пауза между миганиями прямо пропорциональна подаваемому напряжению. Скажем, при 5В пауза будет около 1с, при 2,5 - 0,5с. Ведь, пока не будет выдержана пауза, АЦП не работает?
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 7 2007, 13:01
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(mr_onnik @ Nov 7 2007, 14:55) *
Засандалил. Никаких изменений, пока вообще не убрал строку a = read_adc(0);
Получается, что на ней МК зависает ( Когда убрал ее, при delay_ms(0) светодиод горит, значит, delay работает. Получается, неправильное преобразование.

P.S. А как указать вместо 0xFF адрес ADC0?

Зависать в функции контролле может только в одном месте - на цикле while. Типовой таракан, если неправильно скофигурировано железо и не высставляется флаг. Проверьте инициализацию АЦП.
З.Ы.
В строке
Код
ADMUX=adc_input | 0xff;

надо убрать операцию | 0xff, после которой, какой бы вы аргумент не передавали в функцию, в ADMUX все равно будет 0xff и мультиплексор будет подключен к земле.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- mr_onnik   ATMega16 и АЦП   Nov 6 2007, 20:15
- - mdmitry   Цитата(mr_onnik @ Nov 6 2007, 23:15) Имее...   Nov 6 2007, 21:49
- - oran-be   А это - так задумано? Код ADMUX=adc_input | 0xff;...   Nov 7 2007, 06:50
|- - mr_onnik   Цитата(oran-be @ Nov 7 2007, 08:50) ...   Nov 7 2007, 08:30
|||- - SergeiCh   Цитата(mr_onnik @ Nov 7 2007, 17:55) Подр...   Nov 7 2007, 11:44
||- - SergeiCh   Цитата(mr_onnik @ Nov 7 2007, 17:09) Испр...   Nov 7 2007, 10:48
|- - SergeiCh   Цитата(IgorKossak @ Nov 7 2007, 16:33) Та...   Nov 7 2007, 10:19
- - oran-be   Да - кто первый заметит слона?   Nov 7 2007, 10:05
- - GDI   Вот что хорошо в CV, так это мастер нового проекта...   Nov 7 2007, 12:22
- - singlskv   Цитата(mr_onnik @ Nov 6 2007, 23:15) .......   Nov 7 2007, 19:41
|- - mr_onnik   Цитата(singlskv @ Nov 7 2007, 21:41) Авто...   Nov 8 2007, 21:22
|- - singlskv   Цитата(mr_onnik @ Nov 9 2007, 00:22) Код/...   Nov 8 2007, 23:53
||- - mr_onnik   Цитата(singlskv @ Nov 9 2007, 01:53) А гд...   Nov 22 2007, 21:28
|- - SergeiCh   Цитата(mr_onnik @ Nov 9 2007, 04:22) Код#...   Nov 9 2007, 04:43
- - sergeeff Jr.   PWM организуй при помощи таймера...   Nov 8 2007, 22:15
- - mrKirill   Цитатаwhile (1) { a = read...   Nov 23 2007, 04:45
|- - Сергей Борщ   Цитата(mrKirill @ Nov 23 2007, 06:45) Есл...   Nov 23 2007, 10:25
|- - mrKirill   Цитата(Сергей Борщ @ Nov 23 2007, 16:25) ...   Nov 23 2007, 11:11
|- - Сергей Борщ   Цитата(mrKirill @ Nov 23 2007, 13:11) Есл...   Nov 23 2007, 11:26
- - defunct   Код#define ADC_CONTROL (1 << ADEN...   Nov 23 2007, 13:16
- - WHALE   defunct,в CV это не пройдет.Почему-то у него нет х...   Nov 23 2007, 15:14
- - defunct   Цитата(WHALE @ Nov 23 2007, 18:14) в CV э...   Nov 23 2007, 16:26


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:49
Рейтинг@Mail.ru


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