Dlaczego wartości Pv i Vv są identyczne przy odczycie z ADC w AVR?
ADC w AVR - problem
From: "Krzysztof" <krzysztof.gedroyc_at_nospam_wp.pl>
Subject: ADC w AVR - problem
Date: Fri, 26 May 2006 15:44:18 +0200
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.
From: "Krzysztof" <krzysztof.gedroyc_at_nospam_wp.pl>
Subject: Re: ADC w AVR - problem
Date: Fri, 26 May 2006 15:55:05 +0200
Odczytywanie pojedynczo pinów mikrokontrolera przebiega
prawidłowo, a odczyt dwóch za jednym razem jest ok.
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.
From: czerstwy <czebaka_at_nospam_o2.pl>
Subject: Re: ADC w AVR - problem
Date: Fri, 26 May 2006 22:49:55 +0200
Krzysztof napisał/a:
ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1)
| ~(1 << MUX0); // ustawianie wejścia, ADC0
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
From: "Krzysztof" <krzysztof.gedroyc_at_nospam_wp.pl>
Subject: Re: ADC w AVR - problem
Date: Fri, 26 May 2006 23:14:11 +0200
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
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.
From: czerstwy <czebaka_at_nospam_o2.pl>
Subject: Re: ADC w AVR - problem
Date: Sat, 27 May 2006 17:25:17 +0200
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
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...
~((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
From: "Krzysztof" <krzysztof.gedroyc_at_nospam_wp.pl>
Subject: Re: ADC w AVR - problem
Date: Sun, 28 May 2006 00:47:24 +0200
to dwie zupełnie inne liczby wychodzą, nie wiem jak AVRStudio mogło to
interpretować tak samo
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.
From: "Piotrek Sz." <zumek.SKASUJ_at_nospam_gazeta.pl>
Subject: Re: ADC w AVR - problem
Date: Sat, 27 May 2006 20:51:57 +0000 (UTC)
Krzysztof <krzysztof.gedroyc_at_nospam_wp.pl> napisał(a):
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 >>>>>>>>>>>>>>>>
..
ADMUX &= ~(1 << MUX3) | ~(1 << MUX2) | ~(1 << MUX1)
| ~(1 << MUX0); // ustawianie wejścia, ADC0
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
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/