Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Slave
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.
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.
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 :-$
Aber erst muss die Adresse gesendet werden, dann der Befehl zum auslesen!
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
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
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
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.
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-[
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.