Kurioses Verhalten bei EEPROM_UPDATE_BYTE

Gast #4346774
Lesenswert?

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 ????
#4346784
Lesenswert?

1
                eeprom_update_byte(value, adr);

die Parameterreihenfolge ist wirkich value als 1. Parameter und adr als 
2.ten?

Ohne nachgesehen zu haben, aber das würde kein Mensch so machen. Das 
wäre nicht logisch. Kontrollier nochmal, wie die Schnittstelle zu 
update_byte aussieht.
Logisch wäre:
1
                eeprom_update_byte(adr, value);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren