Deine Frage ist schon sehr allgemein.
Welcher A/D solls denn werden ?
Hat er eine SPI Schnittstelle ?
Wenn SPI, soll der Wandler mit der Hardware SPI oder per software angesteuert werden ?
Ich hab einen Code für den AD7795 von Analog Devices, der ist aber in "C".
Trotzdem denke ich der Code ist gut auf Assembler übertragbar.
Diese Routine Initialisiert den AD7795
Code:
/* 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");
}
};
Die Software SPI
Code:
/* 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;
}
Ein Taktimpuls wird generiert
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");
}
Die nop's sind nur dafür da um zwischen den einzelnen Impulsen etwas Zeit vergehen zu lassen und könnten eventuell auch etwas kürzer ausfallen.
Lesezeichen