Код: Выделить всё
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++;//Сделано еще одно преобразование
}
нет должно быть так REFS1 =0 REFS0=1__Alexander писал(а): Если опорное берется с AREF, то в REFS0 и REFS1 должны быть нули.
у него ADLAR = 1, ADCL не нужен, его можно просто отбросить.__Alexander писал(а): второе, где результат из ADCL?
проблема в том что число в ADCH не меняется, даже если не делить то сумма то должна меняться, просто она будет в пять раз больше.__Alexander писал(а): и третье, вы накапливаете пять раз...
if(count_adc==5)//Если сделали 5 замеров напряжения
{
voltage_in=voltage;
count_adc=0;//Обнуляем кол-во замеров
voltage=0;//Обнуляем переменную для суммирования
}
а делить на пять потом кто будет?
А давайте вы сейчас сделаете снимок страницы из документации, где вы вычитали этот бред.AaNnDdRrEeYy писал(а): нет должно быть так REFS1 =0 REFS0=1
__Alexander писал(а): второе, где результат из ADCL?
Конечно не нужен, т.к. число 1023 вполне умещается в один байт. )AaNnDdRrEeYy писал(а): у него ADLAR = 1, ADCL не нужен, его можно просто отбросить.
число меняется, аж от нуля до трёх. только никому не говорите.AaNnDdRrEeYy писал(а): проблема в том что число в ADCH не меняется, даже если не делить то сумма то должна меняться, просто она будет в пять раз больше.
мда. а откуда уверенность, что компилятор откинет именно этот бит? а я уверен что (0<<MUX0). Не?AaNnDdRrEeYy писал(а): не существующий бит (0<<ADATE) в ADMUX он все равно в 0 устанавливает.
Ага. Только на меге8 работало )))))))Vov123 писал(а): С какого перепугу в регистре ADMUX 9 бит?
Ясно что пофиг, пытаясь записать 9 бит... настройки не проходят. У вас в каждой строчке ошибка, что вы хотели.Pika4u писал(а): И еще,я уже писал,что почему-то на REFS ему пофиг
Код: Выделить всё
CB(DDR_ADC,PIN_ADC);Код: Выделить всё
#define DDR_ADC DDRA
#define PIN_ADC 0
давай весь код.Pika4u писал(а):Сейчас поотправлял значения регистров-все биты ставятся,все нормально,но все равно-даже при работе от внутреннего ИОН все то же значение.....