/*Nastavení AD převodníku*/
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); //povolení AD převodu, nastavení předděličky (8)
DDRA = 0b01000000; //nastavení portu A (vstupy a výstupy)
ADMUX = 0x80; //nastavení ADC , interních referenční napětí, vyběr vstupního kanálu ADC
ADCSRA |= (1 << ADSC); // start konverze
while(!(ADCSRA & (1<<ADIF))); // počkat na dokončení konverze
ADCSRA |= (1<<ADIF); // vynulovat flag (nuluje se zápisem "1")
_delay_ms(3); //zpoždění kvůli provedení AD převodu.
/*výběr funkce*/
if (ADCW >=3371)
{prvni();} //provede se 1.fce
if ((ADCW >=1325)&(ADCW<3371))
{druha();} //provede se 2.fce
if (ADCW <1325)
{treti();} //provede se 3.fce
}[/code]
Na pin AD převodníku je neustále přivedeno napětí, proto nevím jestli náhodou není chyba ve while(!(ADCSRA & (1<<ADIF))); kde se čeká na dokončení převodu?
administrator: přejmenováno z "Problém s A/D převodníkem"
No a když teda nastavím ADLAR=1 tak může ADCW nabývat stejných hodnot jako když je ADLAR=0? Nebo bude krok se kterým ADCW poroste roven 64? Pokud je LSB 64 tak se mi tím pak zmenší “rozlišovací” schopnost toho převodníku, nebo se pletu?
ADCSRA |= (1 << ADSC); // start konverze
while(!(ADCSRA & (1<<ADIF))); // počkat na dokončení konverze
ADCSRA |= (1<<ADIF); // vynulovat flag (nuluje se zápisem "1")
_delay_ms(3); //zpoždění kvůli provedení AD převodu.
Delay je tady zbytečné, dokončení převodu signalizuje bit ADIF.
Jednodušší je
ADCSRA |= (1 << ADSC); // start konverze
while(ADCSRA & (1<<ADSC)); // počkat na dokončení konverze
Bit ADSC po dokončení převodu přechází do úrovně “0”.