User manual

RP6 ROBOT SYSTEM - 4. Programmierung des RP6
Empfangen von Daten
Zum Empfangen von Daten bietet die RP6Library mehrere Möglichkeiten. Zum einen
blockierende Funktionen, die ähnlich wie die Schreibfunktionen aufgebaut sind. Zum
anderen aber auch Funktionen, die die Daten automatisch „im Hintergrund“ abholen.
Zunächst zu der einfachen Variante, Daten blockierend lesen.
uint8_t I2CTWI_readByte(uint8_t targetAdr);
Diese Funktion liest ein einzelnes Byte von einem Slave. Einzeln kann man die Funkti-
on nicht verwenden, man muss fast immer erst noch die Registernummer übertragen.
Das macht man mit I2CTWI_transmitByte.
Beispielsweise wenn man Register 22 vom Slave mit Adresse 10 lesen will:
I2CTWI_transmitByte(10, 22);
uint8_t result = I2CTWI_readByte(10);
void I2CTWI_readBytes(uint8_t targetAdr, uint8_t * messageBuffer,
uint8_t numberOfBytes);
Will man mehrere Bytes abrufen, kann man diese Funktion verwenden.
Beispiel:
I2CTWI_transmitByte(10, 22);
uint8_t results[6];
I2CTWI_readBytes(10,results,5);
Hier werden 5 Bytes von Register 22 des Slaves mit der Adresse 10 gelesen. Ob diese
wirklich von Register 22 gelesen werden, variiert von Slave zu Slave einige inkre-
mentieren automatisch die Registernummer (wie der Slave Code der RP6Library) und
andere Funktionieren ganz anders. Dazu ssen Sie immer die jeweilige Dokumenta-
tion lesen!
Will man Daten im Hintergrund auslesen, gestaltet sich die Sache schon ein wenig
komplexer. Man startet zunächst eine Anfrage (Request) nach einer bestimmten An-
zahl von Bytes von einem bestimmten Slave. Diese Bytes werden dann im Hinter-
grund vom Slave abgeholt. Der Controller kann in dieser Zeit also etwas anderes tun
und wird nur ab und zu kurz von der Interruptroutine unterbrochen. Man muss aller-
dings ständig aus der Hauptschleife eine Funktion aufrufen, die überprüft ob die ange-
forderten Daten vom Slave empfangen worden sind, oder evtl. ein Fehler aufgetreten
ist. Ist das der Fall, ruft diese Funktion automatisch zuvor eingestellte Event Handler
Funktionen auf und man kann die empfangenen Daten weiterverarbeiten und ggf. so-
fort weitere Daten aus anderen Registern anfordern. Jeder Request bekommt dabei
eine ID, damit man diese auch zuordnen kann.
void task_I2CTWI(void)
Dies ist die Funktion die ständig aus der Hauptschleife aufgerufen werden muss. Sie
überprüft ob der Transfer komplett fehlerfrei abgeschlossen wurde und ruft dement-
sprechend die Event Handler auf.
- 111 -