MAX1238 I2C am IOW24

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

Moderator: Guido Körber

Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

MAX1238 I2C am IOW24

Post by Prefekt »

Hallo,

nachdem ich den PC8591 zum laufen gebracht habe, merkte ich das die 8bit Auflösung nicht reichen. Ich wollte den MAX127 mit 12 bit Auflösung nehmen, aber das Teil ist nirgends zu bekommen (falls jemand eine Bezugsquelle hat!).
Also hab ich den MAX1238 genommen, 12 Kanäle und 12bit Auflösung.

Ich bekomme aber immer nur den Wert von einem Kanal angezeigt. Hier ist der Code mit dem ich den MAX auslese:

Code: Select all

'IIC activate
Report(0) = &H1S
Report(1) = &H1S
Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

For I = 0 To 3
                ' #### MAX1238 init ####
                Report(0) = &H2S ' ReportID IIC write request
                Report(1) = &HC3S ' 3 bytes with IIC Start and Stop
                Report(2) = &H6AS ' MAXIM1238 address byte = ADR 0, write
                ' MAXIM1238 setup byte
                Report(3) = &H82S ' SetupByte=1, ReferenceVoltage=000, Clock=0, BIP=0, RST=1, 0
                ' MAXIM1238 control byte
                Report(4) = &H1S Or (I * 2) ' ControlByte=0, scanning=0, channel=AN0, SGL=1
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                ' swallow ACK report
                Ret = IowKitRead(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

                ' #### MAX1238read ####
                Report(0) = &H3S ' ReportID IIC read request
                Report(1) = &H2S ' 1 bytes with IIC Start and Stop
                Report(2) = &H6BS ' MAXIM1238 address byte = ADR 0, read
                Report(3) = &H1S Or (I * 2) ' ControlByte=0, scanning=0, channel=AN0, SGL=1
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                ' read answer containing voltage value
                Ret = IowKitRead(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

                ' extract bytes of value
                N = Report(2) And &HAS
                N = N * 256
                N = N Or Report(3)
                N = N / 16
                ' value is 12 bit signed!
                Select Case I
                    Case 0 : lblCH1.Text = VB6.Format(N * 5.0# / 4096.0#, "0.0000")
                    Case 1 : lblCH2.Text = VB6.Format(N / 5000 * 4096.0#, "0000")
                    Case 2 : lblCH3.Text = VB6.Format(N / 5000 * 4096.0#, "0000")
                End Select

            Next
            'IIC deactivate
            Report(0) = &H1S
            Report(1) = &H0S
Ich hab schon alles mögliche probiert, kann aber immer nur einen Kanal auslesen. Die Umwandlung von 12bin in einen Wert stimmt auch noch nicht.

Hat jemand eine Idee?

Gruß
Volker
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: MAX1238 I2C am IOW24

Post by friend-of-rq »

Hallo Prefekt,

brauchst Du denn die vielen Kanäle ...

MCP3421 18-Bit AD mit I2C hier mit SOT-23-6 auf DIL Adapter

• 18-bit ΔΣ ADC in a SOT-23-6 package
• Differential input operation
• Self calibration of Internal Offset and Gain per each conversion
• On-board Voltage Reference:
- Accuracy: 2.048V ± 0.05%
- Drift: 5 ppm/°C
• On-board Programmable Gain Amplifier (PGA):
- Gains of 1,2,4 or 8
• On-board Oscillator
• INL: 10 ppm of FSR (FSR = 4.096V/PGA)
• Programmable Data Rate Options:
- 3.75 SPS (18 bits)
- 15 SPS (16 bits)
- 60 SPS (14 bits)
- 240 SPS (12 bits)
• One-Shot or Continuous Conversion Options
• Low current consumption:
- 145 μA typical
(VDD= 3V, Continuous Conversion)
- 39 μA typical
(VDD= 3V, One-Shot Conversion with 1 SPS)
• Supports I2C Serial Interface:
- Standard, Fast and High Speed Modes
• Single Supply Operation: 2.7V to 5.5V
• Extended Temperature Range: -40°C to 125°C

habe ich für meinen DruckSensor MPX4115A verwendet ...

Gruss Ralf
Attachments
Zwischenablage02.jpg
Zwischenablage02.jpg (100.49 KiB) Viewed 11534 times
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo Ralf,

12 Kanäle brauch ich nicht, das stimmt.
Ich brauche eine ADC mit min. 4 Kanälen und min. 4 Bit Auflösung. Ich habe einen MMA7620 Bechleunigungsmesser mit 3 Achsen der eine analoge Spannung pro Achse ausgibt.
Meßbereich 0-5V währen schon angebracht.

Gibt's da eine Empfehlung?

Gruß
Volker
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: MAX1238 I2C am IOW24

Post by Guido Körber »

Hm, wäre da ein JW24F8 oder JW24F14 nicht besser geeignet?
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo,

an den JW24Fx hatte ich auch schon gedacht.
Lassen sich ein IOW24 und ein JW24Fx aus einem Programm ansprechen?
Das währe sicher eine einfachere Lösung.
Ich brauche die Auflösung von einem Grad sind die JW24Fx dazu geeignet?

Gruß Volker
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo,

also da ich den MAX1238 ja schon habe und der auch einen Kanal problemlos ausgibt, möchte ich den auch wenigstens zum Laufen kriegen.

Hier ist nochmal der Quellcode mit der richtigen Spannungsanzeige:

Code: Select all

If iowHandles(iowHandel_ID) <> 0 Then
            'IIC activate
            Report(0) = &H1S
            Report(1) = &H1S
            Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

            For I = 0 To 3
                ' #### MAX1238 init ####
                Report(0) = &H2S ' ReportID IIC write request
                Report(1) = &HC2S ' 2 bytes with IIC Start and Stop
                Report(2) = &H6AS ' MAXIM1238 address byte = ADR 0, write
                Report(3) = &HD2S ' SetupByte=1, ReferenceVoltage=000, Clock=0, BIP=0, RST=1, 0
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                ' swallow ACK report
                Ret = IowKitRead(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

                Report(0) = &H2S ' ReportID IIC write request
                Report(1) = &HC2S ' 2 bytes with IIC Start and Stop
                Report(2) = &H6AS ' MAXIM1238 address byte = ADR 0, write
                Report(3) = &H3S ' Or (I * 2) ' ControlByte=0, scanning=0, channel=AN0, SGL=1
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                ' swallow ACK report
                Ret = IowKitRead(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

                ' #### MAX1238read ####
                Report(0) = &H3S ' ReportID IIC read request
                Report(1) = &H3S ' 1 bytes with IIC Start and Stop
                Report(2) = &H6BS ' MAXIM1238 address byte = ADR 0, read
                Report(3) = &H0S
                Report(4) = &H0S
                'Report(3) = &H1S Or (I * 2) ' ControlByte=0, scanning=0, channel=AN0, SGL=1
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                ' read answer containing voltage value
                Ret = IowKitRead(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

                hig = Report(2)
                low = Report(3)
                hig = hig And 15
                hig = hig << 8
                value = hig Or low
                Select Case I
                    Case 0 : lblCH1.Text = value.ToString()
                    Case 1 : lblCH2.Text = value.ToString()
                    Case 2 : lblCH3.Text = value.ToString()
                End Select

            Next
            'IIC deactivate
            Report(0) = &H1S
            Report(1) = &H0S
        End If
Als Bilder hab ich noch den Write-Cycle, das Config-Byte und das Setup-Byte angehängt.
Was mich etwas verwirrt, ist die Tatsache das nach dem Adressbyte, dem Config- und dem Setupbyte ein acknowledge kommt. Wie setzt man das mit dem IOW um??

Gruß
Volker
Attachments
max1238_003.jpg
max1238_003.jpg (173.82 KiB) Viewed 11512 times
max1238_002.jpg
max1238_002.jpg (165.83 KiB) Viewed 11512 times
max1238_001.jpg
max1238_001.jpg (88.4 KiB) Viewed 11512 times
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: MAX1238 I2C am IOW24

Post by Guido Körber »

Der JW24F8 liegt bei ca. 1 Grad Auflösung wenn man zwei Achsen miteinander verrechnet, der F14 liegt sogar noch deutlich besser.
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo,

das Problem beim MAX1238 scheint im Configurationsbyte zu liegen. Es ist egal was ich dem MAX mitgebe, es wird immer nur Channel 1 (AN0) ausgelesen.

Gruß
Volker
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: MAX1238 I2C am IOW24

Post by friend-of-rq »

Hallo Prefekt,
Also hab ich den MAX1238 genommen, 12 Kanäle und 12bit Auflösung.
12-Channel Single-Ended or 6-Channel Fully Differential (MAX1238/MAX1239)

das hat was mit den SCAN-Mode zu tun ... siehe Seite 17
SCAN0 and SCAN1 of the configuration byte set the scan mode configuration. Table 5 shows the scanning configurations. MAX1236–MAX1239
versuche mal mehr Bytes(für jeden Kanal = 2 ) in einem Rutsch einzulesen ... am schnellsten kannst Du das mit dem Test-Tool All-In-One probieren/testen.

Mit dem Tool kannst Du ohne Dir über die Steuerung der I2C-Funktion des IOW, mit den I2C-Devices am IOW probieren und spielen, dabei bis zu 255 Byte vom I2C-Device in einem Rutsch lesen.

Probiere den MAX1238 mit dem Tool einfach erst mal aus, bevor Du diesen in deinem Programm integrierst.

Gruss Ralf
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo Ralph,

die Idee mit dem Tool werde ich heute mittag gleich mal ausprobieren. Das Ding macht mich echt fertig.
Zwei Bytes Pro Kanal einlesen, einfach zwei Read Befehle hintereinander?

Danke und Gruß
Volker
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: MAX1238 I2C am IOW24

Post by friend-of-rq »

Zwei Bytes Pro Kanal einlesen, einfach zwei Read Befehle hintereinander?
NEIN ein READ mit entsprechend vielen Bytes ohne neue start/stop Sequenz !!

Result 1 (4MSBs) + (8MSBs) >>> irgendwie müssen doch die 12 Bit übertragen werden, deswegen 2 Byte ?!
Result 2 (4MSBs) + (8MSBs)
.....
Result n (4MSBs) + (8MSBs)

siehe ... B. SCAN MODE CONVERSIONS WITH INTERNAL CLOCK
Attachments
Zwischenablage01.jpg
Zwischenablage01.jpg (25.56 KiB) Viewed 11495 times
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Ach so,
hab ich doch so gemacht:

Code: Select all

hig = Report(2)
low = Report(3)
Bringt auch nicht viel, da ich dann z.B. das hier raus bekomme, mit den Tools getestest:

F8 B4 F5 BA F8 B4 F5 BA usw.

Hast du eine Beschreibung der Tools? Was wird genau an den I2C Slave geschickt, beim Write und beim Read?
Ich vermute mal (Adresse des Slave 6A):
2h
C2h
6Ah
[Werte die man eingeben kann]

Kann doch eigentlich nicht so schwer sein, den PC8591, LM75 usw. haben auch gleich funktioniert! Ob der MAX einen Macken hat??

Gruß
Volker
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: MAX1238 I2C am IOW24

Post by friend-of-rq »

Was wird genau an den I2C Slave geschickt
Check-Box "Data Log" aktivieren ...
dann kannst Du alle Daten zwischen IOW und TEST-Tool sehen

versuche mal über das Programm die Register zu ändern ...
Hast du eine Beschreibung
wenn Du was falsches eingibst kommt eine Beschreibung der möglichen Eingaben ...

Angezeigt Sprache kann auch gewählt werden :-)
F8 B4 F5 BA F8 B4 F5 BA usw.
F8 B4 = 1111 1000 1011 0100
F5 BA = 1111 0101 1011 0100

deine Werte spring um VREF / 2 ..... das 12. Bit gibt dabei die Polarität an ... siehe Seite 18.

Wie sieht denn dein Testaufbau aus ... sind alle AINx belegt oder offen
4.5V to 5.5V (MAX1236/MAX1238)
REF intern /extern ?

PIN(13) **AIN11/REF (MAX1238/MAX1239)
When the internal reference is configured to be available at AIN_/REF (SEL[2:1] = 11) decouple AIN_/REF to GND with a 0.01μF capacitor

When SEL1 = 1, a single-ended read of AIN3/REF (MAX1236/MAX1237) or AIN11/REF (MAX1238/MAX1239) is ignored; scan stops at AIN2 or AIN10.
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: MAX1238 I2C am IOW24

Post by Prefekt »

Hallo Ralf,

nur die ersten drei Eingänge(AI0 - AI2) sind belegt, der Rest liegt auf GND.
Referenz habe ich intern.
Getestet mit:
SEL2=0, SEL1=0, SEL0=0 -> VDD als Referenz
SEL2=1, SEL1=0, SEL0=0 -> interne Referenz
SEL2=1, SEL1=0, SEL0=0 -> interne Referenz

Was bedeutet 'Internal Referenz State' alwasy on und always off?

Ich habe so viel probiert, das ich wohl wieder von Anfang an anfangen muss...

Also:
Beschaltung wie folgt:
AI0 - AI2 sind die analogen Eingänge.
AI3 - AI11 liegen auf GND

Ich möchte die Eingänge einzeln gezielt abfragen. Referenz soll intern sein (kann ich auch mit dem Kondensator und Wiederstan) extern ausprobieren

I2C Daten:

Code: Select all

Report(0) = 00000010b  'write request
Rerpot(1) = 11000010b  'I2C start stop, mit 2 bytes
Report(2) = 01101010b  'MAX1238 address, write = 0
Report(3) = 11010010b  'setup byte, SEL2=1, SEL1=0, SEL0=1, internal clock, unipolar, no-action, 0
Report(4) = 00000001b  'configuration byte, SCAN 00, AN0, single-ended = 1 (AN1=00000011b, AN2=00000101b)

IOW-Write
IOW-Read 'ACK
Zählt das Adressbyte mit zu den Übertragenen Bytes oder nicht? Muss ich den Counter in Report(1) auf 2 oder 3 Byte stellen.

So weit so gut, nun das Auslesen

Code: Select all

Report(0) = 00000011b  'read request
Report(1) = 11000010b  'I2C start stop, mit 2 bytes
Report(2) = 01101011b  'MAX1238 address, read = 1
Report(3) = 00000000b
Report(4) = 00000000b

IOW-Write
IOW-Read
Report(2) high byte
Report(3) low byte
Auch hier wieder die Frage, zählt das Adressbyte mit oder nicht beim Counter (Laut Beschreibung nicht oder?)

Ist es besser das Setup- und Config-Byte in einer Report Struktur zu übermitteln oder nacheinander? Da der MAX nach jedem Byte ein ACK schickt, auch nach dem Address-Byte!?

Funktioniert das lesen so? Eigentlich dachte ich, das die Daten pro Kanal immer im Report(2), Report(3) stehen, aber wenn ich mit den Tools mehr Bytes lese, stehen da auch Werte drin!

Wie würdest du den Aufruf aufbauen?

Danke und Gruß
Volker
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: MAX1238 I2C am IOW24

Post by friend-of-rq »

Zählt das Adressbyte mit zu den Übertragenen Bytes oder nicht
Ja ... steht aber auch im DataLog vom Test-Tool
Wie würdest du den Aufruf aufbauen?
Ich würde auf jeden Fall beim "MAX1238" mit meinem Test-Tool alles ausprobieren.

Da ich aber kein "MAX1238" liegen habe, kann ich Dir auch nicht groß weiter helfen,
ist nur theoretisch eben aus dem Datenblatt ...

Gruss Ralf
Post Reply