Und Kommando zurück....
Die TWI-Kommunikation ist in der Tat in Ordnung, aber der Zahlenmüll, der beim Master rauskommt, wird beim Slave schon genauso reingeschrieben. Hatte vorher im Slave zu optimistisch getestet und deswegen angenommen, es gingen die richtigen Zahlen raus.
Also jetzt das neue Problem, immerhin schärfer eingegrenzt:
Diese Struktur:
soll mit dieser Funktion:Code:volatile struct { unsigned char kp_pitch; unsigned char tn_pitch; unsigned char tv_pitch; unsigned char kp_roll; unsigned char tn_roll; unsigned char tv_roll; } parameters_ctrl;
über den TWI-Bus gesendet werden. Das Problem ist jetzt, die Struktur byteweise auf den Bus zu schaufeln. Da mir keine andere Methode eingefallen ist, die Struktur durchzu"iterieren", versuche ich das über Zeiger zu erreichen. Also nehme ich die Basisadresse "&name" und addiere in der Schleife die Zahlvariable. Dummerweise muß man dabei den Zeiger casten. Aber warum das ganze nicht funktioniert, sehe ich noch nicht. Sieht jemand mehr als ich?Code:ISR(SIG_2WIRE_SERIAL) { int i; ... if((TWSR&0xF8) == 0xA8) { // Slave transmitter mode: transmit parameters for(i=0;i<sizeof(parameters_ctrl);i++) { TWDR=*( (unsigned char *) ((¶meters_ctrl)+i) ); //!!!!!!!!!!!!!!!!!! if(i==3) yellow_lights(TWDR); if(i<sizeof(parameters_ctrl)-1) TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); //send TWDR else TWCR=(1<<TWINT)|(1<<TWEN); //after last byte, don't expect ack while (!(TWCR & 0x80)) { }; } TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE); //switch to receive mode } }
Danke,
Nils
PS: Die Zeile mit "yellow_lights(...)" ist mein "printf"-Debugging. Es sind acht LEDs angeschlossen, die das TWDR anzeigen. Daran sehe ich, daß das TWDR bei den jeweiligen Schleifendurchläufen nicht auf 10, 20, 30, 40, 50, 60 steht (so ist die Struktur initialisiert, das habe ich geprüft), sondern auf 10, 62, 18, 13, 128, 129.







Zitieren

Lesezeichen