ADC w AVR - problem

May 26, 2006 6 Replies

Dlaczego przy odczycie danych z ADC, zawsze w zmiennej Pv, mam tê sam± warto¶æ co w Vv? Przecie¿ zgodnie z not± katalogow± prze³±czam wej¶cie w czasie, gdy bit ADEN jest wyzerowany. Odczytywanie pojedynczo pinów mikrokontrolera przebiega prawid³owo, a odczyt dwóch za jednym razem jest ok.



volatile unsigned char temp; // niepotrzebne dane // >>>>>>>>>>> odczyt regulacji mocy >>>>>>>>>>>>>>>>


ADCSRA &= ~(1 << ADEN); // wy³±czenie bitu enable ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1) | ~(1 << MUX0); // ustawianie wej¶cia, ADC0 ADCSRA |= (1 << ADEN); // w³±czenie bitu enable



ADCSRA |= (1 << ADSC); // pocz±tek konwersji while ( ADCSRA & (1 << ADSC) ); // czeka na koniec konwersji temp = ADCL; Pv = ADCH; // odczyt regulatora mocy



// >>>>>>>>>>> odczyt napiêcia akumulatora >>>>>>>>>>>>>>>>



ADCSRA &= ~(1 << ADEN); // wy³±czenie bitu enable ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1) | ~(1 << MUX0); // ustawianie wej¶cia ADMUX |= (1 << MUX0); // ustawia ADC1 ADCSRA |= (1 << ADEN); // w³±czenie bitu enable



ADCSRA |= (1 << ADSC); // pocz±tek konwersji while ( ADCSRA & (1 << ADSC) ); // czeka na koniec konwersji temp = ADCL; Vv = ADCH; // odczyt napiêcia akumulatora



Pzdr. Krzysztof.



Co¶ za szybko piszê. Odczyt pojedyczno przebiega prawid³owo, natomiast odczyt dwóch pinów za jednym razem (w jednej funkcji) jakby zamazuje pierwsz± odczytan± danê...

Pzdr. Krzysztof.

Krzysztof napisał/a:

jak dla mnie w obydwu wypadkach odczyt jest dokonywany z GND w przypadku ATMEGA8

tu powinny być raczej

ADMUX &= ~(1 << MUX3) & ~(1 << MUX2) & ~(1 << MUX1) & ~(1 << MUX0); // ustawianie wejścia, ADC0

lub

ADMUX &= ~((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0)); // ustawianie wejścia, ADC0

a ogólnie to wydaje mi sie ze lepiej zdefiniować sobie #define MY_ADCMASK 0xf0 #define MY_ADC0 0x00 #define MY_ADC1 0x01

i uzywac

ADMUX = (ADMUX & MY_ADCMASK) | MY_ADC0;

ADMUX = (ADMUX & MY_ADCMASK) | MY_ADC1;

ewentualnie rozpisac w definach wszystkie bity i skladac za kazdym razem potrzebna wartosc

pozdrawiam czerstwy

(...)

Many thanks for your excellent job !!! Za pierwszym razem posz³o :-))

Nie mam pojêcia dlaczego mój zapis ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1) | ~(1 << MUX0); powodowa³ jaki¶ b³±d, tym bardziej, ¿e w AVR Studio bity by³y poprawnie wybierane...

Pzdr. Krzysztof.

Krzysztof napisał/a:

~((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0)) = 0xF0

~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1) | ~(1 << MUX0) = 0xFF

to dwie zupełnie inne liczby wychodzą, nie wiem jak AVRStudio mogło to interpretować tak samo

pozdrawiam czerstwy

Krzysztof snipped-for-privacy@wp.pl napisał(a):

..

Ten zapis powinien wyglądać tak:

ADMUX &= ~((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0));

Twój zapis dał taki efekt:

ADMUX &= 0xf7 | 0xfb | 0xfd | 0xfe ;

co w sumie dało :

ADMUX &= 0xff;

czyli psinco ;) i nie podobra co by sie AVRStudio na taki nume nabrało :(

Piotrek

Ju¿ wychwyci³em przyczynê. Sposób w jaki ja pisa³em, nie powodowa³ kasowania bitów ADMUX3..0, i nie umo¿liwia³ wpisywania nowych (przewa¿nie mniejszych warto¶ci), st±d wyja¶nie siê przyczyna dlaczego zawsze odczytywa³em dan± z ostatniego wywo³ywanego kana³u - a testowa³em to maksymalnie dla trzech. Teraz przetestowa³em to ponownie w AVR Studio i faktycznie na jaw wyszed³ wspomniany wy¿ej problem.

Jeszcze raz dziêki za pomoc. Dwa popo³udnia szuka³em, dlaczego to tak dziwnie siê zachowuje.

Pozdrawiam Krzysztof.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required