PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Externer AD-Wandler (Max127) über I2C auslesen



Lincolnmhkn
14.05.2007, 19:34
Hallo Allesammt!

Hatte vor ner Weile mal gepostet bezüglich zusätzlichen AD-Eingängen am ATMega16. Habe jetzt von Maxim den Max127 und den Max128 auf dem Tisch liegen und würde die gerne anschließen. Aufgebaut ist nu alles, aber irgendwie will das mit dem I²C nicht so ganz funzen.

Der IC übermittelt die gemessen Werte mittels zweier Byte nacheinander an den Master, aber mein Bus macht gar nichts, zumindest sagt das das Oszi.
Angeschlossen hab ich alles richtig, SDA und SCL liegen mittels 4,7kOhm an 5V. Sieht jemand in meinem Programm den Fehler? Ist mein erstes I2C- Projekt, bin da noch nicht ganz fit mit.

Besten Dank und Gruß, Martin

Hier mal mein Programm, möchte nur dass mir die übermittelten Daten auf einem LCD ausgegeben werden.

...
Baud 57600

Const Adextw1 = &B01010000 'Schreibadresse
Const Adextr1 = &B01010001 'Leseadresse
Const Adext1chan1 = 11111000 'Control-Byte für AD-Kanal 1

Dim Readvar1h As Bit
Dim Readvar1l As Bit

Initlcd

Do
Cls

I2cstart
I2cwbyte Adextw1
I2cwbyte Adext1chan1
I2cstop

I2cstart
I2cwbyte Adextr1
I2crbyte Readvar1h
I2crbyte Readvar1l
I2cstop

Locate 1 , 1
Lcd "h: "
Lcd Readvar1h
Locate 2 , 1
Lcd "l: "
Lcd Readvar1l
Wait 1
Loop

bertl100
14.05.2007, 20:01
Dim Readvar1h As Bit
Dim Readvar1l As Bit

Der I2C Bus kann keine einzelen Bits übertragen, sondern nur Bytes.
also

Dim Readvar1h As Byte
Dim Readvar1l As Byte

Das ist das Erste. Ob das Programm so richtig ist, kann ich jetzt nicht sagen, da ich nur wenig mit I2C arbeite

linux_80
14.05.2007, 20:42
Hallo,

und evtl. sollte man noch angeben, wo die I2C Pins überhaupt sind.
Irgendwie muss man das noch Initialisieren, nicht gleich mit Start loslegen !
Wenn Du das Hardware-I2C bzw. TWI verwenden willst, gehört oben noch eine Lib angegeben, und dann noch die Bus-Geschwindigkeit setzen.

hier alles zusammen :

$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI

Config Scl = Portc.5 ' we need to provide the SCL pin name
Config Sda = Portc.4 ' we need to provide the SDA pin name
'Config I2cdelay = 10 ' nur bei SoftI2C

I2cinit ' we need to set the pins in the proper state

Config Twi = 100000 ' wanted clock frequency, nur wenn die Lib oben eingebunden ist

Lincolnmhkn
15.05.2007, 07:21
Danke schonmal soweit Euch Beiden!
Habe die Änderungen übernommen, Code sieht nun wie folgt aus:


$regfile = "m16def.dat"

$crystal = 16000000
$lib "i2c_twi.lbx"

Const Ref = 5 / 1023
Baud 9600


Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.7 , Rs = Portc.6
Config Lcd = 16 * 2


Config Sda = Portc.1
Config Scl = Portc.0
'Config I2cdelay = 10

Const Adextw1 = &B01010000 'Schreibadresse
Const Adextr1 = &B01010001 'Leseadresse
Const Adext1chan1 = 11111000 'Control-Byte für AD-Kanal 1


Dim Readvar1h As Byte
Dim Readvar1l As Byte

Initlcd
I2cinit

Config Twi = 100000

Do
Cls
I2cstart
I2cwbyte Adextw1
I2cwbyte Adext1chan1
I2cstop

I2cstart
I2cwbyte Adextr1
I2crbyte Readvar1h
I2crbyte Readvar1l
I2cstop

Locate 1 , 1
Lcd "h: "
Lcd Readvar1h
Locate 2 , 1
Lcd "l: "
Lcd Readvar1l

Wait 1

Loop


Nur leider funzts immer noch nicht. Man kann auf dem Oszi erkennen, dass Sda jeweils auf 0 gezogen wird, aber das wars auch schon. Stimmt das Programm soweit? Auf welchen Wert muss ich eigentlich den Baud-Wert stellen?
Fragen über Fragen...

Danke und Gruß, Martin

linux_80
15.05.2007, 17:39
Hi,

wenn Du per UART nix überträgst, kannst du die Baudangabe weglassen.

Dann denke ich das bei der Konstante zum AD-Kanal die Angabe fehlt, das es sich um eine binäre Darstellung handelt !

Muss man evtl. etwas warten zwischen dem Kanal einstellen und dem Auslesen des Wertes ? So schnell wird der AD-Wandler nicht sein, ausser er wandelt immer wo vor sich hin ;-)

Lincolnmhkn
15.05.2007, 18:20
Jippie, habs gerade geschafft!
Das Programm war schuld, jetzt funktionierts!
Wenn man lange genug rumprobiert hat funktionierts halt doch meistens!

Nochmals allen Helfern vielen Dank!

Gruß, Martin