Forum: Mikrocontroller und Digitale Elektronik I2C/TWI command set von lego us sensor


von Lynn S. (Firma: Gecko) (wolke)


Lesenswert?

Hallo zusammen,

Ich versuche den Lego Ultraschall Sensor über meinen atmega8 
anzusteuern. Lego hat sogar ein Datenblatt zur Verfügung gestellt mit 
dem I2C communication protocol

(http://www.legoengineering.com/knowledgemanager/getattachment.php?data=MTU0fEFwcGVuZGl4IDctTEVHTyBNSU5EU1RPUk1TIE5YVCBVbHRyYXNvbmljIFNlbnNvciBJMkMgY29tbXVuaWNhdGlvbiBwcm90b2NvbC5wZGY%3D).

Aus dem Datenblatt werde ich aber leider nicht ganz schlau. Die Adresse 
des Sensors ist 1 und das stimmt auch, ich bekomme ein ACK wenn ich die 
Adresse SLA+W  über den Bus schicke.

Wenn ich jetzt zum Beispiel den Sensor in den "continuous measurement" 
Zustand versetzen möchte, muss ich da ein 0x41 und 0x02 nacheinander 
schreiben?

Und wenn ich die product ID lesen möchte muss ich da ein 0x08 schreiben 
und dann 8 bytes auslesen?

Ich habe auch Probleme zu verstehen, wie ich mehrere bytes lese und 
schreibe. Im TWI Artikel http://www.mikrocontroller.net/articles/AVR_TWI 
steht fürs MTM

START
TWDR = SLA+W
DATEN
TWDR = masterByte1
START                (unlogisch, da müsste doch DATEN sein?)
TWDR = masterByte2
START                (unlogisch, da müsste doch DATEN sein?)
STOP

MRM ist mir ganz unklar:

START
TWDR = SLA+R
DATEN
und jetzt mehrere bytes auslesen? Muss ich da noch etwas schicken?
Und woher weiss der Slave von welchem Speicher er lesen soll? Also wenn 
ich den Sensor Wert gemäss Datenblatt lesen möchte unter Adresse 0x42??


übrigens:
START: TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
DATEN: TWCR = (1 << TWINT) | (1 << TWEN);
STOP: TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);


Vielen Dank für eure Hilfe.

Gruss
Lynn

von BMJ (Gast)


Lesenswert?

Hi,

ich versuche auch gerade den Sensor zum laufen zu bekommen, aber auf 
einem SunSpot, der jedoch auch mit einem atmega und einem arm läuft. Das 
Problem mit dem Sensor ist, das der nicht das Standard I2C Protokoll 
verwendet.

Hier ein paar links, die vielleicht weiterhelfen:

http://www.picaxeforum.co.uk/showthread.php?t=17307&highlight=nxt&page=4
(hier gibt es code, der funktionieren soll. Ist aber leider für Picaxe)

http://arduino.cc/forum/index.php?topic=62899.0
(...Because there is a bug in the firmware, you have to sent a extra low 
pulse at SCL...)

Falls du es hinbekommst, würde ich mich freuen, wenn du die Lösung hier 
posten würdest.

Viele Erfolg!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.