Problem z ADC w ATmega8535

Feb 04, 2005 6 Replies

Witam ! Mam problem z pomiarem napiêæ na wej¶ciach PA0-PA7 w ATmega8535. Program banalny - zmierz napiêcie w jednym kanale, wy¶lij ADCH i ADCL przez UARTA i tak 200 razy. Niby podczas symulacji (kompilowane pod WinAVR i symulowane w VMLab dla ATmega16) wszystko jest OK. Natomiast w "¿ywym" uk³adzie (zaprogramowanym ju¿ po kompilacji pod ATmega8535, bo VMLab nie wspiera jeszcze ATmega8535) dostajê zawsze t± sam± warto¶æ, blisk± napiêciu odniesienia (0x3FF). U¿ywam wewnêtrznego ¼ród³a napiêcia odniesienia 2,56V, zewnêtrzny oscylator



12MHz, zasilanie +5V pod³±czone na Avcc, wy. Vref "wisi" - nie jest odsprzêgniête kondensatorem (ale to chyba nie grzech ? :-))). Sprawdza³em na kilku kana³ach i nic... Kod wyglada tak:

unsigned char uc; ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //preskaler 1:64 -> ADC clock 188kHz UBRRL=UBRRL_VALUE; sbi(UCSRB,TXEN); // w³±cz nadajnik UART sbi(UCSRB,RXEN); // w³±cz odbionik UART



for (uc=0;uc!=200;uc++) { ADMUX=0xC0; // pod³±cz kana³ 0ADC, Vref=2.56V ADCSRA|=(1<<ADSC); // rozpocznij konwersjê while(!(ADCSRA&0x10)); // i poczekaj na jej zakoñczenie loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania UDR=ADCH; loop_until_bit_is_set(UCSRA,UDRE); // czekaj na koniec nadawania UDR=ADCL; }



Czy port A nale¿y w jaki¶ specjalny sposób konfigurowaæ, gdy jest u¿ywany jako we. analogowe ? Wszelkie uwagi i sugestie mile widziane - równiez na priva: wkwj_et_gazeta.pl. zylex



Witam tak bez dalszej analizy przy okazji opisu pecela w EdW kiedys pisali ze dla adc trzeba obnizyc napiecie - nie moze byc 5V

nie wiem czy pomoze ale sprobuj, przejzyj pdf'a i moze jak mozesz art. o pecelu moze pomoze ;] pozdr. szogun

sgx <_no_spm_ snipped-for-privacy@bravonet.org napisał(a):

Tak , tylko to chodziło o AT90S8535 i o wewnętrzny zegarek(timer) napędzany zewnętrznym kwarcem 32768 kHz ,jeśli mnie pamięc nie myli ;-)

Piotrek

"Datasheet" Atmela do ATmega8535 mówi, ¿e:

- noga AVCC ma byæ pod³±czona do Vcc przez low-pass filter (stosujê sugerowane tam¿e rozwi±zanie 10uH + 100nF),

- napiêcie na AVCC nie mo¿e ró¿niæ siê od Vcc o wiêcej ni¿ +/-0.3V ( u mnie ró¿ni siê o 1mV) I tyle - nic o obni¿aniu napiêcia zasilania czê¶ci analogowej (a powiedzia³by, ¿e wprost przeciwnie :-). Czy nikt nie próbowa³ u¿ywaæ (i uda³o mu siê to !) ADC w ATmega8535 ??? zylex (wci±¿ poszukuj±cy rozwi±zania :-))))

W artykule <cu0a9k$7ee$ snipped-for-privacy@panorama.wcss.wroc.pl> autorem którego mieni się ZyLex, napisano:

Na Vref jest ok. 2.6V ?

W ATmedze128 (nie wiem, jak tu) ADIF pozostanie ustawiony i trzeba go skasować ręcznie:

ADCSRA |= 0x10;

W ogólności (dla free-run mode) lepiej odczytywać najpierw ADCL, a po nim ADCH, bo wtedy odczyt jest spójny (oba bajty pochodzą z tej samej konwersji).

Niestety powyższe uwagi IMO nie wyjaśniają Twojego problemu.

Bezpiecznie będzie ustawić jako wejścia.

hehe prawda ;) sorki za zamet ;] pozdro. szogun

No, problem "siê" rozwi±za³ po kilku nocnych godzinach:

- przesiad³em sie na ATmega16 (z innych powodów) - pocz±tkowo problem ten sam,

- wygl±da na to, ¿e OBOWI¡ZKOWO nale¿y czytaæ najpierw ADCL a potem ADCH nie tylko ze wzglêdu na mo¿liwo¶æ "korupcji" wyniku przy pracy "free run" ale ze wzglêdu na blokowanie dostepu do rejestrów ADCH i ADCL przy odczycie z ADCL (o czym "delikatnie" wspomina dokumantacja). Jak siê najpierw odczyta z ADCH a potem z ADCL, to te rejestry przestaj± byæ dostêpne dla uk³adu ADC i pomimo, ¿e ADC pracuje i mierzy, to nowego wyniku po prostu nie ma, no bo nie mo¿e byæ tam zapisany. Odczyt z ADCH odblokowuje dostêp ale odczyt z ADCL zaraz go znowu blokuje...

- wydaje siê, ¿e je¿eli nie jest u¿ywane przerwanie od ADC, to w trybie "one shot" najwygodniej jest sprawdzaæ flagê ADCS, która jest gaszona sprzêtowo po zakoñczeniu przetwarzania - nie trzeba niczego "gasiæ" rêcznie,

Pozdrawiam, ZyLex

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required