Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Mad-man
запарился уже с ацп
работает только первый цикл (сразу после включения питания) - результат в ADCL - правильный
при повторных преобразованиях (после первого цикла) бит ADSC сбрасывается как и при завершении конвертации (что и ожидаемо) но в в регистре ADCL - стабильно первый результат преобразования

может помимо бита ADSC нужно еще что-то передергивать для начала конвертации???




void ADC_StartConversion() { ADCSRA = (1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); }

inline char ADC_CheckDone() { return !(ADCSRA & (1<<ADSC)); }

void Init_ADC()
{
ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
ADCSRA = (1<<ADEN) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
SFIOR=0x00;
}




int main()
{
PORTA = 0b00000000;
DDRA = 0b00000000;

Send_UART("\r\n\r\n\r\n");
Send_UART("New proba\r\n");

while (1)
{
ADC_StartConversion();

_delay_ms(100);

if (ADC_CheckDone())
{
ADC_val = ADCL;
Print_ADC();
Send_UART("\r\n");
}
else
{
Send_UART("Timeout\r\n");
}


_delay_ms(5000);
}
}
V_N
Цитата
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADSC)); }

Кажется мне вы погорячились
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADIF)); }
Mad-man
Цитата(V_N @ Apr 1 2010, 16:02) *
Кажется мне вы погорячились
nline char ADC_CheckDone() { return !(ADCSRA & (1<<ADIF)); }


хмммм

понял что вы имеете ввиду
попробую
smac
Цитата(Mad-man @ Apr 1 2010, 16:28) *
запарился уже с ацп...

Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся. Подробности в даташите.
Mad-man
Цитата(smac @ Apr 1 2010, 22:31) *
Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся. Подробности в даташите.



Ура 1111493779.gif Оно заработало!!!!
Да, проглядел в даташите важный абзац....

Спасибо laughing.gif
777777
Цитата(smac @ Apr 1 2010, 23:31) *
Весь код не смотрел, но по-моему Вы ADCH не вычитываете, что нужно делать обязательно, иначе регистры ADCH:ADCL не обновятся.

А чтобы их прочитать, надо написать

ADC_val = ADC;

Просто ADC без L или H - компилятор на это генерирует чтение слова в нужном порядке. Ну и разумеется ADC_val должно быть int16_t
Если же 10 разрядов не требуется, а достаточно 8, то нужно установить бит ADLAR: ADC Left Adjust Result и считывать только ADCH читать только старший байт без младшего разрешается.

ЗЫ. А зачем там _delay_ms(100) если все равно проверяется готовность АЦП?
Mad-man
Цитата(777777 @ Apr 2 2010, 14:41) *
А зачем там _delay_ms(100) если все равно проверяется готовность АЦП?

_delay_ms(100) я выставил чтобы не сыпались таймауты. Хотя для моих частот (3,5Мгц c делителем 128) должно было хватить задержки 5мс
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.