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.
Ich hoffe es hilft weiter.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 */






Zitieren

Lesezeichen