Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемма с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
_Diman_
Подскажите пожалуйста!
В Jtag программа останавливается на этом коде

unsigned int adc_rezult(unsigned char kanal){
unsigned char i;
unsigned int rez=0;

ADMUX=(ADMUX&(~0x1F))|kanal;
for( i=0 ; i<8 ; i++){
ADCSRA|=BIT(ADSC);
while ( !(ADCSRA & BIT(ADIF)) );// <- здесь
rez+=ADC;
}
return rez/8;
}
Причем не всегда. Может работать несколько минут.
Мк - mega16 частота 16мег. АЦП настроен так:
ADMUX=BIT(REFS1)|BIT(REFS0);//Internal 2.56V Voltage Reference with external capacitor at AREF pin
ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1)|BIT(ADPS0);

Ставил внутренний RC ген. На 8 мег. Работает без проблем. Но хотелось частоту повыше в устройстве есть dc/dc преобразователь. Подскажите, это из за частоты, или где-то все таки ошибся?

Сильных помех вроде нет, если измерять постоянную велечину то результат всегда одинаков.
Еще вопрос, может быть отладка останавливается при возникновении прерывания ADC?
defunct
Цитата(_Diman_ @ Sep 20 2006, 22:58) *
В Jtag программа останавливается на этом коде

вероятно уместнее было сказать - подвисает, а не останавливается, а то первое впечатление - что у вас проблема с точками останова возникла..

макрос BIT()
надо полагать такой:
#define BIT(value) (1 << (value))
т.к. если в нем нет скобочек, то условие на котором происходит "подвисание" может быть неверным..

по коду лучше делать так:
#define MUX_SETTINGS (1 <<REFS1)|(1 << REFS0)
#define ADC_SETTINGS (1 <<ADEN)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)

ADMUX = MUX_SETTINGS | channel; // <- подготовка
ADCSRA = ADC_SETTINGS | (1 << ADSC); // <-- старт (для уверенности в том, что ADEN установлен)

в начале программы не забудьте проинициализировать АЦП значением:
ADCSRA = ADC_SETTINGS;

Цитата
Еще вопрос, может быть отладка останавливается при возникновении прерывания ADC?

нет. Отсутсвие или наличие прерываний никак не влияет на точки останова.

PS: Если же вы самостоятельно не прерываете выполнение программы командой break (Ctrl-F5) и на указанной вами строчке нет точки останова - тогда ищите глюк в вашем JTAG адаптере.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.