PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Slave



filth
22.04.2009, 22:55
Hallo,

ich habe einen Sensor mit dem I2C Bus, den ich abfragen möchte.
Hier ist mein Beispielprogramm:



$regfile = "M8def.dat" 'es handelt sich um einen ATmega8
$crystal = 16000000
$hwstack = 32
$swstack = 10 '
$framesize = 40
$baud = 9600


Dim Lesen1 As Byte


'SDA und SCL definieren
Config Sda = Portc.4
Config Scl = Portc.5

I2cinit


I2cstart
I2cwbyte &B6
I2crbyte Lesen1 , Nack
I2cstop

Print Err


Print "gelesen: "
Print Lesen1


End

Die Ausgabe sieht immer so aus:



1
gelesen:
255

Datenblatt des Sensors:
www.captured-dreams.de/temp/TSEV01C_Application_Note_0_6.pdf


Hat jemand eine Idee, was ich falsch mache? Ich vermute bei der Adressierung ist etwas falsch. Im Datenblatt steht, dass die Adresse des Slave "54h" ist, aber wie konfigutiere ich das?

Danke!

linux_80
22.04.2009, 23:10
Hallo,

ohne jetzt genauer auf das DB einzugehen, die Slave-Adresse stimmt so nicht, B6 ist eine "schreib"-Adresse, es muss Bit 0 gesetzt werden, damit der Slave Daten rausrückt.
Und in Bascom gibt man HexZahlen so an:
&HB6 bzw. hier sollte es &HB7 sein.

filth
22.04.2009, 23:12
Hallo,

vielen Dank!
Ich habe die Adressen korrigiert und spreche jetzt den Slave nur per


I2cinit
I2cstart
I2cwbyte &H54h
I2cstop

Print Err

an. Trotzdem wird Err = 1 gesetzt :(

linux_80
22.04.2009, 23:30
Das kleine "h" nach der Adresse hat da aber nix zu suchen.
Welche Adresse hat denn nun der Slave ?

&H54 ist die Adresse zum schreiben, &H55 entsprechend zum lesen vom Slave.

filth
22.04.2009, 23:36
Also im Datenblatt steht, dass der Slave die Adresse 54h hat. Um ihn auszulesen muss 0xB5 oder 0xB6 gesendet werden. Oder ich verstehe da irgendwas völlig falsch :-$

uwegw
23.04.2009, 00:02
Aber erst muss die Adresse gesendet werden, dann der Befehl zum auslesen!

filth
23.04.2009, 06:54
Aber erst muss die Adresse gesendet werden, dann der Befehl zum auslesen!

Das ist klar, aber wenn ich erstmal nur die Adresse des Slave anspreche, dürfte es doch keinen Fehler geben, oder?

Datenblatt:


The I2C slave address is 54h.

0xB6 Read object temperature Object temperature in hundredth of degree 2
0xB5 Read ambient temperature Ambient temperature in hundredth of degree 2

cipher
23.04.2009, 08:24
Hi,

ich bin jetzt kein Bascom-Programmierer, kann also sein, dass die Syntax des Programms nicht ganz richtig ist, ich setzte aber den I2C-Bus sehr oft ein. So, wie ich den Sensor verstanden habe, musst Du zuerst den Befehl senden, der angibt, was Du auslesen willst:


I2cstart
I2cwbyte &H54
I2cwbyte &HB6
I2cstop


Danach liest Du vom Sensor. Das geht leider nicht direkt in einem:


I2cstart
I2cwbyte &H55
I2crbyte Lesen1 , Nack
I2cstop


Man kann das auch mit einem REPEATED START machen und sich ein STOP sparen:


I2cstart
I2cwbyte &H54
I2cwbyte &HB6
I2cstart
I2cwbyte &H55
I2crbyte Lesen1 , Nack
I2cstop


Wichtig ist: Gerade Adressen signalisieren einen Schreibvorgang an den Slave, ungerade Adressen einen Lesevorgang vom Slave.

Noch was: Die Leitungen SDA und SCL brauchen Pull-Up-Widerstäde. Wenn die nicht da sind, geht die Übertragung schief.

Viele Grüße,

Markus

Suggarman
23.04.2009, 10:04
Hallo,
ich möchte mal folgenden Code in den Raum stellen:



i2cstart
i2cwbyte 84
i2cwbyte 182
i2cstop

i2cstart
i2cwbyte 85
i2crbyte highbyte
i2crbyte lowbyte
i2cstop

Temp=(highbyte*256+lowbyte)/100 ' geht in bascom so nicht, muß man zerlegen


mfg

Stefan

filth
23.04.2009, 10:14
Hallo,

vielen Dank für die Tipps, ich werde es heute Nachmittag nochmal ausprobieren. Ich glaube jetzt ist mir klar, wo das Problem liegt.

Pull-Ups sind da (10k).

Grüße
Alex

filth
23.04.2009, 14:46
Hallo,

leider klappts mit dem folgenden Programm immer noch nicht:



$regfile = "M8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 9600

Config Sda = Portc.4
Config Scl = Portc.5


Dim Highbyte As Byte
Dim Lowbyte As Byte


Config I2cdelay = 20 ' 50 kHz Bit-Datenrate ( Baud )


I2cInit ' Zu Beginn alles in die richtige Ausgangslage bringen


I2cstart
I2cwbyte 84
I2cwbyte 182
I2cstop

Print Err



I2cstart
I2cwbyte 85
I2crbyte Highbyte
I2crbyte Lowbyte , Nack
I2cstop

Print Err


Do
Loop


End


Es wird jeweils "1 1" ausgegeben. Was kann ich noch versuchen?

Suggarman
23.04.2009, 15:04
Lasse am Ende mal highbyte und lowbyte ausgeben, hänge mal ",nack" beim Lesen des highbyte an und lasse das erste "Print Err" weg.

Viel Erfolg.

filth
23.04.2009, 15:07
Hallo,

ich habe jetzt den Sensor einfach an PD4 und 5 gehangen und das Programm entsprechend modifiziert:


$regfile = "M8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 9600

Config Sda = Portd.5
Config Scl = Portd.4


Dim Highbyte As Byte
Dim Lowbyte As Byte


Config I2cdelay = 20
I2cInit ' Zu Beginn alles in die richtige Ausgangslage bringen


I2cstart
I2cwbyte 84
I2cwbyte 182
I2cstop


Print Err


I2cstart
I2cwbyte 85
I2crbyte Highbyte
I2crbyte Lowbyte , Nack
I2cstop


Print Err


Print Highbyte
Print Lowbyte


Do
Loop


End

Plötzlich geht es. Aber warum? 8-[