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

 
 
> АЦП ATmega8. Смена каналов ADMUX, Все ли верно делаю?
boban
сообщение Jul 20 2005, 07:17
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 13-04-05
Пользователь №: 4 090



Всем привет!

Первый раз работаю с ATmega8 в режиме чтения нескольких аналоговых сигналов.
Пишу в IARе...

Аналоговые входы: РС5 (28-я нога), РС3 (26-я нога), РС2 (25-я нога).
Кварц 11.0592 MHz

// инициализация АЦП
ADMUX = 0x03; // REFS1=REFS0=0 Uопорн на AREF
// MUX3..0=0011 вход на ножке PC3
ADCSR = 0x8F; // ADEN=1 ADC enable
// ADSC=0 запуск позже;
// ADIE=1 ADC interrupt enable
// ADPS2..0=111 Fosc/128 = 86,4кГц

Запускаю преобразование таймером каждые 10мс:
ADCSR_Bit6 = 1; // ADSC=1 старт АЦП

И вот собственно обработчик прерывания:
//Обработчик прерывания по завершению преобразования в АЦП
#pragma vector = ADC_vect
__interrupt void OnADCConversionComplete ()
{ unsigned int tmp, tmpH;

tmp = (unsigned int) ADCL;
tmpH = (unsigned int) ADCH; tmpH = tmpH << 8;
tmp = tmp + tmpH;
tmp = tmp >> 2;
// получаем результат в младших 8 битах

if (ADMUX == 0x03)
{ U26 = (unsigned char) tmp;
// в U26 - напряжение на 26-й ноге
ADMUX = 0x05;
}
else
{ if (ADMUX == 0x05)
{ U28 = (unsigned char) tmp;
// в U28 - напряжение на 28-й ноге
ADMUX = 0x02;
}
else
{ if (ADMUX == 0x02)
{ U25 = (unsigned char) tmp;
// в U25 - напряжение на 25-й ноге
ADMUX = 0x03;
}
}
}
[b]ADCSR_Bit6 = 0;
[/B] // ADSC=0 запрет АЦП
}


Вроде все просто, но есть подозрение, что что-то не так...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladislavS
сообщение Jul 20 2005, 14:24
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



IAR действительно позволяет ADC сразу считать.
Код
unsigned int tmp=ADC;


А вот так, например, у меня от таймера перебирает каналы:
Код
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0()
{
 static unsigned char adc_chanel=0;
 unsigned int value=ADC;
 switch(adc_chanel)
 {
   case 0:
     U0=value;
     adc_chanel++;
     break;
   case 1:
     U1=value;
     adc_chanel++;
     break;
   case 2:
     U2=value;
     adc_chanel++;
     break;
   case 3:
     U3=value;
    adc_chanel=6;
     break;
   case 6:
     U6=value;
     adc_chanel++;
     break;
   case 7:
     U7=value;
     adc_chanel=0;
     break;
 }
 //Запустим следующее преобразование
 ADMUX=adc_chanel;
 ADCSR|=(1<<ADSC);
}
Go to the top of the page
 
+Quote Post



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

 


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


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