Forum: Mikrocontroller und Digitale Elektronik Kurioses Verhalten bei EEPROM_UPDATE_BYTE


von ArduStemmi (Gast)


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 ????

von Karl H. (kbuchegg)


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);

von ArduStemmi (Gast)


Lesenswert?

Ich hatte befürchtet, dass es so simpel ist! Ich danke Dir herzlich!

von Karl H. (kbuchegg)


Lesenswert?

LOL
Ist ein klassischer "Egal wie oft du den Code liest, du siehst ihn nicht 
aber andere sehen ihn sofort" Fehler.
Kennen wir alle - sowas kommt vor.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.