PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ein externer ADC - gibts ein Codebeispiel?



Conradi
24.09.2008, 19:02
Hallo,

ich hab in einem anderen Topic schon mal angesprochen, dass ich einen externen ADC anschließen möchte...

Nun denke ich, dass das hier vielleicht schon ein paar Leute gemacht haben und fragen ob ich mal einen Blick auf euren Code werfen dürfte. Wenn ihr mir noch den Controllertyp nennt, kann ich das mal mit dem Datenblatt vergleichen und sehen, wie das ganze so funktionieren soll und kann es vielleicht auf einen ADC übertragen, den ich mir kaufen wollte.

Ich hoffe ihr könnt mit helfen
Conradi

wkrug
25.09.2008, 23:06
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


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


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

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

Conradi
26.09.2008, 23:13
Hi

So viel anders als beim Assembler Code sieht das ja gar nicht aus, ich danke dir. Erinnert mich alles an mein LCD *g*.

Das ist zum Einarbeiten schon mal eine große Hilfe. Falls jemand trotzdem noch Codes hat, ich bin dankbar für alles. :-)

"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 ? "

Ja, die Frage ist recht allgemein gehalten, da ich noch gar keine Vorstellung habe, welchen Wandler ich verwenden möchte etc. Das ganze soll ja nur als Anhaltspunkt dienen, da ich bisher noch relativ wenig mit µC gemacht habe und eher schlecht "datenblättisch" kann. So kann ich die grundsetzliche Vorgehensweiße einfach mal nachvollziehen. Für den internen Wandler des AVR gibts Tutorials, aber für externe hab ich einfach nicht viel bis nichts gefunden.


Gruß
Conradi

wkrug
27.09.2008, 19:53
Für den internen Wandler des AVR gibts Tutorials, aber für externe hab ich einfach nicht viel bis nichts gefunden.

Das ist auch kein Wunder.
Du solltest bei der Suche nach Quellen nicht von der Anwendung ausgehen ( A/D Wandler ) sondern eher nach Codes für die gewünschte Schnittstelle suchen, also I²C, SPI, 1wire .
Da das Ansprechen der entsprechenden Schnittstelle für viele Chips sehr ähnlich ist, ob es sich dabei um einen A/D Wandler, eine Temperatursensor, oder einen Speicherchip handelt spielt erst beim Übertragen von chipspeziefischen Datenwörtern eine Rolle.

Sprich - such nach Codebeispielen für eine SPI, wenn Du eine A/D Wandler mit SPI Schnittstelle verwenden willst.