Код: Выделить всё
CB(DDR_ADC,PIN_ADC);
ADMUX=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR)|(0<<ADATE);
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
ADCSRA|=(1<<ADSC);
Код: Выделить всё
CB(DDR_ADC,PIN_ADC);
ADMUX=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR)|(0<<ADATE);
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
ADCSRA|=(1<<ADSC);
Pika4u писал(а):Код: Выделить всё
ADMUX=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR)|(0<<ADATE);
AaNnDdRrEeYy писал(а):для АЦП нужно опорное напряжение, так сказать линейка по которой мерить
задается битами REFS1 REFS0
у тебя нули а это значит Internal Vref turned off
Код: Выделить всё
while(1)
{
ADCSRA|=(1<<ADSC);
}
Код: Выделить всё
unsigned short voltage_in=0,voltage=0;
unsigned char count_adc;//Количество отсчетов для АЦП
void adc_init()//Функция инициализации АЦП
{
CB(DDR_ADC,PIN_ADC);
ADMUX|=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(1<<REFS0)|(1<<REFS1)|(1<<ADLAR)|(0<<ADATE);
SFIOR|=(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0);
ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
ADCSRA|=(1<<ADSC);//Делаем первый отсчет
}
void Start_ADC_Convert()
{
ADCSRA|=(1<<ADSC);
}
void ADC_Result()
{
if(count_adc==5)//Если сделали 5 замеров напряжения
{
voltage_in=voltage;
count_adc=0;//Обнуляем кол-во замеров
voltage=0;//Обнуляем переменную для суммирования
}
Код: Выделить всё
#pragma vector =ADC_vect//Прерывание по завершению преобразования напряжения
__interrupt void ADC_vector(void)
{
voltage+=ADCH;//Для большей точности накапливаем измерения
count_adc++;//Сделано еще одно преобразование
}
__Alexander писал(а):Если опорное берется с AREF, то в REFS0 и REFS1 должны быть нули.
__Alexander писал(а):второе, где результат из ADCL?
__Alexander писал(а):и третье, вы накапливаете пять раз...
if(count_adc==5)//Если сделали 5 замеров напряжения
{
voltage_in=voltage;
count_adc=0;//Обнуляем кол-во замеров
voltage=0;//Обнуляем переменную для суммирования
}
а делить на пять потом кто будет?
AaNnDdRrEeYy писал(а):нет должно быть так REFS1 =0 REFS0=1
__Alexander писал(а):второе, где результат из ADCL?
AaNnDdRrEeYy писал(а):у него ADLAR = 1, ADCL не нужен, его можно просто отбросить.
AaNnDdRrEeYy писал(а):проблема в том что число в ADCH не меняется, даже если не делить то сумма то должна меняться, просто она будет в пять раз больше.
AaNnDdRrEeYy писал(а):не существующий бит (0<<ADATE) в ADMUX он все равно в 0 устанавливает.
Vov123 писал(а):С какого перепугу в регистре ADMUX 9 бит?
Pika4u писал(а): И еще,я уже писал,что почему-то на REFS ему пофиг
Код: Выделить всё
CB(DDR_ADC,PIN_ADC);Код: Выделить всё
#define DDR_ADC DDRA
#define PIN_ADC 0
Pika4u писал(а):Сейчас поотправлял значения регистров-все биты ставятся,все нормально,но все равно-даже при работе от внутреннего ИОН все то же значение.....