Hat von Euch schon jemand mit dem AD Wandler ADS8320 von TI via SPI an einem Atmel AVR gearbeitet? Ich habe das Problem, dass ich diesen nicht am SPI des Atmel zum Laufen bekomme. Jedenfalls bekomme ich nur 0xff´s zurück und weiss nicht wieso. Ich habe mir ein Testboard gebaut gemäß der Schaltung im Datenblatt um einige Tests bezüglich der Geschwindigkeit zu fahren. Das Board haben sich auch schon drei Leute angeschaut und finden Schaltungstechnisch keinen Fehler. Daran wird es also wahrscheinlich nicht liegen. Gibt es sonst einige Kniffe zu diesem Wandler die ich vielleicht nicht berücksichtige? Ich werde morgen mal ein Bild vom Oszi mit den Signalen vom MISO, SCLK, SS anhängen damit das Problem vielleicht etwas verständlicher ist. Aber vielleicht hat ja schon jemand eine Idee. Es gibt wohl auch schon einen ähnlichen Thread, aber wie das meist in Foren so ist werden nach einer Erleuchtung des Fragenden die Erkenntnisse nicht mehr weitergeposted so dass das Problem für die "Nachwelt" damit nicht gelöst ist. Ciao Axel
So da habe ich nun mal den Oszi Bildschirm mit angehängt. oben Ch1 -> Das was am Dout des AD Wandlers rauskommt. (Immer dasselbe, egal ob der Signalpin direkt an Masse oder Vref liegt) mitte Ch2 -> die generierte SPI Clock (schiebe 3 mal ein Byte ins SPDR damit die Clock vom Controller erzeugt wird. unten Ch3 -> Das Chip Select Signal. Ich nutze bei einer Clock von 3.6864x10^6 einen Teiler von 4, habe aber auch schon mit anderen Clocks rumexperimentiert. Hat aber leider auch nichts gebracht. Vielleicht weiss ja jemand von Euch weiter. Axel
bist du dir sicher dass dein MC als Master läuft und nicht zwischenzeitlich in den Slave Modus geschaltet hat? (siehe SS Pin im Datenblatt!) Was für eine Skalierung haben CH1,CH2 und CH3 (5V,1V,10V)???/DIV Warum zieht CH1 von 3,3V ? auf 5V
Ich schicke 'mal einen Codeschnipsel ohne Kommentar; vielleicht ist eine Anregung dabei. #ifdef ADS8320 uint get_adc() // 7822 und 8320 { uint temp; char n, samples=0; PORTC &= ~ADC_CS; // cs auf 0 n = SAMPLES_8320; do { PORTC &= ~ADC_CLK; // clk auf 0 kurz(); samples++; // kurz(); PORTC |= ADC_CLK; // clk auf 1 // kurz(); } while(PINC & ADC_DAT && n--); // bis 0-bit erscheint n = 16; // immer 16 bit lesen while(n--) { // 16 bit einlesen PORTC &= ~ADC_CLK; // clk auf 0 temp <<= 1; // ergebnis schieben PORTC |= ADC_CLK; // clk auf 1 if(PINC & ADC_DAT) temp++; // bit 1 uebernehmen } PORTC &= ~ADC_CLK; // clk auf 0 PORTC |= ADC_CS; // cs auf 1 if(samples <= SAMPLES_7822) return(temp &0xfff0); else return(temp); }
@Wolfram Ich habe heute im Datenblatt auch gelesen dass es wohl sehr wichtig ist den /SS korrekt zu schalten bzw. auf High zu legen. Den lasse ich aber offen da ich den /CS vom Slave über PINB0 ansteuere. Mit offen meine ich ihn nicht auf High Pegel zu ziehen. Was mich eher interessiert ist, dass der ADC ja zum Wandeln auch eine Clk(Ch2) braucht, diese aber (siehe Oszi Pic) erst nach dem Chip Select(Ch3)und dem High-Pegel des ADC Dout(Ch1) beginnt. @Michael Danke für Deine Anregung. Der Code ist gut wenn man nicht das integrierte SPI nutzen möchte. Das ist aber meine Voraussetzung es darüber zu machen. Trotzdem nocheinmal Danke!
Achso, nochmal zu den Oszi Einstellungen: Die Clock scheint im Pegel nur falsch zu sein. An dem Kanal hing ein x10 Tastkopf. Ausserdem wollte ich nur mal schnell ein Bild haben und hab da an das Layout des Bildes keine Zeit verschwendet. Die Frage warum der Dout nach dem Tristate Zustand jedoch auf 3,3V geht und nach den 3 gesendeten Bytes nicht auch wieder auf High geht, stelle ich mir auch gerade. Die Schaltung hängt bei mir am STK500 und der gibt bekanntlich 5V als VTG ab. Jo jo. Vielleicht habe ich das Teil ja schon beim einlöten gehimmelt. Mist nur dass ich vom Baustein keinen mehr habe. Noch jemand eine Idee?
Auch nach der Kontrolle des /SS PINs ist das Ergebnis das gleiche. @Wolfram Wo bitte siehst Du dass der Baustein als Slave fungiert? Axel
Hier mal mein Sourcecode. Vielleicht findet da ja jemand einen Fehler. #include <avr/io.h> #include <avr/iom32.h> int main(){ PORTB = 0x11; DDRB = (1<<PINB0)|(1<<PINB7)|(1<<PINB5)|(1<<PINB4); SPSR = 0x00; SPCR = 0x50; unsigned char i; while(1){ PORTB&=FE; //CS auf LOW for(i=0;i<3;i++){ SPDR= 0xFF; while(!(SPSR&(1<<SPIF))); } PORTB|=0x01; //CS auf HIGH } return 0; }
Es ist ein Yokogawa. Typnummer habe ich nicht im Kopf fängt aber glaub ich mit ner 15 an! Hat zudem einen Bernsteinfarbenes Display und ein Disklaufwerk rechts am Bildschirm. Axel
Nur als Info. Das mit dem ADS8320 habe ich nun sein gelassen. Das Bauteil scheint wohl defekt zu sein. Daher habe ich nun einen ADS8344 von TI genommen. War eh sinniger, da ich mehrere Eingänge eh gebraucht hätte. Passt so also ganz gut. Und vor allem....... der läuft. War nur eine Krux den auf eine Testplatine zu löten. Danke nochmal für die zahlreichen Tipps ;-) Axel
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.