Cześć! Mam problem i muszę go szybko rozwiązać. Korzystam z biblioteki:
adc.h
adc.c
I chce odczytać dane z trzech kanałów. Odczyt z dwóch wykorzystując poniższy kod działa poprawnie, jeżeli przed każdym "getADC()" wstawię ADC_Init().
Problem odkryłem gdy chciałem użyć trzeciego kanału. Odczytuje bardzo dziwne wartości i dodatkowo jest zakłamanie napewno w jednym z poprzednich kanałów. Program chodzi w nieskończonej pętli.
Ciekawie też zaczyna się robić jak dodam dodatkowe kanały do poprzednich dwóch:
Tak samo jak w przypadku trzech: jest przekłamanie napewno w jednym poprawnie działającym kanale. Podłączam kanał 3 do masy i niby spoko bo wyświetla 0 tylko że nie w tym miejscu co trzeba! Wyświetla w miejscu dla wyniku kanału 4. To samo się dzieje dla kanału 4 - wyświetla w miejscu wyniku kanału 5.
Może nie tak wywołuje i inicjuje kanały? Korzystam z płytki testowej evb.
adc.h
void ADC_Init(void);
int getADC(char channel);
adc.c
#include <avr/io.h>
//-------------------------------------
// Get ADC conversion value
//-------------------------------------
int getADC(char channel)
{
unsigned int W = 0;
ADMUX |= channel;
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADIF));
ADCSRA |= (1 << ADIF);
W = ADCL;
W |= (ADCH << 8);
return W;
}
//-------------------------------------
// ADC Initialization
//-------------------------------------
void ADC_Init(void)
{
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
//-------------------------------------
// End of file
//-------------------------------------I chce odczytać dane z trzech kanałów. Odczyt z dwóch wykorzystując poniższy kod działa poprawnie, jeżeli przed każdym "getADC()" wstawię ADC_Init().
ADC_Init();
x=getADC(1);
x=x*5/1023;
x=(x+0.11*5)*10/(5*0.009);
dtostrf(x,3,0,wynik_cis);
////WYSWIETLENIE
ADC_Init();
y=getADC(2);
y=y*5/1023;
y=-6+125*y/3.4;
dtostrf(y,4,1,wynik_wilg);
////////////WYSWIETLENIE
_delay_ms(500);Problem odkryłem gdy chciałem użyć trzeciego kanału. Odczytuje bardzo dziwne wartości i dodatkowo jest zakłamanie napewno w jednym z poprzednich kanałów. Program chodzi w nieskończonej pętli.
ADC_Init();
x=getADC(1);
x=x*5/1023;
x=(x+0.11*5)*10/(5*0.009);
dtostrf(x,3,0,wynik_cis);
////WYSWIETLENIE
ADC_Init();
y=getADC(2);
y=y*5/1023;
y=-6+125*y/3.4;
dtostrf(y,4,1,wynik_wilg);
////////////WYSWIETLENIE
_delay_ms(500);
ADC_Init();
c=getADC(3);
//WYSWIETLENIE
_delay_ms(1000);
Ciekawie też zaczyna się robić jak dodam dodatkowe kanały do poprzednich dwóch:
ADC_Init();
c=getADC(3);
//WYSWIETLENIE
_delay_ms(1000);
ADC_Init();
d=getADC(4);
//WYSWIETLENIE
_delay_ms(1000);
ADC_Init();
e=getADC(5);
//WYSWIETLENIE
_delay_ms(1000);
Tak samo jak w przypadku trzech: jest przekłamanie napewno w jednym poprawnie działającym kanale. Podłączam kanał 3 do masy i niby spoko bo wyświetla 0 tylko że nie w tym miejscu co trzeba! Wyświetla w miejscu dla wyniku kanału 4. To samo się dzieje dla kanału 4 - wyświetla w miejscu wyniku kanału 5.
Może nie tak wywołuje i inicjuje kanały? Korzystam z płytki testowej evb.