Geschätzte Mitstreiter!
Ich habe mal wieder ein Problem, welches ich nicht alleine bewältigen
kann. Wenn ich folgenden Code-Schnipsel in einem Programm verwende,
erzeugt dieser Code das unten angehangene EEPROM-Abbild. (Dabei sei
angemerkt: F1 kann nur 0, 1 oder 2 sein, gleiches gilt für F2.
ReceivedBytes ist 10 Bytes lang und wird neunmal hintereinander, mit
unterschiedlichem AdressByte und unterschiedlichen Werten, gesendet, die
ersten drei Bytes sind eine Präambel, die vierte ist ein Adress- und
Befehls-Byte [diese Kombination habe ich mir erlaubt, weil ich niemals
256 Befehle oder Adressen brauche!])
1 | if ((receivedBytes[3] & 0x80) == 0x80) //Das sind Werte zum Speichern
|
2 | {
|
3 | uint8_t F1 = ((receivedBytes[3] >> 4) & 0x03) - 1;
|
4 | uint8_t F2 = (receivedBytes[3] & 0x03) -1;
|
5 |
|
6 | for (uint8_t i = 4; i < 10; i++)
|
7 | {
|
8 | int adr = F1 * 18 + F2 * 6 + i - 4;
|
9 | uint8_t value = receivedBytes[i];
|
10 | eeprom_update_byte(value, adr);
|
11 | }
|
12 |
|
13 | }
|
:10000000000102030405FFFFFFFFFFFFFFFFFFFFEB
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0607E1
:1000200008090A0BFFFFFFFFFFFFFFFFFFFFFFFFB6
:10003000FFFFFFFFFFFFFFFFFFFFFFFF0C0D0E0F96
:100040001011FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:10005000FFFFFFFFFFFFFFFFFFFF1213141516172F
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFF18191A1B1C1DFFFFEB
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFF1E1F20212223FFFFFFFFA7
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFF2AFFFFFFFFFFFFFFFFFFFFFFFFFF05
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FF2B2C2D2E2FFFFFFFFFFFFFFFFFFFFF2A
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
Ziel sollte aber sein, die Daten direkt hintereinander zu schreiben,
also an die Positionen 0 bis 53 (weil ja 9 * 6 - 1 = 53!) Leider gelingt
das nicht! Ich habe natürlich meine Index-Berechnung im Verdacht gehabt,
aber keinen Fehler gefunden. Daher habe ich folgendes probiert: (ich
habe an STelle des receivedBytes[i] einfach die Adresse reinschreiben
lassen)
1 | if ((receivedBytes[3] & 0x80) == 0x80) //Das sind Werte zum Speichern
|
2 | {
|
3 | uint8_t F1 = ((receivedBytes[3] >> 4) & 0x03) - 1;
|
4 | uint8_t F2 = (receivedBytes[3] & 0x03) -1;
|
5 |
|
6 | for (uint8_t i = 4; i < 10; i++)
|
7 | {
|
8 | int adr = F1 * 18 + F2 * 6 + i - 4;
|
9 | uint8_t value = receivedBytes[i];
|
10 | eeprom_update_byte(adr, adr);
|
11 | }
|
12 |
|
13 | }
|
mit folgendem, erstaunlichen Ergebnis:
:10000000000102030405060708090A0B0C0D0E0F78
:10001000101112131415161718191A1B1C1D1E1F68
:10002000202122232425262728292A2B2C2D2E2F58
:10003000303132333435FFFFFFFFFFFFFFFFFFFF9B
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
Er hat die Zahlen an die richtigen Stellen geschrieben! Warum geht das
mit adr aber nicht mit receivedBytes ????