Nicht für den AD7798, aber für den AD7795 hab ich so was.
Ist leider in "C" aber die grundlegenden Sachen sollte man schon erkennen können.
Code:
/* Einen Clockimpuls für den AD7795 generieren */
void clock_ad7795 (void)
{
#asm("nop");
#asm("nop");
ad7795_clock=0;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
ad7795_clock=1;
#asm("nop");
#asm("nop");
}
/* 8Bit in den AD7795 schreiben */
void write_ad7795 (unsigned char uc_byte)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
if((uc_byte&(1<<7))==(1<<7))
{
ad7795_din=1;
}
else
{
ad7795_din=0;
}
clock_ad7795();
uc_byte=uc_byte<<1;
}
ad7795_din=1;
}
/* AD Wandlerwert holen AD7795 */
unsigned int read_ad7795 (unsigned char uc_channel)
{
unsigned char uc_i;
unsigned int ad_value=0;
uc_channel=uc_channel&0b00000111; /* Höherwertige Bits abtrennen */
// Init Configutation Register for Channel X
ad7795_din=1;
ad7795_cs=0;
write_ad7795(0b00010000); /* Write to Configutation Register */
write_ad7795(0b00011000); /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
write_ad7795((0b10010000|uc_channel)); /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=X */
ad7795_cs=1;
#asm("nop");
// Init Mode Register = Read selected AD Channel
ad7795_cs=0;
write_ad7795(0b00001000); /* Write to Mode Register */
write_ad7795(0b00100000); /* Write value to Mode Register high = Single Conversation=On, AMP_CM=OFF*/
write_ad7795(0b00000100); /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
delay_ms(50); /* Auf A/D Wandler warten */
if (ad7795_dout==1)
{
delay_ms(50); /* Nochmal warten */
}
if (ad7795_dout==1)
{
ad_value=0; /* Fehlerzähler hochzählen */
uc_aderror++;
}
else /* A/D Wandler auslesen */
{
write_ad7795(0b01011000); /* Readout Dataregister Command */
for (uc_i=0;uc_i<16;uc_i++)
{
if (ad7795_dout==1)
{
ad_value=ad_value|0x0001;
};
ad_value=(ad_value<<1);
clock_ad7795();
}
};
ad7795_cs=1;
#asm("nop");
return (ad_value);
}
/* Reset für den AD7795 */
void reset_ad7795 (void)
{
unsigned char uc_i;
ad7795_cs=0;
#asm("nop");
ad7795_din=1;
for(uc_i=0;uc_i<34;uc_i++) /* eigentlich 32 */
{
clock_ad7795();
}
ad7795_cs=1;
#asm("nop");
}
/* Initialisieren des AD7795 */
void init_ad7795 (void)
{
volatile unsigned char uc_i;
for(uc_i=0;uc_i<4;uc_i++)
{
// Init Configutation Register Ch X
ad7795_cs=0;
write_ad7795(0b00010000); /* Write to Configutation Register */
write_ad7795(0b00011000); /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
write_ad7795(0b10010000|uc_i); /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=AIN X */
ad7795_cs=1;
#asm("nop");
// Init Mode Register = Init Zero Calibration Ch X
ad7795_cs=0;
write_ad7795(0b00001000); /* Write to Mode Register */
write_ad7795(0b10000000); /* Write value to Mode Register high = Zero Calibration=On, AMP_CM=OFF*/
write_ad7795(0b00000100); /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate= 62Hz */
delay_ms(50);
if (ad7795_dout==1)
{
delay_ms(100);
uc_aderror++;
}
ad7795_cs=1;
#asm("nop");
// Init Mode Register = Init Full Scale Calibration Ch X
ad7795_cs=0;
write_ad7795(0b00001000); /* Write to Mode Register */
write_ad7795(0b10100000); /* Write value to Mode Register high = Full Scale Calibration=On, AMP_CM=OFF*/
write_ad7795(0b00000100); /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
delay_ms(50);
if (ad7795_dout==1)
{
delay_ms(100);
uc_aderror++;
}
ad7795_cs=1;
#asm("nop");
}
};
/* 6 A/D Werte aus dem AD7795 auslesen und abspeichern */
void read6_ad7795 (void)
{
unsigned char uc_i;
for (uc_i=0;uc_i<6;uc_i++)
{
ui_old7795[uc_i]=ui_7795[uc_i];
ui_7795[uc_i]=read_ad7795(uc_i);
}
}
//.............
// AD7795 Initialisieren
ad7795_cs=1; /* /CS abschalten */
ad7795_clock=1; /* CLK auf ruheposition =1 setzen */
ad7795_din=1; /* DIN auf Ruheposition =1 setzen */
reset_ad7795(); /* AD 7795 resetten */
delay_ms(1); /* 1ms warten */
init_ad7795(); /* Initialisierungsroutine aufrufen */
Ich hoffe es hilft weiter.
Lesezeichen