User manual
RP6 ROBOT SYSTEM - 4. Programmierung des RP6
Die beiden Arrays und die Variable für General Calls heissen
I2CTWI_readRegisters, I2CTWI_writeRegisters und I2CTWI_genCallCMD
I2CTWI_readRegisters sind die lesbaren Register und I2CTWI_writeRegisters sind die
beschreibbaren Register. I2CTWI_genCallCMD speichert das zuletzt empfangene Ge-
neral Call Kommando. Der Datenaustausch über den I²C Bus läuft im Slave Modus
komplett über diese Register. Wenn man Daten auf dem Bus verfügbar machen will,
muss man diese im Array I2CTWI_readRegisters ablegen. Dann kann ein Master über
die Arrayposition (=Registernummer) auf die gewünschten Daten zugreifen. Soll ein
Master z.B. Sensorwerte vom Slave empfangen, schreibt man diese einfach an vorher
festgelegte Positionen im I2CTWI_readRegisters Array. Anschließend kann der Master
diese Daten auslesen, indem er zunächst die Registernummer an den Slave überträgt
und dann die Daten liest. Die Registernummer wird automatisch inkrementiert, also
kann der Master auch mehrere Register in einem Rutsch auslesen.
Ähnlich funktioniert auch das Schreiben. Der Master überträgt zunächst die gewünsch-
te Zielregisternummer und fängt dann an, die Daten zu schreiben. Wenn man mehre-
re Register hintereinander beschreiben will, muss man auch hier nicht für jedes Regis-
ter einzeln die Nummer übertragen, sondern kann einfach weiterschreiben da die Re-
gisternummer nach jedem Zugriff automatisch inkrementiert wird.
Das passiert auf dem Slave komplett Interrupt basiert im Hintergrund.
Beim Schreiben auf den Slave kann es leicht zu Inkonsistenzen kommen, wenn man
die Daten direkt aus den Registern benutzt. Denn wenn man ein Register ausliest,
könnte der Master ein anderes bereits überschrieben haben. Oft ist es daher sinnvoll,
die Daten vor der Verwendung zwischenzuspeichern. Auch Beim Lesen kann es zu in-
konsistenzen kommen, wenn mehrere Variablen voneinander abhängen (z.B. low und
high Byte einer 16 Bit Variablen).
I2CTWI_readBusy und I2CTWI_writeBusy
Die Interrupt Routine setzt bei Schreibzugriffen des Masters die Variable
I2CTWI_writeBusy auf true – so kann man überprüfen, ob gerade keine Schreibzugrif-
fe stattfinden und kann danach die Daten aus den Registern in temporäre Variablen
schreiben, mit denen man weiterarbeiten kann.
Im Beispielprogramm auf der nächsten Seite und im Slave Beispielprogramm auf der
CD wird das auch demonstriert – hier gibt es ein Kommandoregister, über das der
Master dem Slave Befehle wie „fahre mit Geschwindigkeitswert 100 Vorwärts“ senden
kann. Dazu wird in der Hauptschleife vom Slave ständig das Register 0 ausgewertet
wenn I2CTWI_busy false ist. Ist in Register 0 ein Kommando vom Master eingetroffen,
werden Register 0 und auch die Register 1 bis 6 in temporäre Variablen geschrieben.
Diese können dann ausgewertet werden. Je nach Inhalt der Kommandovariablen, wer-
den dann die Parameter behandelt. Parameter 1 könnte z.B. bei einem Bewegungsbe-
fehl die Geschwindigkeit enthalten und Parameter 2 die Bewegungsrichtung. Die ande-
ren Parameter würden bei diesem Befehl dann nicht weiter beachtet.
Genauso funktioniert I2CTWI_readBusy – diese Variable wird gesetzt, wenn gerade
Register gelesen werden. Damit kann man also überprüfen, ob man die Register be-
schreiben kann, ohne Inkonsistenzen hervorzurufen. In der aktuellen Implementie-
rung ist das aber nicht zu 100% garantiert. Um Inkonsistenzen komplett zu vermei-
den, müsste man für die Zeit in der die Register beschrieben werden, den TWI Inter-
rupt deaktivieren. Das könnte allerdings wiederum andere Probleme verursachen...
- 107 -