PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD7798 (16-Bit ADC)



impact
23.02.2008, 22:02
Hallo zusammen,
ich versuche mich nun seit gut 2 Wochen an dem AD7798 von Analog Devices. Es handelt sich um einen 16 Bit ADC mit SPI Schnittstelle.
Das Problem besteht dadrin,das ich die kommunikation nicht hinbekomme und somit nix empfangen kann. hat jmd das ding schonmal zum laufen gebracht?

Jeder Codeschnippsel (egal wodrin aber am liebsten asm / microchip pics) wär mir recht ...



MfG & Thx
Stefan

wkrug
23.02.2008, 23:18
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.



/* 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.

impact
24.02.2008, 13:09
Ich nutze zur Zeit die Hardware-SPI schnittstelle, wollte auch nun versuchen das ganze per Software zu machen.
Aber sehe ich das richtig, das ich den SPI-Bus bei einem 16F876A wie folgt initalisieren muss?



...
movlw B'00110010' ; SSPEN ein, CKP ein, SPI master mode, clock = FOSC/16
movwf SSPCON
BSF STATUS,RP0 ; Bank1
movlw B'01000000' ; sample input data at middle, CKE = fallende flanke
movwf SSPSTAT
...


ich vermute nämlich es hängt irgendwo damit zusammen