Всем привет.
Как можно переключаться между каналами АЦП? К примеру, мне необходимо:
сделать преобразование, прочитать один канал (Vbg), затем опять сделать преобразование и прочитать канал ADC0.
Выкладываю код, переключения между каналами не происходит.
Код
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000
int i, flag, t;
void main(void)
{
DDRA |= (1 << 1)|(1 << 2)|(1 << 6)|(1 << 7); // Инициализация светодиодов
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Установка частоты преобразования 125KHz
ADCSRA |= (1 << ADEN); // Вкл. АЦП
ADCSRA |= (1 << ADIE); // Разрешение прерывания от компаратора
sei();
for(;;)
{
flag = 1;
ADMUX |= (1 << 1)|(1 << 2)|(1 << 3)|(1 << 4); // Выбор входного канала АЦП - Vbg
ADCSRA |= (1 << ADSC); // Запуск преобразования
flag = 0;
ADMUX |= 0; // Выбор входного канала АЦП - ADC0
ADCSRA |= (1 << ADSC); // Запуск преобразования
}
}
//********************************************************************************//
ISR(ADC_vect)
{
if (flag == 1)
{
i = ADCL; // Чтение младших 8 битов первыми
i += (int)ADCH << 8; // Чтение старших 2 битов, умножение их на 256 и сложение с мл. б.
if (i < 255)
{
// Питание контроллера падает
_delay_ms(200);
PORTA |= (1 << 6);
_delay_ms(200);
PORTA &= ~(1 << 6);
}
}
if (flag == 0)
{
t = ADCL; // Чтение младших 8 битов первыми
t += (int)ADCH << 8; // Чтение старших 2 битов, умножение их на 256 и сложение с мл. б.
if (t < 830)
{
_delay_ms(200);
PORTA |= (1 << 1);
_delay_ms(200);
PORTA &= ~(1 << 1);
}
else
{
_delay_ms(200);
PORTA |= (1 << 2);
_delay_ms(200);
PORTA &= ~(1 << 2);
}
}
}
Не знаю, необходим ли reti из прерывания?