Andy schrieb:
> Ssooo danke erstmal an Lothar!
Keine Ursache.
> Hast mich auf die richtige Spur gebracht.
Wenn immmer möglich sollte man bei der Fehlersuche das "Teile und
Herrsche" Prinzip anwenden und versuchen, das "große Problem" in
einzelne "kleine Probleme" zu zerlegen.
> Konnte den Fehler immer mehr eingrenzen.
Aber du hast ihn noch nicht gefunden, sondern einen windigen
"Workaround" gebastelt. Denn der eigentliche Fehler liegt da:
> Warum auch immer geht die Bit-Manipulation nicht in der Zeile:
1 | spi_transfer((unsigned char) data_schreiben>>8);
|
Das würde ich an deiner Stelle genauer anschauen. Du lernst dabei fürs
Leben ;-)
> geht die Bit-Manipulation nicht
Klar, denn der Compiler beachtet keine Whitespaces bzw. die
Textformatierung. Wenn du mit dem Leerzeichen im Code:
1 | (unsigned char) data_schreiben>>8
|
auch gern das gehabt hättest:
1 | (unsigned char) (data_schreiben>>8)
|
also: zuerst wird geschoben und dann abgeschnitten,
sieht der Compiler trotzdem das:
1 | ((unsigned char)data_schreiben) >> 8
|
Merkst du was?
Hier werden zuerst die 8 "oberen" Bits von data_schreiben
abgeschnitten und dann die unteren 8 Bits rausgeschoben.
Übrig bleibt 0.
Und dass genau der selbe Code dort "funktioniert" hat:
1 | spi_transfer((unsigned char) adresse>>8);
|
liegt einfach daran, dass du bisher nur in den unteren 256 Bytes des
EEPROMs herumwerkelst und die "oberen Bits" sowieso 0 sind.
Also mach mal das, dann geht es auch mit dem Code ganz oben:
1 | spi_transfer((unsigned char)(adresse>>8));
|
2 | ...
|
3 | spi_transfer((unsigned char)(data_schreiben>>8));
|
Stichwort dazu: Priorität von Operanden und Casts.