Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

AD7715 - nekaj softvera

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
MarE
Profesionalec


Pridružen/-a: Pet Nov 2004 23:38
Prispevkov: 177

PrispevekObjavljeno: Sre Jan 05, 2005 2:07 pm    Naslov sporočila: AD7715 - nekaj softvera Odgovori s citatom

Tule objavljam nekaj kosov kode za (generično) komunikacijo z AD7715. Sicer se da stvari rešit tudi z bolj prefinjenimi prijemi (npr. z uporabo hardverskega SPI, ki ga ima veliko mikrokontrolerjev), vendar je tole bolj splošna rešitev.

1. najprej definiramo bite za komunikacijo:

Koda:
sbit AD_DRDY= P1^0;
sbit AD_DATA= P1^1;
sbit AD_CLK = P1^2;


2. navedemo prototipe funkcij:
Koda:
/*
 * Prototypes of AD7715 functions
 */
void ad_byte_out(uchar byte_out);
void ad_init_bus();
uchar ad_byte_in(void);
void ad_setup(uchar conf, uchar gain);


3. Definiramo nekaj konstant za lažje razumevanje:
Koda:
// Communication register
#define AD_RS_COMM               0
#define AD_RS_SETUP               0x10
#define AD_RS_TEST               0x20
#define AD_RS_DATA               0x30
#define AD_READ                  0x08
#define AD_WRITE               0
#define AD_STBY                  0x04
#define AD_GAIN1                0
#define AD_GAIN2               1
#define AD_GAIN32               2
#define AD_GAIN128               3


// Setup register
#define AD_MODE_NORMAL            0
#define AD_MODE_SELFCALIBRATION      0x40
#define AD_MODE_ZEROSCALE         0x80   
#define AD_MODE_FULLSCALE         0xc0
#define AD_CLKHI               0x20
#define AD_CLKLO               0
#define AD_FILTER1               0
#define AD_FILTER2               0x08
#define AD_FILTER3               0x10
#define AD_FILTER4               0x18
#define AD_BIPOLAR               0
#define AD_UNIPOLAR               0x04
#define AD_BUFFERED               0x02
#define AD_UNBUFFERED            0
#define AD_FSYNC               1
#define AD_NOFSYNC               0


4. Pa še same rutine:
Koda:
/*
 * Initialize serial bus lines for AD7715.
 */
void ad_init_bus() {
  uchar i;
  AD_DRDY = 1; 
  AD_DATA = 0;
  AD_CLK = 1;
  AD_DATA = 1;
  for (i=0; i<32; i++) {  // RESET DEVICE
      AD_CLK = 0;
        AD_CLK = 1;
  }
  delay_ms(100);
}


/*
 * Send one byte on the AD7715 bus.
 */
void ad_byte_out(uchar byte_out)
{
    uchar bit_count=8;
    while(bit_count)
    {
     AD_CLK = 0;
     AD_DATA = byte_out & 0x80;
     AD_CLK = 1;
     byte_out <<= 1;
      bit_count--;
   }
   while (AD_DRDY); // wait DRDY

}

/*
 * Reads one byte in from the AD7715
 */
uchar ad_byte_in(void)
{
    uchar bit_count=8;
   bit sampled_data;
   uchar byte_in;
   AD_DATA = 1;
   while (AD_DRDY); // wait DRDY
    while(bit_count)
    {
        AD_CLK = 0;
        sampled_data=AD_DATA;             //sample data from AD7715
      AD_CLK = 1;
        if (sampled_data) byte_in |= 0x01;      
        else byte_in&=~0x01;      
      if (bit_count!=1)                   //last bit is already in position
         byte_in <<= 1;               //shift next bit and store
        bit_count--;
    }
  return byte_in;
}


/*
 * Setup AD7715
 */
void ad_setup(uchar conf, uchar gain) {
  ad_byte_out(AD_RS_SETUP + AD_WRITE + gain); // write to configuration register
  ad_byte_out(conf);

}

/*
 * Get unipolar voltage from AD7715
 */
unsigned int ad_get_unipolar(uchar gain) {
uchar adhi,adlo;
unsigned int rez;

  ad_byte_out(AD_RS_DATA + AD_READ + gain);
  adhi = ad_byte_in();
  adlo = ad_byte_in();
  rez = adhi;
  rez<<=8;
  rez |= adlo;
  return rez;

}


/*
 * Get bipolar voltage from AD7715
 */
int ad_get_bipolar(uchar gain) {
uchar adhi,adlo;
int rez;

  ad_byte_out(AD_RS_DATA + AD_READ + gain);
  adhi = ad_byte_in();
  adlo = ad_byte_in();
  rez = adhi;
  rez<<=8;
  rez |= adlo;
  return rez;

}



Tipična uporaba bi zgledala tako:

Tako se zadevo inicializira:
Koda:
  ad_init_bus();

  ad_setup(AD_MODE_SELFCALIBRATION + AD_CLKHI + AD_FILTER1 + AD_UNIPOLAR , AD_GAIN1);
  while (AD_DRDY); // wait for AD7715 selfaclibration complete


Takole pa odčita:
Koda:

      unsigned int volt[16];

      for  (j=0; j<16; j++)
        volt[j] = ad_get_unipolar(AD_GAIN1);


V zadnjem primeru seveda nisem navedel inicializacije portov mikrokontrolerja. Pini morajo imeti naslednje funkcije:

AD_CLK - OUT (ali open drain+pullup)
AD_DATA - I/O oz. kvazi bidirectional (*)
AD_DRDY - IN

(*) - če mikrokontroler tega ne omogoča (hm, ne vem, če tak obstaja), potem se lahko loči pine na AD_DATAIN in AD_DATAOUT in temu ustrezno popravi rutini za pisanje in branje.

Upam, da bo komu koristilo pri ne-odkrivanju tople vode.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group