|
mega88PA и АЦП в Free Running mode, проблема с измерениями |
|
|
|
Apr 18 2011, 04:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
в режиме одиночного преобразования АЦП выдает нормальные значения, а после переделки проги на постоянное преобразование (пока не запретишь) получаю FF. прерывания АЦП выкл. опора АЦП от встроенного в мк опорника 1.1В делаю так: __disable_interrupt(); установки АЦП: ADMUX = (1<<REFS0)|(1<<REFS1)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(1<<ADLAR); ADCSRA =(1<<ADEN)|(1<<ADPS0)|(0<<ADPS1)|(0<<ADPS2); //|(1<<ADATE) //2for1MHz 001 ADCSRB = (0<<ACME)&(0<<ADTS2)&(0<<ADTS1)&(0<<ADTS0); задержка на устаканивание: for (unsigned char z=0; z<10; z++){ __delay_cycles(350000/8/10*F_MHZ); // WATCHDOG_RESET;} SETBIT(DDRB, 6); // для отладки ножкой буду дрыгать SETBIT (ADCSRA, _ADC_Start); // запускаю АЦП ADC_CONTROL_auto(); // Жду результата // unsigned char ADC_CONTROL_auto(void) { SETBIT(PORTB, 6); // Çàïóñê ÀÖ ïðåîáðàçîâàíèÿ; while( !TSTBIT(ADCSRA, _ADC_Flag)); // Îæèäàíèå ôëàãà ïðåðûâàíèÿ - îêîí÷àíèÿ ïðåîáðàçîâàíèÿ; CLRBIT(PORTB, 6); return ADCH; // ×òåíèå ðåçóëüòàòà ïðåîáðàçîâàíèÿ; } // // И делаю выборку значеий for (char j = 0; j <_NUMB_OF_MEG; j++) { res_of_meg[j] = ADC_CONTROL_auto(); // Ìàññèâ èçìåðåííîãî çíà÷åíèÿ êàëèáðîâêè // } выключаю АЦП ADCSRA = 0<<ADEN; переделывал на одиночные режим работы - все ок. сигнал меняю - отчеты идут нормальные, а так FF только есть errata но она при вкл. компоратора (я его использую в др. части проги), а я перед каждым использованием АЦП конфигурю АЦП. что у меня с "лыжами"? почему не едут?
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Apr 20 2011, 10:02
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (arttab @ Apr 20 2011, 10:56)  получилось при такой инициализации: 1) Совершенно непонятно, зачем взводить ADATE отдельной командной. 2) Чтение ADCL излишне. QUOTE Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH. 3) А ADIF вы все же не сбрасываете. Что получилось в результате - непонятно, но явно не то, чего вы ожидатете. QUOTE ADIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag. Ну и запуск преобразования происходит совсем не в том месте, где стоит соответствующий комментарий.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 20 2011, 14:45
|
Группа: Новичок
Сообщений: 4
Регистрация: 30-03-11
Пользователь №: 64 000

|
arttab !!! ИЗВИНИ !!! что в твоей теме вопрос задаю, но..
У меня проблема с АЦП на девайсе ATmega328P. Не запускаются непрерывные преобразования АЦП, ни free running, ни от Timer0 Overflow. Одиночные, это пожалуста.
Инициализировал так:
ldi r16, (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0) ldi r17, (0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0) ldi r18, (1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
sts ADMUX, r16 sts ADCSRB, r17 sts ADCSRA, r18
Первое преобразование запускал так:
lds r16, ADCSRA sbr r16, (1<<ADSC) sts ADCSRA, r16
Первое преобразование заканчивается, вызывается обработчик прерывания АЦП, флаг прерывания АЦП сбрасывается аппаратно и ... все больше обработчик по окончании нового преробразования не вызывается, а следовательно новое преобразование и не запускается автоматически.
Что делать?
|
|
|
|
|
Apr 20 2011, 16:21
|
Группа: Новичок
Сообщений: 4
Регистрация: 30-03-11
Пользователь №: 64 000

|
=GM= хорошо, попробую
Пока выход такой .. в обработчике прерывания о таймера (Timer0 Overflow) вручную запускаю новое преобразование установкой бита ADSC.
Сообщение отредактировал Index - Apr 20 2011, 16:21
|
|
|
|
|
Apr 20 2011, 16:46
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 19-07-06
Пользователь №: 18 920

|
Инициализация АЦП для меги 644: Код adcinit:
; REFS1=1 REFS0=1 (Internal 2.56V Voltage Reference with external capacitor at AREF pin), ADLAR=1(Left), MUX = 0 ldi temp, (1<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0) sts ADMUX, temp
; ADEN=1(ADCenable), ADSC=1(Start), ADATE=1(Auto Trigger Enable) ADPS: 010 (/4; 5 mHz) ldi temp,(1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADPS2) | (1<<ADPS1) | (0 <<ADPS0) sts ADCSRA, temp
ldi temp, 0b01000000; Free Running mode sts ADCSRB, temp
ldi temp, 0b10000000; Digital Input Disable sts DIDR0, temp
ret Взято из рабочего проекта. Free Running. Результат забирается командой lds temp, ADCH. Готовность Ацп не проверяется - просто задержка NOP.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|