|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
MarE Profesionalec
Pridružen/-a: Pet Nov 2004 23:38 Prispevkov: 177
|
Objavljeno: Sre Jan 05, 2005 2:07 pm Naslov sporočila: AD7715 - nekaj softvera |
|
|
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 |
|
|
|
|
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
|