Problem AD7714 an IO-Warrior24

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Problem AD7714 an IO-Warrior24

Post by Thoene »

Hallo.
Ich versuche den A-D Wandler über SPI zum laufen zu bringen aber beim lesen der Daten gibt es kein logisches Ergebnis.
Verschaltet habe ich:
IOW Pin 22 (MISO) ------- AD7714 Pin 21 (Dout)
IOW Pin 23 (MOSI) ------- AD7714 Pin 22 (Din)
IOW Pin 21 (SCK) ------- AD7714 Pin 1 (SCLK)
IOW Pin 4 (DRDY) ------- AD7714 Pin 20 (DRDY)
IOW Pin 24 (SS) -------- AD7714 Pin 19 (CS)
Lt. Datenblatt muss das Configurationsregister mit der Adresse des Registers beschrieben werden wohin die Daten
geschrieben oder gelesen werden.
1. Adresse in das Register schreiben.
2. Werte in das adressierte Register schreiben oder aus diesem Register lesen.
Die Messwerte werden aus dem Datenregister mit einer Länge von 3 Byte gelesen.
Bei dem Wandler soll das lesen und schreiben parrallel simultan erfolgen.
Muß ich nach jeden Schreibbefehl sofort lesen??
Ich habe keine Erfahrung mit SPI. Einen anderen Wandler MCP3421 mit I2C habe ich am laufen. Funktioniert einwandfrei.
Ich habe den Code zum Initialisieren des IOW24 und des AD7714 angefügt.
Bei der initialisierung des AD-Wandlers habe ich alternativen Code mal mit angefügt aber das funktioniert auch nicht.
Muss man beim Testen der möglichen Einstellungen Report ID 08 Byte Enable bit CPOL und CPHA jedesmal das USB-Kabel
trennen oder kann man die Einstellungen direckt übertragen??
Ich habe noch einen IOW56 und einen Dongel (IOW56) könnte es damit besser funktionieren weil lt. Datenblatt eine etwas
andere konfiguration möglich ist und die Geschwindigkeit wesentlich höher ist.???
Beim Schreib oder lesezugriff zeige ich das Ergebnis der Variablen "IOW" an. Ergebnis 8 oder 9 scheint ok zu sein.
Hoffe einer kann mir helfen. Vielen Dank in vorraus!!!

Code: Select all

SUB Init_IOW (BYVAL hdlg AS LONG)'IOW24 Initialisieren
 IowHandles(0) = IowKitOpenDevice() 'IO-Warrior öffnen
    IF IowHandles(0) = 0 THEN
        MSGBOX "Kann IOW24 nicht Öffnen", 0, "Fehler"
    END IF
     Daten(0) = 8  'IOW24 SPI Anwählen
     Daten(1) = 1  'SPI Ein
     Daten(2) = 3  'Takt auswahl
     Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)'
END SUB
'-----------------------------------------------------------------------
SUB Init_AD7714_SPI (BYVAL hdlg AS LONG)'AD-Wandler Initialisieren
     Daten(0) = 9 'Anwahl IOW24 Schreiben
     Daten(1) = 1 'Flags IOW24 1 Byte senden
     Daten(2) = 36 'Communicationsregister (Anwahl Filter High Register)
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
     Daten(0) = 9
     Daten(1) = 1
     Daten(2) = 76 'Wert nach Filter High Register
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)

     Daten(0) = 9
     Daten(1) = 1
     Daten(2) = 52 'Communicationsregister (Anwahl Filter Low Register)
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
     Daten(0) = 9
     Daten(1) = 1
     Daten(2) = 28 'Wert nach Filter Low Register
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)

     Daten(0) = 9
     Daten(1) = 1
     Daten(2) = 20 'Communicationsregister (Anwahl Mode Register)
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
     Daten(0) = 9
     Daten(1) = 1
     Daten(2) = 32 'Wert nach Mode Register
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
  '################## Alternativ ??? ###############################
     Daten(0) = 9 'Anwahl IOW24 Schreiben
     Daten(1) = 1 'Flags IOW24
     Daten(2) = 36 'Communicationsregister (Anwahl Filter High Register)
     Daten(3) = 76 'Wert nach Filter High Register
     Daten(4) = 52 'Communicationsregister (Anwahl Filter Low Register)
     Daten(5) = 28 'Wert nach Filter Low Register
     Daten(6) = 20 'Communicationsregister (Anwahl Mode Register)
     Daten(7) = 32 'Wert nach Mode Register
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
END SUB
'---------------------------------------------------------------------------
SUB Messwert_AD7714_lesen_mit_Flag (BYVAL hdlg AS LONG)'MessWerte Einladen
M001:
     Daten(0) = 9
     Daten(1) = 1 '1Byte
     Daten(2) = 12 'Comunicationsregister Lesen 1Byte
     Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)

     Daten(0) = 9
     Daten(1) = 1
     Daten(2)=0:Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Iow = IowKitRead(iowHandles(0), 1, Daten(0), 8)
   IF BIT (Daten(2),7) =1 THEN GOTO M001                 'Bit 7Low? Daten Ok
     Daten(0) = 9
     Daten(1) = 3 'Schreiben 3Byte um 3Byte zu lesen
     Daten(2) = 92 'Communicationsregister (Anwahl Lesen Datenregister)
     Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Iow = IowKitWrite(iowHandles(0), 1, Daten(0), 8)
     Daten(0) = 9
     Daten(1) = 3 'Lesen Datenregister 3 Byte
     Daten(2)=0:Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Iow = IowKitRead(iowHandles(0), 1, Daten(0), 8)
     DatenL = Daten(2)
     DatenM = Daten(3)
     DatenH = Daten(4)
     Messwert = DatenL
     Messwert = Messwert + (DatenM * 255)
     Messwert = Messwert + (DatenH * 65535)
END SUB
Mike D
Posts: 91
Joined: Wed Jun 02, 2004 4:07 pm
Location: Elbe- Weser-Dreieck
Contact:

Re: Problem AD7714 an IO-Warrior24

Post by Mike D »

Hallo,
was dem einen sein IN is dem andern sein OUT.
Müsstest du nicht MISO -> Din und MOSI <- Dout verbinden?
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Problem AD7714 an IO-Warrior24

Post by Thoene »

Ich habe mal den Tipp die Signale "MISO" und "MOSI" zu vertauchen ausprobiert aber auch kein Ergebnis.
Was mich stutzig macht, wenn ich an den Wandler sende, sehe ich am Oszi keine Signale an den Leitungen
SCK, Miso und Mosi.
Bei einem Takt von ca. 60 Khz sollte man kurz was sehen!
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Problem AD7714 an IO-Warrior24

Post by Guido Körber »

Also die Vertauschung war falsch, die erste Zuordnung der Signale stimmte schon.

Ich habe jetzt nicht in das Datenblatt geschaut, aber braucht der Chip alle Bytes in einzelnen Transaktionen?

Die "Alternative" funktioniert nicht, weil da nur 1 Byte gesendet wird.
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Problem AD7714 an IO-Warrior24

Post by Thoene »

Der Chip funktioniert nach meinen Verständnis folgendermassen.
1. Senden an das Conf.Register die Adresse des Register welches beschrieben werden soll (Kanal, R/W, usw) R/W = 0
2. Beschreiben des Register mit den Daten.
u.s.w.
Bei Power on oder Reset am Chip steht der Zeiger auf dem Conf.Register.
Sollen mehrere Register, Filterhigh, FilterLow oder Mode-Register beschrieben werden muss immer das Conf.Register mit der Adresse des jeweiligen Register beschrieben werden.
Beim nächsten Schreiben wird automatich in dieses ausgewählte Register geschrieben.
Wenn die Configuration abgeschlossen ist, wird nach dem beschreiben des Mode-Register eine Messung gestartet.
Im Conf.Register geht das Bit 7 auf High. Wenn die Messung Ok ist, geht Bit 7 auf Low.
Ich Schreibe die eigene Adresse des Conf.Register mit R/W auf 1. Heisst die die nächste Aktion ist lesen des Conf.Register und Abfrage Bit 7 auf 0
Ist Bit 7 = 0 dann Beschreiben des Conf.Register mit der Adresse des Datenregister und R/W = 1 heist lesen.
Jetzt kann das Datenregister mit 3 Byte ausgelesen werden.
Bei meinem alternativen Programm müsste natürlich im Array (1) eine 6 für 6 Byte stehen.
Ich denke, bin mir aber nicht sicher das alles in Einzelaktionen stattfinden soll, weil ich ja dem Zeiger im Schip immer zwichen Conf.Register und dem eigentlichen Register hin und her schalte.
Ich denke das meine Programmierung soweit ok ist (geschrieben in Power-Basic)
vielleicht fällt ihnen ja was ein.
Meine erste Aktion mit SPI bin da noch etwas unsicher.
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Problem AD7714 an IO-Warrior24

Post by Christoph Jung »

Schon versucht das ganze mit dem "All In One" (3rd Party) Programm zu testen?
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Problem AD7714 an IO-Warrior24

Post by Thoene »

Hallo
Ich habe versucht den Chip mit "All in One" zum laufen zu bringen aber kein Erfolg.
In den Beispiel-Programm unter Windows-SDK, Samples, VB6, Maxim6675 steht der Befehl "Timer1.Enabled = True".
Muss ich den Timer im IO24 aktivieren oder wird der mit der aktivierung des SPI-Modus selbständig aktiviert.
Habe schon alles mögliche versucht, komme aber zu keinen vernünftgen Ergebnis.
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Problem AD7714 an IO-Warrior24

Post by friend-of-rq »

versuch doch mal "MISO" und "MOSI" zu brücken, ohne AD7714 ...

im All-In-One solltest Du dann die gesendeter Daten auf jeden Fall sehen ...

Gruss Ralf
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Problem AD7714 an IO-Warrior24

Post by Thoene »

Erst mal danke für die Hilfe!
Habe MISO und MOSI gebrückt und 2 Byte gesendet. Die Rückantword ist identich. IOW scheint ok zu sein.
Generelle Frage:
Wenn ich mit diesem Programm die Register des AD7714 einzeln beschreibe, kommt dann ebenso eine Kopie
zurück oder sind das andere im Chip schon vorhandene Daten?
Was komich ist bei meinen Programm.
Wenn ich ein geändertes Byte sende und das Adressierte Register wieder auslese, muss ich dieses Register
8 mal einzeln auslesen (Einzellesen über Button) dann erscheint mein gesendetes Byte?
Z.B.
Senden Wert(0) = 9
Senden Wert(1) = 1 'Senden 1 Byte für lesen 1 Byte
8 mal lesen dann im Wert(1) steht 1
Senden Wert(0) = 9
Senden Wert(1) = 3 'Senden 3 Byte für lesen 3 Byte
8 mal lesen dann im Wert(1) steht 3
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Problem AD7714 an IO-Warrior24

Post by friend-of-rq »

Hallo Thoene

SPI ist nicht gerade meine Lieblings-Schnittelle, SPI lesen ohne schreiben und SPI Schreiben ohne lesen gibt es nicht, es geht immer nur zusammen.

Es hängt dabei auch immer ganz vom angesprochenen Baustein ab was da rein muss und was da wieder raus kommt.

Code: Select all

ON-CHIP REGISTERS
The AD7714 contains eight on-chip registers which can be accessed via the serial port of the part. The first of these is a Communications
Register which controls the channel selection, decides whether the next operation is a read or write operation and also decides
which register the next read or write operation accesses. All communications to the part must start with a write operation to the
Communications Register. After power-on or RESET, the device expects a write to its Communications Register. The data written
to this register determines whether the next operation to the part is a read or a write operation and also determines to which register
this read or write operation occurs. Therefore, write access to any of the other registers on the part starts with a write operation to the
Communications Register followed by a write to the selected register. A read operation from any other register on the part (including
the output data register) starts with a write operation to the Communications Register followed by a read operation from the selected
register. The communications register also controls channel selection and the DRDY status is also available by reading from the
Communications Register. The second register is a Mode Register which determines calibration mode and gain setting. The third
register is labelled the Filter High Register and this determines the word length, bipolar/unipolar operation and contains the upper 4
bits of the filter selection word. The fourth register is labelled the Filter Low Register and contains the lower 8 bits of the filter selection
word. The fifth register is a Test Register which is accessed when testing the device. The sixth register is the Data Register from
which the output data from the part is accessed. The final registers allow access to the part’s calibration registers. The Zero Scale
Calibration Register allows access to the zero scale calibration coefficients for the selected input channel while the Full Scale Calibration
Register allows access to the full scale calibration coefficients for the selected input channel. The registers are discussed in more
detail in the following sections.

Gruss Ralf
Post Reply