Master » 24 ноя 2008, 16:39
Есть такой регистр ADMUX
компилятор CVavr походу сразу создает дефайн в который записывает 0
- Код: Выделить всё • Развернуть
#define ADC_VREF_TYPE 0x00
а затем приравниеват ADMUX
- Код: Выделить всё • Развернуть
ADMUX=ADC_VREF_TYPE;
А мне нужно делать измериния не только на ADC0, но и на ADC1 я так понимаю что мне нужно изменять значения битов 0-4, так вот как мне лучше их изменить используя битовую маску?
Вот так буит правильно:
Измерения на ADC0
ADMUX=ADMUX & 0000000
0Измерения на ADC1
ADMUX=ADMUX | 0000000
1
Vooon » 24 ноя 2008, 18:15
ЕМНИП cv делает ф-цию read_adc(channel)
в которой делают ADMUX = ADC_VREF_TYPE | channel;
rig » 25 ноя 2008, 08:17
Master, есть же мастер, хорошее подспорье
для 32й меги:
- Код: Выделить всё • Развернуть
#define FIRST_ADC_INPUT 5 // миниботовские АЦП опрашиваю так
#define LAST_ADC_INPUT 7 // входы PORTA5-7
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; // тут будет лежать результат измерения
#define ADC_VREF_TYPE 0xC0 // относительно чего оцифровывать ( вн. источник 2,56V)
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
adc_data[input_index]=ADCW; // Read the AD conversion result
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff) )+input_index; // собственно ответ на ввопрос
delay_us(10); // Delay needed for the stabilization of the ADC input voltage
ADCSRA|=0x40; // Start the AD conversion
}
кодевижен 2
Master » 25 ноя 2008, 12:47
Спсб, как работает до конца ниасилил, но уже работает.
rig » 25 ноя 2008, 12:54
аналогично, больно уж мудрен этот англицкий даташит.
пару научных тыков и почему то работает
Vooon » 26 ноя 2008, 00:22
Я не видел код инициализации, но думаю что там указано прерывание по завершению преобразования.
В прерывании записывается результат в массив, за тем меняем канал, ждем, запускаем преобразование снова и выходим из обработчика.