Vielleicht hilft Dir ja dieser funktionsfähige C- Codeschnipsel was.
Den BIAS Voltage Generator hab ich wieder abgeschaltet und durch eine LED mit Vorwiderstand ersetzt.
Anfangs hatte ich die Ausleseroutine so gestaltet, das der Controller auf das Ende der Wandlung wartet, dabei hat sich das Ding dann bisweilen aufgehängt. Darum sind jetzt da die komischen Zeitschleifen drin.
Wenn mehr als 2 Fehler auftreten lass ich im Hauptprogramm einen Reset und eine Neuinitialisierung des AD 7795 laufen (uc_aderror).
Eventuell strick ich an der Routine noch mal etwas um - die Schaltung ist erst in der Entwicklungsphase.
Code:
/* Einen Clockimpuls für den AD7795 generieren */
void clock_ad7795 (void)
{
#asm("nop");
ad7795_clock=0;
#asm("nop");
ad7795_clock=1;
#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_sendbyte,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(60); /* Auf A/D Wandler warten */
if (ad7795_dout==1)
{
delay_ms(100); /* 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<32;uc_i++)
{
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);
}
}
Lesezeichen