Tema: Amega168 ir ADC
Autorius: Kantega
Data: 2011-07-13 19:44:22
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ą...