oberallgeier
27.09.2012, 14:37
Bitte um Hilfe oder Aufklärung.
Für eine I2C-Kommunikation teste ich meinen Code auf saubere Funktion und exakte Positionierung der verschiedenen Daten. Derzeit zwei Platinen (RNContrl - mega1284/20MHz, RNMotoContrl - m328/20MHz, I2C 100 kHz).
Ein Test besteht darin, drei Ausschnitte des übermittelten Feldes vom Slave per UART wiederholt auszugeben. Der letzte Ausschnitt sollen die letzten zehn Bytes des I2C-Puffers sein. Leider macht mein Feldpointer nicht das was ich will: die Berechnung (egal ob uint8_t oder ~16~) in der for..Schleife ist fehlerhaft.
I2C-Definition (Ausschnitt) (danke uwegw für den Slave-Code) :
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%
/**@brief Groesse des Buffers in Byte (2..254) */
#define i2c_buffer_size 127 // I2C_REG_ANZAHL 254 Hier kann eingestellt werden
// wieviele Register ausgegeben werden
//##### ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ #####
... und die Ausgaberoutine im Slave (Ausschnitt) :
// - - - - - - - - - - - - - - -
uart_puts("\t\t\t"); // Einrücken
for (uint8_t i=10; i<20; i++)
{
uart_puti(i2cdata[i]);uart_puts(" "); //uart_puts("\r\n");
} // === Ende for (uint8_t i=0; i<i2c_buffer_size...
uart_puts("\r\n"); // Neue Zeile und Leerzeile
_delay_ms( 1000);
// - - - - - - - - - - - - - - -
uart_puts("\t\t\t"); // Einrücken
for (uint8_t i=(i2c_buffer_size-10); i<i2c_buffer_size; i++)
{
uart_puti(i2cdata[i]);uart_puts(" "); //uart_puts("\r\n");
} // === Ende for (uint8_t i=0; i<i2c_buffer_size...
uart_puts("\r\n"); // Neue Zeile und Leerzeile
_delay_ms( 1000);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dabei wird für die letzte Ausgabe immer am Ende des Buffers begonnen, nicht wie ich möchte, zehn Felder davor.
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 252
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 252
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 127
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 4 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 99
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 99
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
... und das sollte eben nicht stimmen. Nur - wieso? Wo ist der Fehler?
Problem: die Berechnung
i2c_buffer_size-10
macht offenbar nicht das, was sie soll. Anm.: ich habe die for..Laufvariable mit 8bit und mit 16 getestet.
Danke im Voraus für Eure Hilfe und Aufmerksamkeit.
Für eine I2C-Kommunikation teste ich meinen Code auf saubere Funktion und exakte Positionierung der verschiedenen Daten. Derzeit zwei Platinen (RNContrl - mega1284/20MHz, RNMotoContrl - m328/20MHz, I2C 100 kHz).
Ein Test besteht darin, drei Ausschnitte des übermittelten Feldes vom Slave per UART wiederholt auszugeben. Der letzte Ausschnitt sollen die letzten zehn Bytes des I2C-Puffers sein. Leider macht mein Feldpointer nicht das was ich will: die Berechnung (egal ob uint8_t oder ~16~) in der for..Schleife ist fehlerhaft.
I2C-Definition (Ausschnitt) (danke uwegw für den Slave-Code) :
//%%%%%%%% von Benutzer konfigurierbare Einstellungen %%%%%%%%
/**@brief Groesse des Buffers in Byte (2..254) */
#define i2c_buffer_size 127 // I2C_REG_ANZAHL 254 Hier kann eingestellt werden
// wieviele Register ausgegeben werden
//##### ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ #####
... und die Ausgaberoutine im Slave (Ausschnitt) :
// - - - - - - - - - - - - - - -
uart_puts("\t\t\t"); // Einrücken
for (uint8_t i=10; i<20; i++)
{
uart_puti(i2cdata[i]);uart_puts(" "); //uart_puts("\r\n");
} // === Ende for (uint8_t i=0; i<i2c_buffer_size...
uart_puts("\r\n"); // Neue Zeile und Leerzeile
_delay_ms( 1000);
// - - - - - - - - - - - - - - -
uart_puts("\t\t\t"); // Einrücken
for (uint8_t i=(i2c_buffer_size-10); i<i2c_buffer_size; i++)
{
uart_puti(i2cdata[i]);uart_puts(" "); //uart_puts("\r\n");
} // === Ende for (uint8_t i=0; i<i2c_buffer_size...
uart_puts("\r\n"); // Neue Zeile und Leerzeile
_delay_ms( 1000);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dabei wird für die letzte Ausgabe immer am Ende des Buffers begonnen, nicht wie ich möchte, zehn Felder davor.
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 252
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 252
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
252 253 254 255 0 1 2 3 4 5
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 127
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 3 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
127 128 129 130 131 132 133 134 135 136
Nr. 4 i2cdata: 10 99 12 13 14 15 16 17 18 19
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 99
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
<0>
C501 R5MoCo_x01-x10 m328/20MHz 26Sep2012 2335
Aufbau R5MoCo, I2C-Slave ist Adresse : 130 I2C-WRITE = 0
Test I2C
I2C-Test - I2C-Slave R5MoCo_i2c10.c
Teste I2C-Slave mit Adresse : 130 Buffersize : 99
Nr. 1 i2cdata: 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
Nr. 2 i2cdata: 10 99 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
99 100 101 102 103 104 105 106 107 108
... und das sollte eben nicht stimmen. Nur - wieso? Wo ist der Fehler?
Problem: die Berechnung
i2c_buffer_size-10
macht offenbar nicht das, was sie soll. Anm.: ich habe die for..Laufvariable mit 8bit und mit 16 getestet.
Danke im Voraus für Eure Hilfe und Aufmerksamkeit.