mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD7705 Antwort immer DRDY


Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs,

nachdem ihr mir gestern mit dem Timer geholfen habt, hat der Timer zwar 
nun funktion, aber die verwendung des Timers bei meinem AD7705 (ADC 16 
Bit unipolar, 0-2.5V, 2.4567Mhz)bringt mich auch nicht weiter. Die 
anderen Forenartikel auch nicht :-(

Also, ich versuche nun schon seit Tagen den AD7705 (auch unter MX7705 
erhältlich!) über SPI ans sprechen zu bekommen.

Problem: Er konvertiert mir keine Daten, keine Daten abrufbar! DRDY = 1 
:-(
(Log 1 = Keine Daten, Log 0 = Daten zum abholen bereit!)

Habe mit dem Oscar verglichen und folgendes festgestellt:

/CS in Ordnung
SCLK in Ordnung
Samplen an Rising Edge
MOSI (uc-->ADC!) in Ordnung
MISO antwortet mir immer nur nach der Anfrage ob Daten konvertiert sind 
mit DRDY nicht ready (log= 1). Auch einfaches ignorieren des DRDY-Pins 
bringt keine Besserung! niemals gibt er mir Null zurück!

Des Weiteren kann ich ja auch die anderen Register(Setup,Commreg etc) 
auslesen und er stellt mir den Inhalt korrekt dar!
Eingebracht sind schon Timer(falls er zu langsam ist!) Des Weiteren 
liegt an Reset =+5V, Vref i.O und Vcc auch i.O. Auch nach jedem Register 
schreiben mit Pause und passendem /CS antwortet er mir immer, das keine 
Daten bereit stehen.

Ausser irgendwann habe ich einmalig aus dem Datenregister CS56 erhalten 
(das macht er meist einmal am Tag!) Wieso verstehe ich da auch nicht!

Also, ggf. hat einer von euch den Exoten schonmal ans laufen bekommen?
Der gekürzte C-Code lautet:
//.... 
         SPI_MasterTransmit(0x21,SS_ADC12);  //Com Reg  Ch1 write to clk 
  set_SS_X(SS_ADC12);  

    while(tenhsec != 999);    //Delay
    tenhsec =1;    

         unset_SS_X(SS_ADC12);
  SPI_MasterTransmit(0x07,SS_ADC12); 
  set_SS_X(SS_ADC12);  

    while(tenhsec != 999);    //Delay
    tenhsec =1;    

          unset_SS_X(SS_ADC12);
  SPI_MasterTransmit(0x11,SS_ADC12);  // 10
  set_SS_X(SS_ADC12);  

    while(tenhsec != 999);    //Delay
    tenhsec =1;    

          SPI_MasterTransmit(0x06,SS_ADC12);  //40  //Setup reg//07

                   while(tenhsec != 999);    //Delay
    tenhsec =1;  

  while(1)
    {
    unset_SS_X(SS_ADC12);
    SPI_MasterTransmit(0x08,SS_ADC12);  //Abfrage ob Daten bereit sind                
                  set_SS_X(SS_ADC12);
    
    while(tenhsec != 999);    //Delay
    tenhsec =1;      
        
        
    a = SPI_SlaveReceive(SS_ADC12);

                  while(tenhsec != 999);    //Delay
    tenhsec =1;      
        
    if  (a == 0x08)
      {
      unset_SS_X(SS_ADC12);
      SPI_MasterTransmit(0x38,SS_ADC12);          set_SS_X(SS_ADC12);

      a=  SPI_SlaveReceive(SS_ADC12);
      a=  SPI_SlaveReceive(SS_ADC12);
      a = 0;
      }
    }
//...


Danke!!!

gruß

Autor: Micha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite z.Z mit einem AD7706. Als Anhang hab ich dir mal meinen 
C-Code für den ADC angehängt.

Gruß

Autor: Micha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch die zugehörige Header-Datei.

Es steht dort auch einige Sachen drinne die speziell für mein Projekt 
sind. Also nicht wundern.

Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für deine Mithilfe! Ich habe nun die beiden Fehlerquellen 
entdeckt. Einmal hat "man mir" falsche Cs bei den Quarzen reingepflanzt 
und auf der anderen Seite habe ich das Fsync falsch gesetzt...Naja, nun 
läuft er!

Danke!

gruß

Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ggf. kannste mir ja nochmal weiter helfen :-)

Ich spreche den AD7705 nun einwandfrei an und wenn nur AD7705 mit am SPI 
dran hängen, dann gibt er mir auch immer einwandfrei die gewandelten 
Daten zurück. Allerdings sobald ich weitere Hardware an den SPI hänge ( 
tristate fähig und auch in dem Zustand!) sendet mir der ADC immer ein 
0x0DFF zurück(also die 16 Bit-Takte wenn ich Daten aus dem Dataregister 
lesen möchte!). Weiß zufällig einer von euch, warum er mir partout dann 
keine Daten mehr sendet ? Also keine gewandelten? Sobald ich dann die 
Hardware "abstecke" sendet er mir munter die Daten weiter.

Danke für jeden Tipp!

greetz!

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stell am besten mal dein Schaltung rein.
Hört sich für mich an als ob du den ADC nicht oder nicht richtig mit der 
Chip-Select Leitung auswählst.

MfG

Autor: Diplomand_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

thx4answer.

Hmm, das ist ne gute Idee. Habe auch gerade schon die /CS mittels meines 
Oscars überprüft. Es werden tatsächlich immer nur die "richtigen" CS 
angesprochen.

Hmm, mal auf deinen Vorschlag gerne eingehend, dann würde es doch 
heißen, dass ich eig. nie die Antwort bekommen sollte. Ein rein 
zufälliges /CS für den ADC-X gibt es auch nicht. Es kommt immer zum 
richtigen Zeitpunkt, genau dann wenn ich die beiden Datenregister 
auslese(SLCK am takten/ CS Low und Daten über MISO einlesend; MOSI 
Standby!) Den ohne weitere Hardware am SPI funktioniert die 
Antwortgeberei ja einwandfrei. Habe mir den CS der weiteren Hardware 
auch angeschaut. Dieser ist, wenn ich auslese stets High (so wie die 
weitere SPI-Hardware es gerne möchte!) Die Auskunft des Herstellers hat 
mir zugesichert, dass die zusätzliche SPI-Hardware immer Tristate ist, 
wenn CS High ist. Mal angenommen, das wäre ne falschaussage ("..."), 
dann würde ja immer nen High-Pegel am MISO sein, oder ? Also würde er 
auch kein 0x0DFF antworten? Was meinst du den, würde nen Bustreiber mit 
"wirklichem" Tristate Ausgang hilfreich sein ? Bzw. würde dann die 
Antwort richtig senden?

Die Schaltung kann ich leider aus rechtlichen Diplomgründen nicht 
einstellen :-( Es hängen bis zu 4 ADCs (derzeit 2 ADCS) und 2 weitere 
SPI-Hardware-Bausteine dranne! Alle kriegen jeweils die SPI Leitungen 
und jeder eine einzelnde /CS-Leitung!

Danke für die Mithile :-)

greetz

Autor: Gast_AD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs,

ich höre hier gerade sehr gespannt mit und ggf. ist der Thread hier ja 
noch offen :-)

Ich verwende auch nen MX7706 (entsprechendes Pendant!) und er ist 
ebenfalls von 0-2.5V eingestellt.

Bei 2.5V gibt er mir den digitalen Wert von 31807 aus
und bei 0V = 000 Digits...

Also fehlt da doch die Hälfte an Auflösung (Einstellungen wie bei euch!)

Er ist def als UNipolar eingestellt...

Oder muss ich da was mit diesem selfcalib machen, damit der richtig 
läuft?

gruß Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.