Arexx RP6 V2 Build your own robot kit RP6 V2 Manuale Utente

Codici prodotto
RP6 V2
Pagina di 141
RP6 ROBOT SYSTEM -  4. Programmierung des RP6
4.6.11. I²C Bus Funktionen
Zum Schluss dieses Kapitels, kommen wir zu den I²C-Bus Funktionen. Diese sind zur 
Kommunikation mit anderen Mikrocontrollern und Erweiterungsmodulen notwendig. 
Es gibt zwei Versionen der I²C Funktionen – eine für den Slave und eine für den Mas-
ter Modus.  
Achtung: Sie können nicht beide Versionen gleichzeitig verwenden! 
Man kann jeweils eine der beiden Versionen einbinden und muss diese auch im Make-
file eintragen! Dort sind die passenden Einträge schon vorhanden – aber auskommen-
tiert
. Es darf nur einer von beiden Einträgen verwendet werden, sonst gibt der Compi-
ler einen Fehler aus (weil der TWI Interrupt Vektor dann doppelt definiert wäre... )!
4.6.11.1. I²C Slave
Bei der Roboterbasis ist der Slave Modus sehr wichtig, denn oft wird man wohl einen 
weiteren Mikrocontroller zur Steuerung des Roboters verwenden. Es gibt auch ein Bei-
spielprogramm, das so gut wie alle Funktionen der Roboterbasis über den I²C Bus be-
reitstellt (RP6Base_I2CSlave). 
Der Slave Modus ist genau wie der Master Modus Interrupt basiert. Beim Slave ist das 
nicht anders möglich (ohne viel Aufwand jedenfalls), beim Master könnte man das al-
lerdings auch gut ohne realisieren. Um es jedoch einheitlicher zu gestalten, sind beide 
Versionen Interrupt basiert. Nebenbei kann man die Übertragungen im Mastermodus 
dann auch zum Teil im Hintergrund laufen lassen, was etwas Zeit sparen kann.
void I2CTWI_initSlave(uint8_t address)
Diese Funktion initialisiert das TWI Modul des Mikrocontrollers als I²C Slave. Man kann 
hier die Adresse des Controllers festlegen. Die Adresse gibt auch gleich mit an, ob der 
Controller auf sog. „General Calls“ reagieren soll. Wird der I²C Bus mit 0 adressiert, 
nennt man das General Call und es können alle angeschlossenen Geräte darauf rea-
gieren. Das ist z.B. nützlich um alle Controller gleichzeitig in einen Stromsparmodus 
zu schalten o.ä.
Beispiele:
I2CTWI_initSlave( adr |  TWI_GENERAL_CALL_ENABLE ); // General call aktiv
I2CTWI_initSlave(adr); // General call NICHT aktiv
I²C Register
Gängige I²C Bus Peripherie wird meist über einige Register die man lesen und/oder 
beschreiben kann gesteuert. Die Slave Routinen sind deshalb auch so gestaltet, dass 
es „Register“ (in diesem Fall ein Array aus 8 Bit Variablen) gibt, die der Bus-Master 
beschreiben bzw. lesen kann. Der Master überträgt dazu nach der Slave Adresse noch 
die Registeradresse und kann dann Daten aus diesem Register lesen oder es beschrei-
ben. 
Es gibt zwei Arrays mit dem Datentyp uint8_t dafür. Eines davon stellt die lesbaren 
Register zur Verfügung, das andere die beschreibbaren Register. 
- 106 -