[ mst.petrovic @ 03.03.2013. 22:44 ] @
poštovani,

pokušavam da shvatim kako funkcioniše a/d konverzija u c-u ali nigde odgovarajućeg uputstva za moj kompajler HITECH C compiler. Može li mi neko objasniti uopšteno pa ću pokušati da povežem sa ovim što sam napisao...
unapred hvala
Code:
  int read(void)
       {
         ADCON0bits.ADON=1;
         DelayUs(2);
         while(ADCON0bits.ADON)
            {
             ADCON0bits.ADON=0;
             return ADRESL;
            }
        }
-------------------------
ovo ispod je u main-u 
 while(1)
    {
    read();
      PORTC=ADRESL;
      PORTDbits.RD5=1;
    }
}


ovo je bila čisto proba da vidim da li radi ali kada probam da ga debagiram ADRESL ne menja svoje stanje čak i kad dovedem neki napon na pinu AN0

korisitm prvi kanal AN0 za konvertiju a na portu C sam povezao da mi izbaci neku vrednost, bilo šta, RD5 pali tranzistor za led displej
[ shpiki @ 04.03.2013. 01:36 ] @
A kontroler je PIC??? ?
[ bogdan.kecman @ 04.03.2013. 05:02 ] @
da li si procitao datasheet?
sta u datasheet-u za taj kontroler vezano za adc nije jasno?
[ goran_68 @ 04.03.2013. 06:58 ] @
Pogledaj primere koji su ti došli uz kompajler. Imaš ih u podirektorijumu samples\adc ili samples\a2d.
Pogledaj bolje datasheet. Sve je objašnjeno.
[ mst.petrovic @ 04.03.2013. 08:54 ] @
kontroler je 16f1937, naravno da sam pročitao datash. ali izgleda da nešto propuštam...
pogledaću primere koji su došli uz kompajler pa možda naletim na nešto interesantno.
[ goran_68 @ 04.03.2013. 09:48 ] @
Nigde nisi odabrao kanal koji ćeš da uzorkuješ. Evo npr. za PIC16F1827:

Code:


unsigned int itmp;

    ADCON0 = 0b00010000;                // AN4 ADC selected
    ADCON1 = 0b11010000;                // Right justified result, A/D Conversion Clock FOSC/16, VREF- is connected to VSS, VREF+ is connected to VDD
        ADON = 1;                    // A/D converter module is operating
    __delay_us(ACQ_TIME);              // Wait the required acquisition time
    ADGO = 1;                              // start AD conversion
        while(ADGO){}                         // conversion is complete?
    ADON = 0;                                   // A/D converter module is shutoff
    itmp = (unsigned int)ADRESH;
    itmp <<= 8;
    itmp |= (unsigned int)ADRESL;    



[Ovu poruku je menjao goran_68 dana 04.03.2013. u 14:59 GMT+1]

[Ovu poruku je menjao goran_68 dana 04.03.2013. u 14:59 GMT+1]
[ mst.petrovic @ 04.03.2013. 11:26 ] @
Hvala svima na odgovorim.
@Gorane mozes li da mi pojasnis ovaj deo koda iz tvog zadnjeg posta:
Code:

    itmp = (unsigned int)ADRESH;
    itmp <<= 8;
    itmp |= (unsigned int)ADRESL;    



posle smestanja u promenljivu itmp rezulatata konverzije iz registra ADRESH....
[ goran_68 @ 04.03.2013. 12:20 ] @
Video si u podešavanjima za AD konverziju da sam odabrao da mi rezultat bude desno poravnan tj. 10-bitni rezultat je smešten ovako:

Code:

                     ADRESH                                                                                ADRESL
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0                      bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0              
  x      x     x       x      x      x     ad9    ad8                       ad7   ad6    ad5    ad4    ad3    ad2    ad1    ad0


Posle izraza koji sam dao u prethodnom postu će sadržaj dva bajta itmp biti ADRESH | ADRESL.
U prvom koraku je ceo ADRESH smešten na mesto "nižeg" bajta itmp.
Drugi korak sadržaj itmp pomera za 8 mesta ulevo čime je ADRESH sada došao na svoje mesto, u "gornji" bajt itmp.
Na kraju se radi logička ILI operacija nad bitovima itmp i ADRESL pa je u itmp smešten kompletan 10-bitni rezultat konverzije.

Elegantnije je da se piše ovako:

Code:

union bword
{
   unsigned int ui;
   unsigned char ub[2];   
}itmp;

   itmp.ub[1] = ADRESH;
   itmp.ub[0] = ADRESL;



pa je rezultat konverzije itmp.ui


Možeš rezultat i da poravnaš levo. U tom slučaju on izgleda ovako:

Code:

                     ADRESH                                                                                ADRESL
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0                      bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0              
 ad9   ad8    ad7     ad6    ad5    ad4   ad3   ad2                        ad1    ad0     x       x       x       x       x       x


Ako u tom slučaju odbaciš zadnja dva bita konverzije (ad1 i ad0) i koristiš samo ADRESH rezultat ima 8 bita i možeš pisati:

Code:

unsigned char ad;

   ad = ADRESH;

E sad, 8-bita i 10-bita konverzije nije isto ali to ionako zavisi od toga šta radiš.
[ mst.petrovic @ 05.03.2013. 19:40 ] @
Gorane,
hvala puno na pomoći, razjasnio si ga za 10-ku :D !!!! nema više nejasnoća! !!! ! ! ! ! !
sada radi kako treba, problem je bio i na pinu na koji dolazi sonda kty 81 nisam stavio da je ulazni... :D

Moram da idem sa 10-bitnim registrom zato što mi vrednost napona po koraku mnogo viša od vrednosti koje daje sonda po stepenu.

Imao sam i problem sa drugim delom ali ovoga puta sa 16-bitnim tajmerom, kada upišem H, šiftam za 8 mesta pa upišem L on sve to lepo u radi i u narednom koraku mi prikaže tu promenljivu kao 8 bitnu....(sve se to dešava u interaptu i naravno čuvam u promenljivoj rezultat koja je 16 bitna) čudno ali snaći ću se valjda. Još jednom hvala, mnogo ste mi pomogli !!!!