Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 11 17, 04:12. Visos datos yra GMT + 2 valandos.
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
Bandau perskaityti su atmega328p du adc, bet smegenys jau perkaito beskaitant google, nes kiek autorių, tiek skirtingai viską daro.
pasidariau dvi funkcijas
Kodas:
int readAdc1(){
//ADC5
ADMUX |= (1<<MUX2) | (1<<MUX0);
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
int readAdc2(){
//ADC1
ADMUX |= (1<<MUX0);
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
ir tada skaitau main funkcijoj:
Kodas:
adc1 = readAdc1();
adc2 = readAdc2();
Bet gaunu tik adc1 rezultatus. Suprantu, kad tikriausiai kažkaip reikia išvalyti bitus, bet nesuprantu kaip. Gal kas susidūrėte su panašia situacija? Ačiū.
naudok ne OR "|=" priskyrimą, o absoliutinį "=".
|= priskyrimas naudojamas, kai reik tik tam tikrus bitus paverst 1, tačiau kitų bitų vertės nepakeičiamos, todėl šita operacija:
Kodas:
ADMUX |= (1<<MUX0);
nieko realiai nepakeiti, nes nuliniam bitui jau buvo priskirtas vienetas anksčiau, o antrasis bitas taip pat lieka lygus vienetui.
Mano pasiūlymas būtų naudot tik vieną funkciją:
Kodas:
int readAdc(int adc_nr){
//read from according adc
ADMUX = adc_nr;
//single conversion mode
ADCSRA |= (1<<ADSC);
// wait until ADC conversion is complete
while( ADCSRA & (1<<ADSC) );
return(ADC);
}
Tuomet pagrindinėj programoj atrodytų taip:
Kodas:
adc1 = readAdc(5);
adc2 = readAdc(1);
Jeigu bijai programoj sumaišyt, kuris adc yra kuris, tai prisiskirk pradžioj globalias konstantas ad1 = 5 ir ad2 = 1 ar kaip nors kitaip ir jas duok funkcijai.
Tai ką dabar ADC nuskaito? Beje, nepamiršk, kad iš kart po MUX pakeitimo, nuskaityta reikšme negalima pasitikėti, todėl geriausia ją ignoruoti ir skaityti dar kartą.
Taigi atraminės įtampos nenurodei, nes tame pačiame ADMUX registre bitai REFS1, REFS0 užduoda atraminę įtampą. Tai pvz. jei kaip atraminę įtampą nori naudoti Vcc, reikia išstatyti REFS0. Tuomet ADMUX nustatymas t.b. toks: