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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.