Mittwoch, 13. Juni 2012

I2C Slave in Arduino/C

Also ich sag mal so, es war ein Krampf! Das lag aber mehr an den nicht gesammelten Erfahrungen und an einem fehlerhaftem Modul, das so noch nicht kommuniziert wurde. Was war passiert?

Ich baute den ersten analogen Drucksensor als I2C Device, dieser besteht aus einem ATTiny85 sowie zwei Pullup Widerständen.

Drucksensor I2C Prototyp


Die ersten Tests mit dem Modul TinyWireS sahen auch nicht schlecht aus. Was mir aber damals schon auffiel, das Konstrukt schien ein sync Problem zu haben. Immer wenn ich den Sensor betätigt habe, kamen die informationen (je nach Delay im Master) eine Sekunde später an. Ich bin an dem Problem fast verzweifelt, bis ich gestern diesen Forumbeitrag gefunden hatte:

http://arduino.cc/forum/index.php/topic,108410.0.html

Das einzige Problem dabei, ich wusste nicht das man c++ Code direkt in der Arduino IDE editieren und compilieren konnte. Das ging schon mal wenn man folgende Tipps berücksichtigt:

http://arduino.cc/forum/index.php/topic,108410.msg819327.html#msg819327


 I created a new library in my Arduino sketchbook called usiTwiSlave and dropped the two files: usiTwiSlave.c and usiTwiSlave.h inside there.  Then, I changed the .c extension to a .cpp extension on usiTwiSlave.c .  (The compiler complains about some of the library's methods being "undefined" otherwise, since it's not actually compiling the .c file.)

(Don't forget to restart the IDE after adding a new library!)

To get Jochen's Arduino code working, I changed Wire.send to Wire.write an Wire.receive to Wire.read

Ich musste am Ende noch den Eintrag common.h entfernen und es rödelte durch. Nun ging es aber richtig los, schließlich musste ich in dem C++ Code auch noch angeben, welche Pin high ist (um den Sensor mit 5V zu versorgen) und natürlich wie ich den Wert des Sensors auslese. Sehr geholfen hat mir dabei diese Seite:

http://joehalpin.wordpress.com/2011/06/19/multi-channel-adc-with-an-attiny85/

und hier wieder ein paar regelon für I2C:
  • schalte immer den Master aus, wenn du ein I2C Slave im Bus austauschst. Sollte der Leseprocess hängen, liegt es mit großer Sicherheit daran das der Master versucht den Slave zu finden und dieser nicht antwortet.
  • Denke an die Pullup Widerstände!
  • lass dem Slave Zeit (delay(10)) die Daten an den Master zu senden.
Am Ende der Code für Master sowie Slave, Slave nutzt eine spezielle Library die im o.g. Beitrag erwähnt wurde:
https://www.dropbox.com/sh/4m0c64u7gaz6rot/xx66uwrG7_

Die ATTiny's werden nach folgender Anleitung programmiert:



Keine Kommentare:

Kommentar veröffentlichen