So auf Anhieb sieht's ganz ok aus.
Für die letzte Adresse des EEPROMs gibt's das Define E2END (avr/io.h):
if ((uint16_t) adress <= E2END+1-sizeof(Messung)) {...}
Der Cast auf einen Pointer wechselt nur den Typ, der Wert als ganze Zahl betrachtet bleibt gleich.
case 7:
(uint16_t)(Messung*)0x02 ist nicht die "Breite" der Struktur, es ist 2 und der Ort für die erste Messung. (0x02 = sizeof(void*), d.h. vor der ersten Messung steht irgendein Pointer).
Mit EEPROM-Adresse 0 hatte ich schon mal Probleme, im Wiki hab ich in den AVR-Errata was dazu geschrieben.
Lesezeichen