Sveiki,
pagelbėkit su megos ADC, jau antrą dieną nesugebu jo paleisti cikle..
ADC sukonfiginau vienetinio keitimo režime, ADC5 kanalas, su pertraukimais.
Problema - ADC "suveikia" tik vieną kartą, po to į įtampos pokyčius ant pino nereaguoja, visą laiką nusiskaito tas pats rezultatas.
Jeigu tą patį piną nuskaityti skaitmeniniame režime, tai jis gražiai vartosi ir su pull´up´u ir be jo.
Pinas kaba laisvas, su pincetu arba įžeminu, arba į pliusą; skaitmeniniame režime suveikia o ADC režime - ne...
kodas toks:
ADC5_DDR = 0; //configure ADC5 as input
ADC5 = 0;
ADMUX=0x45 ; //0100.0101 - Vcc ref, ADC5
DIDR0 = 0x20; // isj. skaitmenine dali
ADCSRA =0x8E; //1000.1110/ int e,nable div. factor 64
while(1){
WriteByteToDOG(0x01, DOG_CMD); //clrscr
ADCSRA |= _BV(ADSC); //start conversion
while (!F_ADCIRQ);
F_ADCIRQ = 0;
ADCResult = (ADCH<<8)|ADCL;
//ADCResult = ADC5_PIN; cia nuskaitymas skaitmeniame rezime, veikia
WriteShortToDisplay(ADCResult);
ADCResult = 0;
_delay_ms(1000);
LED1 = !LED1;
}//while 1
}// main
pertraukimas labai paprastas sprendžiant pagal LED mirksėjimą, jis vyksta:
ISR (ADC_vect){
//ADCSRA |= 0x10;
F_ADCIRQ = 1;
LED=!LED;
}
Displėjaus duomenys pajungti per žemesnyjį PORTC ketvertuką, todėl išvedimo funkcijos daro tokias operacijas:
duomenų išvedimui į displėjų:
DDRC|=0x0F; //cause direction is changed to read data
PORTC = (PORTC & 0xF0) | (BitsToSend & 0x0F); //do not touch upper niblle of portc
displėjaus statuso nuskaitymui:
DDRC &= 0xF0; // PC0..PC3 - input
_delay_us(10);
...
...
status=PINC;
būčiau dėkingas už bet kokią pagalbą...